Vite React+Emscripten多线程Web Workers构建失败求助
Vite React + Emscripten多线程生产构建失败
我正在搭建基于Vite React + Emscripten编译C++代码的项目,启用Web Workers多线程功能。npm run dev开发构建完全正常,但执行npm run build生产构建时失败。
报错信息
Error: Unexpected early exit. This happens when Promises returned by plugins cannot resolve. Unfinished hook action(s) on exit: (vite:worker-import-meta-url) transform "path/to/src/utils/penguin_app.js" at process.handleBeforeExit (file:///path/to/node_modules/rollup/dist/es/shared/node-entry.js:25670:28) at Object.onceWrapper (node:events:628:26) at process.emit (node:events:513:28)
环境与配置
- Emscripten编译命令:
emcc -lembind -pthread -s MODULARIZE=1 -s EXPORT_ES6=1 --no-entry -o penguin_app.js libs/cat/cats.cpp libs/penguin/penguins.cpp - 移除
-pthread标志后,仅生成.js和.wasm文件时构建正常,说明问题和多线程Worker生成逻辑强相关。
疑似问题代码
手动检查生成的文件,怀疑问题出在两处:
penguin_app.js中的Worker创建代码:worker = new Worker(new URL('./penguin_app.worker.js', import.meta.url));penguin_app.worker.js中的导入逻辑:(e.data.urlOrBlob ? import(e.data.urlOrBlob) : import('./penguin_app.js')) .then(exports => exports.default(Module));
删除任意一行都能完成构建,但会导致WASM文件无法正常加载,且这两段代码本身符合Emscripten多线程的常规写法,不确定问题根源。
已尝试的解决方案
- 调整Vite的
optimizeDeps配置,包含或排除相关.js和.worker.js文件,无效果。 - 修改文件扩展名,将
.worker.js改为.worker.cjs,.js改为.mjs,无效。 - 查阅过相关的Vite问题记录,但不清楚如何适配到当前场景。
- 了解WebPack的解决方案,但更希望找到Vite专属的配置方法。
目前完全陷入困境,求任何排查方向或可行的配置建议。
内容的提问来源于stack exchange,提问作者Meowfueille
相关产品推荐
相关产品推荐

