本节内容派生于以下链接指向的内容 ,并遵守 CC BY 4.0 许可证的规定。
以下内容如果没有特殊声明,可以认为都是基于原内容的修改和删减后的结果。
Rspack 提供了对 Web Workers 的内置支持,这意味着你不需要任何的 Loader 就可以直接使用 Web Workers。
基本的 Worker 创建语法:
通过 name
属性可以自定义 Worker 的 chunk 名称(需要属性值可被静态分析),此名称会替换生成的 chunk 文件名中的 [name]
占位符:
选择该语法的原因在于其具备良好的标准兼容性,它基于标准的 ECMAScript 模块规范,即使在没有构建工具的环境中也能正常运行。例如,它可以直接在支持 ES modules 的现代浏览器中执行。
除 new Worker()
以外,Rspack 还默认支持以下语法:
new SharedWorker()
,详见 SharedWorker。import { Worker } from "node:worker_threads"
:常用于 Node.js 环境,详见 Worker threads。navigator.serviceWorker.register()
:用于注册 Service Worker,详见 ServiceWorkerContainer。如需支持更多自定义语法,可通过 module.parser.javascript.worker
配置实现。
使用示例可参考:
需要注意的是 new Worker
也可以接受一个 URL 的字符串表示,但在 Rspack 中只支持传入 URL。
Rspack 不支持在 new Worker
中使用变量。例如,以下代码将不起作用:
这是因为 Rspack 无法静态分析该语法。在 Rspack 中使用 Worker 语法时,请务必注意此限制。
目前不支持 /* webpackEntryOptions: { filename: "workers/[name].js" } */
魔法注释。
worker-loader
仅作为项目迁移到 Rspack 的临时便捷方案,推荐使用 new Worker()
语法。
Rspack 也支持了 worker-loader,不过由于 worker-loader 已不再维护,请使用 worker-rspack-loader 进行替换。
使用 resolveLoader 替换 worker-loader 为 worker-rspack-loader: