「工具链🛠️」Webpack、Vite、Rollup、Rspack我***到底怎么选?(为啥前端构建工具会分化成这样!)

Hi!这里是JustHappy,打包构建工具相信大家都再熟悉不过了,但是每个打包工具各有所长,那我们就简单聊聊目前市面上常见的部分前端构建工具吧,或许对你有帮助

Webpack --- 从模块依赖到静态资源

Webpack 是最早一批流行起来的前端打包构建工具,可以说是"祖师爷"级别的存在。正是因为它的历史悠久,Webpack 目前拥有最为成熟和丰富的插件生态。

Webpack 的核心概念:LoaderPlugin

Webpack 的生态主要由 LoaderPlugin 组成,了解它们的作用对于更好地使用 Webpack 十分重要。

Webpack与其他的打包构建工具有一个特别的地方,其生态是有Loader和Plugin两类的,我们需要清楚的了解这两类的区别,主要是定义上的

  • Loader:让 Webpack 能够处理其他类型的文件(如 Vue、TypeScript),并将它们转换为有效模块。
  • Plugin:用于执行更广泛的任务,如优化、资源管理等。

Loader

按照官方文档的说法:loader 让 webpack 能够去处理其他类型 的文件,并将它们转换为有效 模块,以供应用程序使用,以及被添加到依赖图中。

什么是"其他类型的文件"?

在前端开发中,除了常见的 JavaScript 文件外,我们还会使用各种其他类型的资源,比如:

  • 样式文件:CSS、SCSS、LESS 等。
  • 模板文件:Vue 单文件组件(.vue)、React JSX 等。
  • 图片和字体:PNG、JPEG、SVG、TTF 等。
  • 数据文件:JSON、XML 等。

例如,在基于 Webpack 的项目中使用 Vue 时,我们需要 ​Vue-loader 来处理 .vue 文件,将其转换为 JavaScript 模块。同样地,处理 CSS 文件需要 ​CSS-loader 和 ​Style-loader ,处理图片可能需要 ​file-loader 或 ​url-loader

Plugin

Plugin​(插件)则用于执行更广泛的任务,如优化打包结果、管理资源、注入环境变量等。与 Loader 不同,Plugin 可以作用于整个打包过程,而不仅仅是文件的转换。

Plugin 大体上有以下四类
  • 优化打包结果:压缩代码、移除未使用的代码(Tree Shaking)。
  • 资源管理:生成 HTML 文件并自动注入打包后的脚本、样式。
  • 环境变量注入:在打包过程中注入环境变量,方便区分开发与生产环境。
  • 性能监控:分析打包性能,生成打包报告。

webpack纵横前端世界10多年,但是相信你也和我一样感觉到他太慢了!尤其是对大型项目而言,于是乎那个男人又出手了!

Vite - 下一代的前端工具链

Vite 是由 Vue 的作者 Evan You 在 2020 年推出的一款新的前端构建工具,其slogan就是"下一代的前端工具链",从2020年开源以来到现在也快5年了,在3年前你可以说Vite的生态还不太成熟,但是今天,Vite已经成长为可以撼动Webpack地位的一个构建工具了,5年时间,也算是"又快又稳"的"老司机"了

更快的打包速度

Vite 和传统的打包构建工具(如 Webpack)在设计理念上有所不同,它通过现代浏览器对 ES 模块的原生支持,采用按需编译模块热替换(HMR)​等技术,实现了极快的开发服务器启动速度和模块更新速度。Vite 并不完全依赖插件生态来处理不同类型的文件,而是通过内置的处理机制和插件系统来扩展功能。

为什么会更快呢?

按需加载和模块热替换

Vite 利用浏览器对 ES 模块的原生支持,在开发过程中,服务器只处理被请求的模块,而不是整个应用。这大大减少了初始服务器启动时间,并且在代码变更时,只重新编译变更的模块,极大提升了 HMR 的速度。

预构建依赖

Vite 会预构建第三方的依赖(如 node_modules 中的库),以优化对这些依赖的开发体验。这意味着这些依赖会被转换为更适合开发环境的格式,从而加快开发服务器的启动和 HMR 的速度。

Common JS的支持性

我们知道Vite默认情况下是只适用ESM的,那么webpack时代庞大的commonjs插件生态就没用了吗?不是的 Vite主要通过这三种方式将CJS转为ESM从而在保证最终产物为ESM的情况下支持Common JS

  1. 依赖预构建

    在开发过程中,Vite 使用 esbuild 来预构建依赖项,并缓存结果,以加快服务器启动速度。这一过程使得 Vite 能够处理 CommonJS 和 UMD 代码,因为它们被转换为原生 ESM 模块

  2. 构建配置

    vite.config.js 中,开发者可以通过 rollupOptions 配置项来处理 CommonJS 模块。默认情况下,Vite 会启用 @rollup/plugin-commonjs 插件,该插件负责将 CommonJS 模块转换为 ESM 格式

  3. 插件支持

    vite-plugin-commonjs 是一个用于 Vite 的插件,它可以将 CommonJS 模块转换为 ES Modules ,从而使 Vite 能够正常解析和打包这些模块。开发者可以在 vite.config.js 中引入并使用该插件,以无缝集成 CommonJS 模块

