前端8个构建工具发展史

Daotin 于 2024-10-25 发布 编辑

构建工具发展进程总览

从刀耕火种,到 grunt,glup 这种任务自动化工具,再到模块打包工具 webpack,rollup,再到 Parcel,Snowpack, Turbopack 现代化构建工具,再到 Esbuild,vite 等高性能构建工具。

刀耕火种

几乎没有构建工具,开发者直接编写 HTML、CSS 和 JavaScript,主要通过 js,css 压缩工具,手动压缩代码、合并文件,然后上传到服务器。

缺点:效率低下,代码难以管理,无法处理依赖关系。

Grunt 时代(2012 年左右)

grunt 是第一个流行的现代化前端构建工具。是一个基于配置的任务运行器。

功能:文件压缩、语法检查、CSS 预处理等

缺点:配置较为繁琐,构建速度较慢。

Gulp 时代(2013 年后)

gulp 是基于流的自动化构建工具。配置简单,支持同时执行多个任务。

相比于 grunt,Gulp 通过流式操作、并行任务处理、简洁代码风格和更灵活的插件体系,解决了 Grunt 速度慢、配置繁琐、扩展性弱等问题,因此在前端构建任务中逐渐取代了 Grunt,成为更高效和灵活的选择。

  1. 基于流的处理方式
  1. 更灵活的任务管理
  1. 简洁的配置与代码

Webpack 时代(2014 年后)

Webpack 取代 Gulp 成为主流构建工具的原因,主要体现在以下几个方面:

  1. 模块化打包与依赖管理
  1. 一站式构建工具
  1. 代码分割与按需加载
  1. 开发模式和热更新
  1. 树摇优化 (Tree Shaking) 和作用域提升 (Scope Hoisting)

总结:

Webpack 取代 Gulp 成为主流构建工具的主要原因在于它的模块化打包能力、强大的依赖管理、代码分割和按需加载、热更新和代码优化等现代化功能。这使得 Webpack 能够处理更加复杂的前端项目,并显著提升开发和生产效率。而 Gulp 作为任务管理工具,在处理简单的构建任务时依然适用,但对于现代大型项目和单页面应用而言,Webpack 提供了更加全面的解决方案,因此逐渐取代了 Gulp 的位置。

Rollup 时代(2015 年后)

这么看来,webpack 已经很优秀了,为什么后面又会出现 rollup?

简单来说:Rollup 不是要取代 Webpack,而是在特定场景(库的开发)下提供更好的解决方案。两者是互补关系。

虽然 Webpack 非常强大,并且在前端构建工具中占据了主导地位,但 Rollup 的出现并且得到广泛使用,是因为它解决了一些 Webpack 无法完美满足的特定需求,尤其是在构建 JavaScript 库 和模块打包方面。Rollup 主要有以下几个原因和特点,使得它即便在 Webpack 流行的情况下,仍然得以发展并获得广泛的应用:

  1. 不同的使用场景
  1. 原生支持 ES 模块
  1. 树摇优化 (Tree Shaking) 的优势

总结:

Webpack 仍然是构建复杂单页面应用(SPA)和管理大量依赖的优秀工具,它擅长处理复杂的模块依赖、动态加载、热更新等功能。

Rollup 则更适合用于构建 JavaScript 库,因其生成更小、更优化的打包文件,并且能够灵活输出多种模块格式。Rollup 的简洁性和对 ES 模块的原生支持使其在库开发中表现更好。

因此,Webpack 和 Rollup 并不是直接的替代关系,而是各自适用于不同的场景:Webpack 适合复杂的应用程序,Rollup 则专注于高效地构建轻量级的 JavaScript 库。

Parcel 时代(2017 年后)

Parcel 出现的主要原因是为了解决 Webpack 的一个突出问题:配置太复杂

// 配置对比
// Webpack 需要大量配置
module.exports = {
  entry: './src/index.js',
  output: { ... },
  module: {
    rules: [
      { test: /\.js$/, use: 'babel-loader' },
      { test: /\.css$/, use: ['style-loader', 'css-loader'] },
      // ... 更多配置
    ]
  },
  plugins: [ ... ]
};

// Parcel 几乎零配置
// 直接运行:parcel index.html

它的设计理念和特性使其成为一个“零配置”的打包工具,针对现代前端开发的痛点进行了优化。具体比如:

webpack parcel
处理常见文件类型(如图片、字体、CSS 预处理器、JSX 等)需要手动安装和配置 loader 和插件 开箱即用,内置对常见文件类型的支持,不需要手动安装和配置额外的 loader 或插件
通过配置可以实现代码拆分(Code Splitting) 内置了智能的代码拆分机制,自动将项目的依赖关系进行拆分并按需加载
热更新功能需要配置 默认支持快速的热更新,且无需额外配置
通过插件(如 Babel)处理 JavaScript 的兼容性和新特性转换,但这通常需要手动配置 内置对 ES6+、TypeScript 等现代 JavaScript 语言特性的支持,开发者不必手动设置 Babel 等工具

总结:

