2023 年 3 月 6 日
今天,我们非常激动地宣布 Rspack 正式发布!Rspack 是一个由字节跳动 Web Infra 团队开发的基于 Rust 的 JavaScript 捆绑器,它具有高性能、与 webpack 互操作性、灵活的配置等功能。Rspack 已经解决了我们场景中的许多问题,并改善了 JavaScript 工程师的开发体验。为了帮助更多人参与到这个令人兴奋的项目中,我们决定开源这个项目。欢迎您创建 pull request 或 issue。
字节跳动内部有许多大型 JavaScript 应用程序。它们具有非常复杂的构建配置/脚本,可能需要 10 分钟到半小时才能完成构建。我们尝试过许多方法来提高构建性能,但世界上现有的所有解决方案在解决其中一些问题的同时,也导致了其他问题。经过大量的努力,我们了解到捆绑器所需的条件是:
npm run dev
是开发人员每天都会运行的脚本,可能需要运行很多次。将它们从 10 分钟降至 1 分钟的成本,对开发人员来说确实是一件很省时的事情。npm run build
在 CI/CD 环境中很常见,它决定了发布的效率。字节跳动中的许多大型应用程序都需要 20 到 30 分钟才能构建完成。如果我们能将其缩短到 3 到 5 分钟,开发人员的效率将大大提高。综上所述,我们决定构建自己的捆绑器,也就是 Rspack
。
Rspack 项目始于大约 11 个月前。虽然它仍处于早期阶段,但它可以将应用程序的构建脚本的性能提高 5 到 10 倍。在我们完成所有优化后,指标可以更出色。
Rspack 已完成 webpack loader 的架构。这意味着您可以使用社区中的各种 loader,例如 babel-loader
、less-loader
、svgr
等等。我们计划在 Rspack 中支持 loader 的所有功能。到那时,您可以使用目前尚未支持的 loader,例如 vue-loader
。
Rspack 目前只支持内存缓存。持久化和可移植缓存将在未来添加。我们正在开发一个构建系统,它可以使缓存可以在两个设备或环境之间共享。Rspack 将帮助实现这一点。
Rspack 现在可用于字节跳动内部的所有框架,我们正在努力与社区中的所有朋友合作。与 webpack 一样,Rspack 是 JavaScript 生态系统的基础设施,这意味着框架和 Rspack 可以互相受益。
如果没有社区中各种项目的启发和支持,Rspack 今天无法发布。我们要向这些前辈表示敬意:
@rspack/html-plugin
是 html-webpack-plugin 的一个分支,用于避免 Rspack 中不支持的一些 webpack API 使用。持续构建 Rspack 将是我们的首要任务。与 webpack 相比,Rspack 仍然是一个婴儿,缺少复杂的功能。请继续向我们发送有关功能请求的反馈。我们将一步一步地完成它们。
我们很乐意在您的框架中提供一些帮助来集成 Rspack。如果您是一名维护框架的工程师,并且有兴趣尝试一下 Rspack,请与我们联系。我们还与 webpack 团队建立了合作伙伴关系。Rspack 尝试使用 Rust 优化 webpack 的性能,未来,我们将与 webpack 团队一起探索更多优化 webpack 的可能性。当 Rspack 达到一定程度的成熟度时,webpack 将尝试通过实验标志将 Rspack 集成到 webpack 中。
Rspack 已经支持了大部分的 loader API,但只有很少一部分插件 API。我们没有支持所有 API 的原因有两个。一是有些 API 对于性能不利,因此我们没有为开发人员探索它们。另一个原因是时间不足,所以您可以创建 merge request 来帮助我们。
一个高性能的插件系统正在讨论中。它可能会在某一天发布。希望它可以帮助开发人员在访问灵活的配置的同时获得更短的构建时间。
Rspack 目前是一个以性能为核心卖点的项目,未来我们会持续进行很多工作来维护这一特性,例如:完善性能观测实验室,做好性能预警;在更多场景下使用并发/多核友好的算法;开发可以跨平台共享的缓存系统;优化内存使用和消耗等。
Webpack 已经积累了非常丰富的测试用例,未来 Rspack 将会复用 Webpack 现有的测试用例以提高代码覆盖率。建立更完善的 CI 系统,并与社区项目建立 Ecosystem CI 系统,确保项目升级不会造成上游项目的断裂,以保障项目长期健康,确保测试覆盖率长期提升。