为 Discourse 核心引入新的 JS 构建系统

在过去一年成功完成了主题和插件构建系统的现代化改造后,我们现在准备在 Discourse 核心中推进类似的升级。

尽管这是对核心构建系统的全面重构,但该变更旨在完全向后兼容。Discourse 的生产环境安装不应察觉到任何变化。 预编译资源 系统将继续确保您的服务器无需自行构建核心资源。

技术栈

我们正从 ember-cli/webpack 迁移至 rolldown,这是一款基于 Rust 的 JavaScript 打包工具。Rolldown 是最新版本 Vite 的核心,因此我们身处优秀的同行之中,并与 Ember 生态系统的发展方向保持一致。

Discourse 的所有 JavaScript 代码现已构建为原生 ES 模块,这不仅提升了运行时性能,还为未来的多项优化铺平了道路。

构建性能

在开发环境中,构建速度应比之前快约 80%。在我的机器上[1],开发启动时间已从约 30 秒缩短至约 5 秒。我们预计未来性能还将进一步提升,因为构建过程中仍有部分环节依赖 Babel 等较旧的技术。

开发者体验

作为此次迁移的一部分,我们决定在开发过程中不再使用代理服务器。现在应直接针对 Rails 服务器进行开发。

bin/ember-cli -u 已被 bin/dev 取代。该命令将在 :3000 端口启动 Rails,并在后台运行 rolldown 构建。两个进程的输出日志将带有相应的前缀显示。您应在浏览器中访问 :3000:4200 将不再提供任何服务。

为便于迁移,bin/ember-cli 现已成为一个向后兼容的兼容层。它将打印帮助信息,并在 :4200 端口启动一个轻量级服务器,提示您迁移至 :3000

如果您更喜欢分别启动 Rails 和 JavaScript 构建命令,这仍然是可行的。Rails 启动命令保持不变,rolldown 打包工具仍可通过 bin/dev --only ember 以监听模式运行。

过时的构建警告

如果磁盘上当前的构建是由 rolldown 开发打包器生成的,而该打包器进程已停止运行,Rails 将抛出错误以警告您资源已过时。此规则适用于开发模式和系统测试。

如果您使用一次性构建命令(pnpm build)(如同我们在 CI 中所做的那样),则不会抛出此错误。

感谢!

此项工作得益于 Ember/Embroider 团队以及 Ember 倡议 的支持。特别感谢 @real_ate 在本项目中与我们的合作!:tada:


  1. 配备 M3 Pro 芯片的 MacBook Pro ↩︎

哇!太棒了!:raising_hands:t3: