在过去的几个月里,我们一直在为插件 JavaScript 代码开发一个新的构建系统。这将使插件与我们在 2025 年 7 月对主题构建系统所做的更改保持同步,这些更改依赖于更现代的浏览器技术和 JS 构建工具。
此更改在很大程度上是向后兼容的。大多数插件作者无需执行任何操作。 ![]()
优势
除了幕后现代化之外,此更改还将为 Discourse 开发者和托管商带来一些功能上的好处:
-
插件资产被大量缓存,并且是按插件单独键控的。这意味着在开发中重启服务器无需从头开始重新构建所有插件。
-
我们可以开始将流行插件的预编译代码包含在我们现有的资产包中。在重建期间,只需要构建更改/新的插件。这对资源受限的机器尤其有用。
-
插件代码将被转译为原生的 ES 模块。这带来了更简洁的语法、浏览器中更快的执行速度,并为未来使用
import()等功能进行捆绑分割解锁了可能性。
测试/时间表
我们已经对该系统进行了内部测试一段时间,并验证了其在数百个官方插件上的功能。Meta 已经使用新系统运行了数周。
如果您想自己试用,可以设置环境变量 ROLLUP_PLUGIN_COMPILER=1。
我们计划很快更改默认设置。会有一个短暂的时期,可以通过 ROLLUP_PLUGIN_COMPILER=0 禁用新系统,以防出现任何意外情况,但我们打算将过渡期保持在最短。
复杂插件的潜在问题
对于更复杂的插件,新系统更严格地要求以下几点:
-
从非管理代码导入管理模块现在将引发异常。这以前一直不被推荐,并且会引起令人费解的错误。现在它被更明确地检测和阻止。
如果您遇到此问题,应考虑您的插件代码是否最好位于管理 JS 目录(
admin/assets/javascripts/...)中。如果您确实需要有条件地导入管理模块,则应使用核心的optionalRequire帮助函数来实现。 -
跨插件导入仍然受支持。但是,与管理模块类似,导入未安装/启用的插件中的模块现在将引发一个更加明显的错误。如果跨插件依赖项应为可选的,则应使用核心的
optionalRequire帮助函数。 -
细微的时间变化在罕见的情况下可能会导致问题。现在插件代码正在被编译成原生的 ES 模块,模块范围内的任何内容都将被急切地运行。如果您在模块范围内有任何不寻常的逻辑,可能需要将其移至运行时代码中(例如,在类构造函数内部或类似位置)。
如果您遇到这些问题中的任何一个,并且需要帮助解决它们,请随时在下方发帖。