webpack workerize-loader在编译后无法工作(react typescript)

kd3sttzy  于 2023-11-19  发布在  Webpack
关注(0)|答案(2)|浏览(201)

我创建了一个rust-wasm模块,并使用workerize-loader加载它:

  1. export const getQRCode = async (
  2. arg: string,
  3. width: number,
  4. height: number
  5. ) => {
  6. const { qrcode } = await import('uranus-qrcode');
  7. return qrcode(arg, width, height);
  8. };

字符串
然后我用worker来表示:

  1. // @ts-ignore
  2. // eslint-disable-next-line import/no-webpack-loader-syntax
  3. import qrCodeWorker from 'workerize-loader!workers/qrCodeWorker';
  4. ...
  5. const workerizeQRLoader = async () => {
  6. try {
  7. const instance = qrCodeWorker();
  8. const qr = await instance.getQRCode(href, 150, 150);
  9. setQRCode({
  10. __html: qr
  11. });
  12. } catch (e) {
  13. console.warn(e);
  14. }
  15. };
  16. ...
  17. useEffect(() => {
  18. workerizeQRLoader();
  19. // qrLoader();
  20. // eslint-disable-next-line react-hooks/exhaustive-deps
  21. }, []);
  22. ...


上面的工作在dev模式下,但编译后它说:

  1. TypeError: a.getQRCode is not a function
  2. at 8.a2ac9b2e.chunk.js:1
  3. at l (0.69608c56.chunk.js:2)
  4. at Generator._invoke (0.69608c56.chunk.js:2)
  5. at Generator.forEach.e.<computed> [as next] (0.69608c56.chunk.js:2)
  6. at r (0.69608c56.chunk.js:2)
  7. at s (0.69608c56.chunk.js:2)
  8. at 0.69608c56.chunk.js:2
  9. at new Promise (<anonymous>)
  10. at 0.69608c56.chunk.js:2
  11. at 8.a2ac9b2e.chunk.js:1


如果我将rust-wasm模块直接导入到主线程中,它就可以工作:

  1. ...
  2. const qrLoader = async () => {
  3. const { qrcode: render } = await import('uranus-qrcode');
  4. const qr = await render(href, 150, 150);
  5. setQRCode({
  6. __html: qr
  7. });
  8. };
  9. useEffect(() => {
  10. // workerizeQRLoader();
  11. qrLoader();
  12. // eslint-disable-next-line react-hooks/exhaustive-deps
  13. }, []);
  14. ...


基本上,我试图让React(Webpack和TypeScript风格)加载WebAssembly模块(又名wasm,通过Rust-Wasmbindgen创建)通过web worker。我试过workerize-loader + wasm-loader,它在开发模式下工作得很好,但一旦编译完成,原型将不会被添加到worker(怀疑这是workerize-loader中的一个bug,因为所有workerized模块的行为都是一样的)。我还尝试使用worker-loader + comlink,但是工作装载机似乎不能与wasm-loader一起工作(无法将wasm导入到worker中)。唯一的方法是通过wasm-loader将wasm加载到主线程中,然后给予多线程。threads setup基本上是一个脚本.那么有人在React TypeScript项目中成功地使用了通过Web worker加载的WebAssembly模块吗?你的设置是什么?
我还创建了一个启动项目:https://github.com/aeroxy/react-typescript-webassembly-starter.git
你可以 checkout “workerize”分支,看看它在开发模式下是如何工作的,但编译后,它抛出“不是函数”错误。

mbjcgjjk

mbjcgjjk1#

这是一个有点多的评论,但我得到了一些坏消息和好消息。执行以下命令使用node v12.16.1yarn 1.22.4

  1. git clone https://github.com/aeroxy/react-typescript-webassembly-starter.git
  2. cd react-typescript-webassembly-starter
  3. yarn # some warnings that packages need to be updated to later version
  4. yarn start # dev version works
  5. yarn build
  6. cd build
  7. npx serve

字符串
当在我的Fedora 31上打开Google Chrome 81.0.4044.113 (Official Build) (64-bit)中的构建版本时,我可以看到QR代码,控制台中没有错误。
这意味着项目中没有错误(好消息),但您的机器上的设置可能出错(坏消息),您正在使用的操作系统或其他机器特定的差异。
你可以尝试再次克隆项目,并像我一样运行命令,看看是否有效。旧版的npm在缓存包时可能会有一些问题,但现在已经修复了一段时间。不久前,你需要更改npm的存储库或使用vpn,因为它被阻止了,这也可能会给你带来麻烦。

uttx8gqw

uttx8gqw2#

现在workerize方法工作!
我最初尝试过workerize-loader + wasm-loader,它在开发模式下工作得很好,但一旦编译完成,原型将不会添加到worker中(怀疑这是workerize-loader中的bug,因为所有workerized模块的行为都是一样的)。(参见workerize-loader failed to work after compilingVersion 1.2.0 does not export function on worker instance in production mode)。升级到workerize-loader 1.2.1后,它可以在开发和生产代码中工作。
我已经更新了主存储库:https://github.com/aeroxy/react-typescript-webassembly-starter.git

相关问题