最近准备跟随若川大佬,迁移博客,由原本的Hexo,转到Rspress.
才发现发现前端打包库如此之卷,
vite还没用起来,恍惚间好像听过Turbopack等名词,Rspack又是何方神圣。
遂准备梳理一下,作为迁移到Rspress编写的第一篇文章。
前端打包库: 将前端项目中的各种资源打包整合成可以在生产环境中高效运行的代码
模块化: 依托于前端打包库 和 模块化规范,让前端编码可以拆分成多个模块
静态资源: 通过loader机制将其他资源转换为webpack可处理的资源,供程序调用
代码优化: 代码压缩 TressShaking 缓存继制(哈希值持久化缓存)
开发环境支持: 热更新(代码实时更新无需刷新页面),开发服务器(本地运行项目,请求代理)
插件: 更多扩展功能,自动生成HTML(HtmlWebpackPlugin),提取公共代码
webpack 插件 和 loader
最近发现最快的打包工具变成了Rspack
打包工具/打包库/bundler 是 前端工程化/前端脚手架 的最核心技术栈
用于将 前端项目 进行各种加工,编译打包成一个整体。
为什么打包工具会一再升级
其实我们在开发的过程中也早就体会到了,我们代发的前端项目要跑起来还是比较慢的
这是一个应用在不断的积累过程中不可避免的。
为了解决这个痛点,打包工具的升级在所难免。
现在我们有了一个新的契机
以前webpack开启本地服务,需要进行一个整体的预编译,
干了三件事, 依赖解析, 整体代码转换, 模块打包输出
拥有了浏览器对ES模块的原生支持这一机制之后,
vite可以直接开启本地服务,不做任何预编译,
随后开发者在浏览器输入localhost:3000,向vite本地服务发起请求,
vite直接调用对应模块,对模块按需编译为ES6模块,发送给浏览器,浏览器执行输出,
这个过程 无需整体进行依赖解析和优化,无需对整体代码先进行一次编译打包,
所以快的不是一点半点,快到没朋友。
但是vite依旧有自己的局限性
我们可以看到vite的提升仅仅实在本地运行的方面,
在生产构建(build)阶段,
Vite 则使用 Rollup 进行传统的模块打包,处理优化、代码分割和依赖打包等工作。
因此 Vite 的构建速度提升并不如开发速度显著。
它的构建效率依然依赖于 Rollup 的优化策略,适合中小型项目的大多数构建需求,
但对于大型项目,构建速度的提升并没有像本地开发中那样明显。
可以看到,vite在项目打包上依旧处于旧时代,这个时候我们都在期待一个新的风暴出现
随后, WebAssembly 出现了
W3C(World Wide Web Consortium,万维网联盟)又开始搞事情,
2018 年 WebAssembly (Wasm) 标准发布,使得多种编程语言(包括 Rust)可以编译成浏览器中高效运行的二进制代码。
Rust 社区率先开始支持编译到 WebAssembly,催生了一批将 Rust 与 JavaScript 结合的应用.
Rust 是一门系统编程语言,拥有极高的性能,接近 C 和 C++。
高性能和内存安全
它通过严格的内存管理和所有权系统,避免了常见的内存泄漏和数据竞争问题。
对于 JavaScript 工具链中的打包、压缩、编译等高计算需求任务,Rust 能显著加快处理速度,同时保证稳定性。
并行和多线程处理
Rust 提供了对多线程并行编程的高效支持,这对于大型 JavaScript 项目中的复杂依赖解析、增量构建等任务非常有利。
Rust 可以编译为 WebAssembly
Rust 作为 JavaScript 构建工具链中的一种常用底层语言,已被广泛用于编译、打包、转译等工具中,成为提升 JavaScript 开发体验和性能的关键技术。
Turbopack 是 Vercel 推出的下一代打包工具,其性能优于 Webpack,关键在于以下几点:
Turbopack 将 Rust 的性能优势引入构建工具,实现了比 Webpack 更快的打包速度和更灵活的增量编译方案。
Rust 编写的打包工具能够很好地应用于 JavaScript 项目,得益于以下特性:
这些特性使得 Rust 构建工具在面对大型项目时更为高效,并且能够生成与 JavaScript 兼容的输出文件,开发者可无缝集成。
Rspack 是字节跳动基于 Rust 开发的 Webpack 替代工具,结合了高性能和 Webpack 生态兼容性。其速度优势在于:
Rspack 兼具速度和兼容性优势,是更适合大型项目和需要加速构建的场景的高效选择。
| 工具 | 发布时间 | 开发者 | 加速方式 | 核心语言 | 速度表现 |
|---|---|---|---|---|---|
| Webpack | 2012年 | Tobias Koppers | - | JavaScript | 较慢 |
| Vite | 2020年 | 尤雨溪(Evan You) | ES 模块支持、按需编译 | JavaScript | 较快 |
| Turbopack | 2022年 | Vercel | 增量编译、惰性加载、Rust 性能 | Rust | 较快 |
| Rspack | 2023年 | 字节跳动 | 全面 Rust 优化、多线程并行 | Rust | 最快 |
SSG(Static Site Generator,静态站点生成器)
最常见的用法是作为内部文档生成工具,以及个人静态博客建站
一些稍复杂的文档项目,有以下痛点
构建性能。保证足够快的启动速度,带来良好的开发体验。
MDX 支持。通过 MDX,我们可以方便地复用文档片段,以及在文档中渲染自定义的 React 组件。
文档站基础能力。包括国际化、多版本支持、全文搜索、组件库文档等。
可扩展性。内置插件系统,支持通过插件 API 来扩展框架功能。
当项目越来越庞大,团队成员时常苦恼于冗长的项目启动时间,开发体验因此受到了一些负面影响,并且项目开发的时间越长,这种体验的劣化就越为明显。
如何突破现有 SSG 框架的性能瓶颈
Rspack 是一个基于 Rust 的 Bundler,内置多种性能优化手段,比如多线程并行编译、增量编译等等,相比社区传统的打包工具,有 5~10 倍的性能提升。
Markdown 编译器。对于 SSG 框架中另一大编译性能瓶颈,即Markdown 编译,我们也将这一流程 Rust 化以进一步提速,定制出 Rspress 的 Markdown 编译器(即@rspress/mdx-rs)。这款编译器相比社区的 JS 版本的编译器,有近 20 倍的性能提升
哈希值持久化缓存,回头根据知乎回答写一个
webpack优化,回头写一个(例如,HtmlWebpackPlugin)