跳到主要内容

认识

2024年11月08日
柏拉文
越努力,越幸运

一、认识


Rspack 是一个基于 Rust 编写的高性能 JavaScript 打包工具, 它提供对 Webpack 生态良好的兼容性,能够无缝替换 Webpack, 并提供闪电般的构建速度。

二、特点


三、问题


3.1 RsPack Vs Vite?

Vite 提供了很好的开发者体验,但 Vite 在生产构建中依赖了 Rollup ,因此与其他基于 JavaScript 的工具链一样,面临着生产环境的构建性能问题。

另外,Rollup 相较于 Webpack 做了一些平衡取舍,在这里同样适用。比如,Rollup 缺失了 Webpack 对于拆包的灵活性,即缺失了 optimization.splitChunks 提供的很多功能。

3.2 RsPack Vs Rollup?

RspackRollup 虽然都是打包工具,但是两者的侧重领域不同,Rollup 更适合用于打包库,而 Rspack 适合用于打包应用。因此 Rspack 对打包应用进行了很多优化,如 HMRBundle splitting 等功能,而 Rollup 则比 Rspack 的编译产物对库更为友好,如更好的 ESM 产物支持。 社区上也有很多的工具在 Rollup 基础上进行了一定的封装,提供了对应用打包更友好的支持,如 vitewmr, 目前 RspackRollup 有更好的生产环境构建性能。

3.3 RsPack Vs Esbuild?

我们在内部进行过大规模地将 esbuild 作为通用的 Web App 构建工具的实践,但是遇到如下一些问题:

  1. 缺乏对 JavaScript HMR 和增量编译的良好支持,这导致大型项目中的 HMR 性能较差。

  2. 拆包策略也非常原始,难以满足业务复杂多变的拆包优化需求。

3.4 RsPack Vs Webpack?

Webpack 是目前最为成熟的构建工具,有着活跃的生态,灵活的配置和丰富的功能,但是其最为人诟病的是其性能问题,尤其在一些大型项目上,构建花费的时间可能会达到几分钟甚至几十分钟,性能问题是目前 Webpack 最大的短板。因此 Rspack 解决的问题核心就是 Webpack 的性能问题。 RspackWebpack 快得益于如下几方面:

  1. Rust 语言优势: Rspack 使用 Rust 语言编写, 得益于 Rust 的高性能编译器支持, Rust 编译生成的 Native Code 通常比 JavaScript 性能更为高效。

  2. 高度并行的架构: Webpack 受限于 JavaScript 对多线程的羸弱支持,导致其很难进行高度的并行化计算,而得益于 Rust 语言的并行化的良好支持, Rspack 采用了高度并行化的架构,如模块图生成,代码生成等阶段,都是采用多线程并行执行,这使得其编译性能随着 CPU 核心数的增长而增长,充分挖掘 CPU 的多核优势。

  3. 内置大部分的功能: 事实上 Webpack 本身的性能足够高效,但是因为 Webpack 本身内置了较少的功能,这使得我们在使用 Webpack 做现代 Web App 开发时,通常需要配合很多的 pluginloader 进行使用,而这些 loaderplugin 往往是性能的瓶颈,而 Rspack 虽然支持 loaderplugin,但是保证绝大部分常用功能都内置在 Rspack 内,从而减小 JS plugin | loader 导致的低性能和通信开销问题。

  4. 增量编译: 尽管 Rspack 的全量编译足够高效,但是当项目庞大时,全量的编译仍然难以满足 HMR 的性能要求,因此在 HMR 阶段,我们采用的是更为高效的增量编译策略,从而保证,无论你的项目多大,其 HMR 的开销总是控制在合理范围内。