Vite使用Rollup进行最终产物的打包构建

有关Rollup的介绍可以查看这篇# Rollup是什么?卷起来!🌮🌮(简单用例带你上手现代 JavaScript 打包工具)

Esbuild + Rollup ?这俩打配合不好吗?

Vite是如何实现开发环境和生产环境的统一呢?答案就是其在开发环境使用了Esbuild实现了高性能的hmr,在生产环境(浏览器中)Vite 使用 Rollup 进行最终产物的打包和优化,通过这种合理的分工,Vite 实现了开发环境和生产环境的统一(都是ESM)

那么,这就是最终的解决方案吗?我们为什么需要Rolldown?

尽管 Esbuild 和 Rollup 的组合已经相当有效,但仍然存在一些挑战:

  1. 性能瓶颈:虽然 Esbuild 在开发环境中表现出色,但在生产环境中,Rollup 的性能可能不如 Esbuild,尤其是在处理大型项目时。

  2. 功能限制:Esbuild 在某些高级功能(如代码分割和插件扩展)上不如 Rollup 灵活,而 Rollup 在开发环境中的性能又不如 Esbuild。

  3. 生态系统兼容性:Vite 需要同时支持 Esbuild 和 Rollup 的生态系统,这可能导致一些复杂性和不一致性。

我们可以看到即使是 Vite + Rollup 组合,也并非完美。随着项目规模的增长,性能仍然会遇到瓶颈。这时,Rust 语言的打包工具 Rolldown 出现了。

Rolldown - 基于Rust的快速的 JavaScript 打包器

Rolldown 旨在提供与 Rollup 兼容的 API 和插件体系,同时具备接近 Esbuild 的性能,未来可能会成为 Vite 的核心打包工具,可以简单的理解为Esbuild和Rollup融合体

Rolldown 的优势

  • 性能提升:Rolldown 是基于 Rust 编写的,旨在提供接近 Esbuild 的性能,同时具备 Rollup 的功能。这使得它在开发和生产环境中都能提供高效的构建体验。

  • 统一的构建工具:Rolldown 提供与 Rollup 兼容的 API 和插件接口,这意味着开发者可以无缝过渡到 Rolldown,而无需大幅修改现有的构建配置。

  • 未来发展的潜力:作为 Vite 的下一代打包器,Rolldown 有望在未来成为 Vite 的核心组件,进一步优化开发和工作流程。

但 Rolldown 仍然在发展中,目前生态尚未完全成熟。

Rspack - 基于 Rust 的高性能 Web 打包工具?或者也会异军突起?

难道在新兴前端构建工具中只有Vite一枝独秀吗?Rspack或许也是一个不错的选择

Rspack 由字节跳动开源,基于 Rust 开发,与 Webpack 兼容。它的目标是 提供 Webpack 生态的高性能替代方案

Rspack 的特点

  1. 更快的构建速度:Rust 的并发能力提升了打包性能。
  2. 与 Webpack 兼容:可以无缝迁移 Webpack 配置。
  3. 完整插件体系:支持 Webpack 的 Loader 和 Plugin。

Rspack 和 Vite 的区别?

  • Vite 适用于 ESM 生态,适合现代前端框架(Vue、React)。
  • Rspack 适用于 Webpack 生态,可以直接替换 Webpack 进行升级。

结语

这是这些工具简单的总结吧,总之这些工具的出现都是需求推动的,有什么样的需求咱就使用什么样的工具!一切以实际情况出发!

工具 生态 速度 适用场景
Webpack 最成熟 传统项目,大型企业级应用
Vite 现代化,Vue/React 优先 现代前端开发,适合 ESM 生态
Rolldown 未来 Rollup 替代者 可能成为 Vite 的核心打包工具
Rspack Webpack 兼容 很快 需要 Webpack 生态但想提升性能的项目

希望对大家有所帮助,也希望前端工具链可以早日实现统一!!!!

如果文章有什么问题,欢迎评论区留言💗

相关推荐
大土豆的bug记录4 小时前
鸿蒙进行视频上传,使用 request.uploadFile方法
开发语言·前端·华为·arkts·鸿蒙·arkui
数据潜水员4 小时前
跨域,前端
node.js
maybe02094 小时前
前端表格数据导出Excel文件方法,列自适应宽度、增加合计、自定义文件名称
前端·javascript·excel·js·大前端
HBR666_4 小时前
菜单(路由)权限&按钮权限&路由进度条
前端·vue
A-Kamen4 小时前
深入理解 HTML5 Web Workers:提升网页性能的关键技术解析
前端·html·html5
锋小张6 小时前
a-date-picker 格式化日期格式 YYYY-MM-DD HH:mm:ss
前端·javascript·vue.js
鱼樱前端6 小时前
前端模块化开发标准全面解析--ESM获得绝杀
前端·javascript
yanlele6 小时前
前端面试第 75 期 - 前端质量问题专题(11 道题)
前端·javascript·面试
就是有点傻7 小时前
C#中Interlocked.Exchange的作用
java·javascript·c#
前端菜鸟日常7 小时前
EJS缓存解决多页面相同闪动问题
前端框架·node.js