我创建了一个rust-wasm模块,并使用workerize-loader加载它:
export const getQRCode = async (
arg: string,
width: number,
height: number
) => {
const { qrcode } = await import('uranus-qrcode');
return qrcode(arg, width, height);
};
字符串
然后我用worker来表示:
// @ts-ignore
// eslint-disable-next-line import/no-webpack-loader-syntax
import qrCodeWorker from 'workerize-loader!workers/qrCodeWorker';
...
const workerizeQRLoader = async () => {
try {
const instance = qrCodeWorker();
const qr = await instance.getQRCode(href, 150, 150);
setQRCode({
__html: qr
});
} catch (e) {
console.warn(e);
}
};
...
useEffect(() => {
workerizeQRLoader();
// qrLoader();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
...
型
上面的工作在dev模式下,但编译后它说:
TypeError: a.getQRCode is not a function
at 8.a2ac9b2e.chunk.js:1
at l (0.69608c56.chunk.js:2)
at Generator._invoke (0.69608c56.chunk.js:2)
at Generator.forEach.e.<computed> [as next] (0.69608c56.chunk.js:2)
at r (0.69608c56.chunk.js:2)
at s (0.69608c56.chunk.js:2)
at 0.69608c56.chunk.js:2
at new Promise (<anonymous>)
at 0.69608c56.chunk.js:2
at 8.a2ac9b2e.chunk.js:1
型
如果我将rust-wasm模块直接导入到主线程中,它就可以工作:
...
const qrLoader = async () => {
const { qrcode: render } = await import('uranus-qrcode');
const qr = await render(href, 150, 150);
setQRCode({
__html: qr
});
};
useEffect(() => {
// workerizeQRLoader();
qrLoader();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
...
型
基本上,我试图让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”分支,看看它在开发模式下是如何工作的,但编译后,它抛出“不是函数”错误。
2条答案
按热度按时间mbjcgjjk1#
这是一个有点多的评论,但我得到了一些坏消息和好消息。执行以下命令使用
node v12.16.1
和yarn 1.22.4
:字符串
当在我的Fedora 31上打开
Google Chrome 81.0.4044.113 (Official Build) (64-bit)
中的构建版本时,我可以看到QR代码,控制台中没有错误。这意味着项目中没有错误(好消息),但您的机器上的设置可能出错(坏消息),您正在使用的操作系统或其他机器特定的差异。
你可以尝试再次克隆项目,并像我一样运行命令,看看是否有效。旧版的npm在缓存包时可能会有一些问题,但现在已经修复了一段时间。不久前,你需要更改npm的存储库或使用vpn,因为它被阻止了,这也可能会给你带来麻烦。
uttx8gqw2#
现在workerize方法工作!
我最初尝试过workerize-loader + wasm-loader,它在开发模式下工作得很好,但一旦编译完成,原型将不会添加到worker中(怀疑这是workerize-loader中的bug,因为所有workerized模块的行为都是一样的)。(参见workerize-loader failed to work after compiling和Version 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