基于 Rust 的高性能 Web 构建工具
导语
Rust这几年以其高性能和可靠性正在快速占领前端基建领域,“任何能够用 Rust 实现的应用系统,最终都必将用 Rust 实现”。今年3月份,字节跳动开源了基于Rust开发的构建工具Rspack,和其他Rust构建工具如turbopack等不同的是,Rspack走了兼容webpack生态的路线,意味着业务能低成本从webpack迁移至Rspack
Rspack简介
下面引用一下Rspack官网的介绍
Rspack(读音为 /'ɑrespæk/,)是一个基于 Rust 的高性能构建引擎, 具备与 Webpack 生态系统的互操作性,可以被 Webpack 项目低成本集成,并提供更好的构建性能。
Rspack 已经完成了对 webpack 主要配置的兼容,并且适配了 webpack 的 loader 架构。目前,你已经可以在 Rspack 中无缝使用你熟悉的各种 loader,如 babel-loader、less-loader、sass-loader 等等。我们的长期目标是完整地支持 loader 特性,未来你可以在 Rspack 中使用那些更加复杂的 loader,如 vue-loader。 目前 Rspack 对缓存支持还比较简单,仅支持了内存级别的缓存,未来我们会建设更强的缓存能力,包括可迁移的持久化缓存,这将带来更大的想象空间,如在 monorepo 里不同的机器上都可以复用 Rspack 的云端缓存,提升大型项目的缓存命中率。
Webpack兼容
Webpack作为最流行的前端构建工具之一,主要原因就是其社区内丰富的Loader、Plugin生态。Rspack兼容了Webpack的主要配置,并适配了对Loader架构的支持,方便渐进式升级,从Webpack低成本迁移到Rspack。值得关注的是,Rspack的目标也不是完全兼容Webpack API,Rspack 目前仍缺失了很多的webpack 的插件Hook 以及一些API,且有些配置会影响构建产物,目前仍在补齐中,不能做到无缝切换。
与其他激进的Rust构建工具如Turbopack不同,Rspack兼容Webpack会带来部分性能损失,相比业界其他Rust构建工具也有性能差距,但性能和迁移成本的平衡也是值得大家关注的,Rspack为业界提供了一个更中庸的方案。目前Rspack团队已经和Webpack团队确立了合作关系,后续可能会探索将Rspack集成到Webpack中。
除了基于 webpack 的构建方式,Rspack还兼容基于 Rollup 的构建方式,能够满足不同应用场景的需求
Rust带来的性能提升
Rspack得益于Rust的高性能编译器支持,Rust 编译生成的 Native Code 通常比 JavaScript 性能更为高效。JavaScript的垃圾回收机制会在程序运行时不断寻找并释放不再使用的对象和变量,Rust的内存管理是通过所有权系统管理内存,并在编译时会根据一系列的规则进行检查,使得 Rust 有惊人的内存利用率。另外,Rust语言对并行化良好的支持,使得Rspack能在模块图生成、代码生成等阶段多线程并行执行,从而充分利用多核CPU的优势,大幅提升编译性能。
Rspack核心逻辑和核心插件都用了rust实现
Webpack性能瓶颈主要来自其js Plugin | Loader,而Rspack基于Rust重写了Webpack的大部分Loader和Plugin,内置了如 Typescript、JSX、CSS、CSS Modules、Sass 等常见构建能力,减小了js Plugin | Loader带来的性能问题和通信开销成本,保证了其构建速度。同时Rspack支持自定义插件和自定义Loader拓展更多能力,有很强的可插拔性和自由度。
Loader兼容
Loader | 兼容性 | 替代 | 备注。 |
---|---|---|---|
babel-loader | 兼容 | 内部使用SWC实现了babel-loader的大部分转换功能 | babel-loader对性能影响较大,请谨慎使用 |
sass-loader | 兼容 | ||
less-loader | 兼容 | ||
postcss-loader | 兼容 | ||
yaml-loader | 兼容 | ||
json-loader | 兼容 | ||
stylus-loader | 兼容 | ||
@mdx-js-loader | 兼容 | ||
@svgr/webpack | 兼容 |