我有一个应用程序,它使用网络工作人员来帮助与其他工作人员一起进行一些计算。它抛出的错误本质上是抱怨它期望的数据不存在,因为计算没有被计算。
计算是在网络工作者运行的情况下在本地执行的,但在产品中我几乎不知道为什么它不起作用。
需要注意的一件事是,因为我需要导入某些函数的上下文(在工作上下文之外定义),所以我遵循了此处建议的建议:(在 React 中创建一个 Web Worker)并将其串入首先把它变成一个斑点。
`
export const buildBlobUrlFromCode = (code) => {
// returns a DOMString that links context to the code within the blob
code = code.substring(code.indexOf("{") + 1, code.lastIndexOf("}"));
const blob = new Blob([code], { type: "application/javascript" });
return URL.createObjectURL(blob);
}
export class WebWorker {
constructor(worker) {
let code = worker.toString();
// const blobUrl = strDecoratedBuildBlobUrlFromCode(code);
const blobUrl = buildBlobUrlFromCode(code);
return new Worker(blobUrl);
}
}
我如何使用上面的代码是:
const workerInstance = new WebWorker(MyWorker);
其中
MyWorker
是导出的 fn,定义了 onmessage
并在内部定义了所有操作。
我添加了一些日志,本质上是当我开始计算时代码中断:
workerInstance.postMessage([data]);
还需要注意的是,我正在使用react-create-app来构建我的应用程序,并且我还没有弹出,因此webpack配置未受影响。
此外,这些工作人员的源文件在部署时完全是空白的,但在本地已填充(如我可以在worker.js 文件中看到实际代码)
我在以这种方式创建网络工作者时遇到了完全相同的问题。这个方法对我有用,而不是创建斑点:
应用程序.js
const myWorker = new Worker(/* webpackChunkName: "myWorker" */ new URL('./myWorker.js', import.meta.url))
myWorker.js
self.onmessage = (event) => {}
我们一直在努力解决类似的问题,我们发现以下内容......
我们还使用 Webpack,重要的是,它的生产配置使代码变得丑陋。在此过程中,我们发现 onmessage 函数变量被丢弃,因为它没有在其他地方被调用。这解释了为什么在生产构建工作实例中看不到任何代码。
我们还发现了另一个潜在的陷阱,即丑化过程将所有变量名称更改为单个字符。这个过程也会使 onmessage 函数变得无用。
要解决这个问题,不要声明变量 onmessage,而是将 onmessage 分配给全局对象 (
this
)
this.onmessage = (event) => {}
这样丑化并没有丢弃代码,函数名称也没有改变。
我知道这已经晚了,但希望它有帮助。