认识
一、认识
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?
Rspack
和 Rollup
虽然都是打包工具,但是两者的侧重领域不同,Rollup
更适合用于打包库,而 Rspack
适合用于打包应用。因此 Rspack
对打包应用进行了很多优化,如 HMR
、Bundle splitting
等功能,而 Rollup
则比 Rspack
的编译产物对库更为友好,如更好的 ESM
产物支持。 社区上也有很多的工具在 Rollup
基础上进行了一定的封装,提供了对应用打包更友好的支持,如 vite
和 wmr
, 目前 Rspack
比 Rollup
有更好的生产环境构建性能。
3.3 RsPack Vs Esbuild?
我们在内部进行过大规模地将 esbuild
作为通用的 Web App
构建工具的实践,但是遇到如下一些问题:
-
缺乏对
JavaScript HMR
和增量编译的良好支持,这导致大型项目中的HMR
性能较差。 -
拆包策略也非常原始,难以满足业务复杂多变的拆包优化需求。
3.4 RsPack Vs Webpack?
Webpack
是目前最为成熟的构建工具,有着活跃的生态,灵活的配置和丰富的功能,但是其最为人诟病的是其性能问题,尤其在一些大型项目上,构建花费的时间可能会达到几分钟甚至几十分钟,性能问题是目前 Webpack
最大的短板。因此 Rspack
解决的问题核心就是 Webpack
的性能问题。 Rspack
比 Webpack
快得益于如下几方面:
-
Rust
语言优势:Rspack
使用Rust
语言编写, 得益于Rust
的高性能编译器支持,Rust
编译生成的Native Code
通常比JavaScript
性能更为高效。 -
高度并行的架构:
Webpack
受限于JavaScript
对多线程的羸弱支持,导致其很难进行高度的并行化计算,而得益于Rust
语言的并行化的良好支持,Rspack
采用了高度并行化的架构,如模块图生成,代码生成等阶段,都是采用多线程并行执行,这使得其编译性能随着CPU
核心数的增长而增长,充分挖掘CPU
的多核优势。 -
内置大部分的功能: 事实上
Webpack
本身的性能足够高效,但是因为Webpack
本身内置了较少的功能,这使得我们在使用Webpack
做现代Web App
开发时,通常需要配合很多的plugin
和loader
进行使用,而这些loader
和plugin
往往是性能的瓶颈,而Rspack
虽然支持loader
和plugin
,但是保证绝大部分常用功能都内置在Rspack
内,从而减小JS plugin | loader
导致的低性能和通信开销问题。 -
增量编译: 尽管
Rspack
的全量编译足够高效,但是当项目庞大时,全量的编译仍然难以满足HMR
的性能要求,因此在HMR
阶段,我们采用的是更为高效的增量编译策略,从而保证,无论你的项目多大,其HMR
的开销总是控制在合理范围内。