You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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生成逻辑强相关。

疑似问题代码

手动检查生成的文件,怀疑问题出在两处:

  1. penguin_app.js中的Worker创建代码:
    worker = new Worker(new URL('./penguin_app.worker.js', import.meta.url));
    
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 22:52:53