Hi!这里是JustHappy,打包构建工具相信大家都再熟悉不过了,但是每个打包工具各有所长,那我们就简单聊聊目前市面上常见的部分前端构建工具吧,或许对你有帮助
Webpack --- 从模块依赖到静态资源
Webpack 是最早一批流行起来的前端打包构建工具,可以说是"祖师爷"级别的存在。正是因为它的历史悠久,Webpack 目前拥有最为成熟和丰富的插件生态。
Webpack 的核心概念:Loader 和 Plugin
Webpack 的生态主要由 Loader 和 Plugin 组成,了解它们的作用对于更好地使用 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
-
依赖预构建:
在开发过程中,Vite 使用 esbuild 来预构建依赖项,并缓存结果,以加快服务器启动速度。这一过程使得 Vite 能够处理 CommonJS 和 UMD 代码,因为它们被转换为原生 ESM 模块
-
构建配置:
在
vite.config.js
中,开发者可以通过rollupOptions
配置项来处理 CommonJS 模块。默认情况下,Vite 会启用@rollup/plugin-commonjs
插件,该插件负责将 CommonJS 模块转换为 ESM 格式 -
插件支持:
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 的组合已经相当有效,但仍然存在一些挑战:
-
性能瓶颈:虽然 Esbuild 在开发环境中表现出色,但在生产环境中,Rollup 的性能可能不如 Esbuild,尤其是在处理大型项目时。
-
功能限制:Esbuild 在某些高级功能(如代码分割和插件扩展)上不如 Rollup 灵活,而 Rollup 在开发环境中的性能又不如 Esbuild。
-
生态系统兼容性: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 的特点
- 更快的构建速度:Rust 的并发能力提升了打包性能。
- 与 Webpack 兼容:可以无缝迁移 Webpack 配置。
- 完整插件体系:支持 Webpack 的 Loader 和 Plugin。
Rspack 和 Vite 的区别?
- Vite 适用于 ESM 生态,适合现代前端框架(Vue、React)。
- Rspack 适用于 Webpack 生态,可以直接替换 Webpack 进行升级。
结语
这是这些工具简单的总结吧,总之这些工具的出现都是需求推动的,有什么样的需求咱就使用什么样的工具!一切以实际情况出发!
工具 | 生态 | 速度 | 适用场景 |
---|---|---|---|
Webpack | 最成熟 | 慢 | 传统项目,大型企业级应用 |
Vite | 现代化,Vue/React 优先 | 快 | 现代前端开发,适合 ESM 生态 |
Rolldown | 未来 Rollup 替代者 | 快 | 可能成为 Vite 的核心打包工具 |
Rspack | Webpack 兼容 | 很快 | 需要 Webpack 生态但想提升性能的项目 |
希望对大家有所帮助,也希望前端工具链可以早日实现统一!!!!
如果文章有什么问题,欢迎评论区留言💗