Parcel 的出现是为了解决开发者在使用像 Webpack 这样功能强大但配置复杂的工具时遇到的困扰。Parcel 的零配置自动依赖分析内置代码拆分快速热更新等功能,大大简化了开发者的工作流,特别是在中小型项目和原型开发中表现尤为出色。

但是,因为 webpack 生态更完善,配置更灵活,功能更强大,所以适合大型项目,而 Parcel 更适合个人项目或者小的项目。

Vite 时代(2020 年后)

Vite 出现主要是为了解决 Webpack 在开发环境下的性能问题

  1. 开发服务器启动快
  1. 热更新极快
  1. 依赖的预构建
  1. 生产环境的优化构建

简单来说:Vite 就是为了让开发者在开发时能获得更好的体验,特别是在大型项目中。

vite 的缺点:https://rolldown.rs/about

1、简单来说就是开发环境、生产环境构建机制不一致,开发环境使用 esbuild,生产环境使用 rollup。

因为开发过程中,最重要的是启动速度和模块热更新的速度,Esbuild 是用 Go 语言编写的构建工具,编译速度极快,非常适合在开发环境中提供即时响应。 但是 esbuild 的代码拆分能力不行,虽然 Esbuild 支持基础的 Tree Shaking 和代码分割,但它的设计初衷是“快速构建工具”,因此在生产级优化上并没有进行深入的配置,不能像 Rollup 那样细致地进行模块合并和优化。 另外,Esbuild 的插件系统相对简单,还在逐步完善中。虽然适合基础开发需求,但在复杂的生产环境构建中,Esbuild 可能难以满足对插件的高度自定义需求。

2、开发环境,由于 vite 使用非打包机制(即模块按需加载),如果模块个数很多,比如 3000 个,那么刷新页面的时候,就有 3000 多个请求,此时网络请求数量过多,很多请求会延迟,导致这个页面显示花了很长时间,目前无解。(有个插件 https://github.com/antfu/vite-plugin-prebundle ,尝试在开发的时候也打包,减少网络请求个数,可以尝试)

Turbopack(2022.10)

官网:https://turbo.hector.im/pack/docs

TurboPack 的推出是为了进一步提升前端构建工具的性能和开发体验,特别是为了解决 Vite 和 Webpack 在超大规模项目和复杂场景下遇到的性能瓶颈。

TurboPack 由 Vercel 团队推出,其设计目标是成为“下一个时代的超高速 JavaScript 打包器”,并在以下几个方面做出了突破和优化:

  1. 超高性能与 Rust 实现
  1. 增量构建与持久缓存
  1. 快速冷启动
  1. 模块化和插件系统
  1. 深度集成现代 JavaScript 框架
  1. 未来的 Web 性能需求
  1. 微前端和多项目支持

总结:

TurboPack 目前特别适合那些对 性能要求极高的超大型项目复杂多框架应用微前端架构以及需要持久缓存的场景,而 Vite 依然是开发体验良好、适合中小型项目的优秀工具。因此,TurboPack 的出现并非完全替代 Vite 和 Webpack,而是为特定需求提供了一个更高性能的选择。

Rspack(2024.08)

官网:https://rspack.dev/zh/guide/start/introduction

Rspack 和 turbopack 都是基于 Rust 实现的 bundler,且都发挥了 Rust 语言的优势。

与 turbopack 不同的是,Rspack 选择了对 webpack 生态兼容的路线,一方面,这些兼容可能会带来一定的性能开销,但在实际的业务落地中,我们发现对于大部分的应用来说,这些性能开销是可以接受的,另一方面,这些兼容也使得 Rspack 可以更好地与上层的框架和生态进行集成,能够实现业务的渐进式迁移。

参考:开发体验的彻底提升,从 Vite 迁移到 Rspack

还有一个Rsbuild,其实是一个精简了配置结构并有更多预置功能的 Rspack 包装,更接近 Vite 的使用方法。也就是 Rspack 对标 webpack,Rsbuild 对标 Vite。

也可以方便从 vite 迁移到 Rsbuild:https://rsbuild.dev/zh/guide/migration/vite

总结

构建工具 主要优点 主要缺点 适用场景
Grunt • 配置清晰
• 插件丰富
• 速度慢
• 配置繁琐
简单的任务自动化
Gulp • 流式处理
• 语法简单
• 不支持模块化
• 复杂项目维护难
简单的前端自动化工作流
Webpack • 模块化强大
• 生态完善
• 配置灵活
• 配置复杂
• 打包速度慢
大型应用程序开发
Rollup • 代码简洁
• Tree-shaking 优秀
• 插件较少
• 功能相对单一
类库/框架开发
Parcel • 零配置
• 使用简单
• 生态不完善
• 大型项目不适用
小型项目/原型开发
Vite • 开发速度快
• 配置简单
• 生态相对较新
• 兼容性有限
现代化 web 应用开发
Turbopack • 速度极快
• 增量编译
• 不够成熟
• 功能不完善
仍在开发中,暂不建议生产使用
Rspack • 兼容 Webpack
• 速度快
• 生态不完善
• 文档较少
需要快速构建的 Webpack 项目

选择建议