将emscripten Webassembly线程C ++与webpackcreate-react-app结合使用

问题描述

我有一个emscripten / webassembly包装的C ++类,该类在内部启动并使用pthread。在独立开发沙盒中的Chrome上的javascript中使用时,通常效果很好。但是,我无法真正将其与create-react-app和webpack配合使用(即,我使用react-app-rewired来配置webpack)。

问题似乎出在线程化脚本构建所创建的javascript和wasm文件的复杂性,以及由于webpack产生的文件重命名而导致这些脚本的混乱。为多线程Emscipten构建生成文件为:

MyModule.js
MyModule.wasm
MyModule.worker.js

(我认为)我可以通过使用MyModule.js的{​​使它在非MyModule.wasmModule文件的非线程模式下工作。 {1}}方法。但是,由于引入了新的locateFile文件,而MyModule.worker.js文件是在WebWorker中自行启动的,因此系统感到非常困惑。当然,MyModule.js文件还需要找到并获得对MyModule.worker.js的访问权限,并且也会丢失(即由于webpack重命名而找不到正确的文件名)。

无论如何,我已经花了数小时在网络上搜索任何成功的用例,并尝试了一些事情,包括手动编辑MyModule.wasmMyModule.js文件,但到目前为止没有任何运气。

是否有人成功尝试过类似的方法,或者是否有任何其他建议来使多线程emscripten / wasm构建与webpack(或create-react-app)一起正常运行?任何建议将不胜感激。

注意:这个问题不是关于在Web工作者线程中运行emscripten / webassembly模块的(尽管最后我将在Web工作者中运行所有这些)。它专门针对多线程Emscripten构建(即带有pthread的C ++)启动并与webpack一起正常运行。

解决方法

在 Module 的 locateFile 中,您应该返回 MyModule.wasm 和 MyModule.worker.js 的正确路径。 此外,在 Module 的 mainScriptUrlOrBlob 中,您应该为 MyModule.js 分配路径。 在 worker 中使用 mainScriptUrlOrBlob 来加载 wasm。