网络工作者似乎没有在生产中工作

问题描述 投票:0回答:2

我有一个应用程序,它使用网络工作人员来帮助与其他工作人员一起进行一些计算。它抛出的错误本质上是抱怨它期望的数据不存在,因为计算没有被计算。

计算是在网络工作者运行的情况下在本地执行的,但在产品中我几乎不知道为什么它不起作用。

需要注意的一件事是,因为我需要导入某些函数的上下文(在工作上下文之外定义),所以我遵循了此处建议的建议:(在 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 文件中看到实际代码)

Heroku——破碎: On heroku (broken) -- deployed

本地——工作: On local (working) --

javascript browser web-worker
2个回答
1
投票

我在以这种方式创建网络工作者时遇到了完全相同的问题。这个方法对我有用,而不是创建斑点:

应用程序.js

const myWorker = new Worker(/* webpackChunkName: "myWorker" */ new URL('./myWorker.js', import.meta.url))

myWorker.js

self.onmessage = (event) => {}

0
投票

我们一直在努力解决类似的问题,我们发现以下内容......

我们还使用 Webpack,重要的是,它的生产配置使代码变得丑陋。在此过程中,我们发现 onmessage 函数变量被丢弃,因为它没有在其他地方被调用。这解释了为什么在生产构建工作实例中看不到任何代码。

我们还发现了另一个潜在的陷阱,即丑化过程将所有变量名称更改为单个字符。这个过程也会使 onmessage 函数变得无用。

要解决这个问题,不要声明变量 onmessage,而是将 onmessage 分配给全局对象 (

this
)

this.onmessage = (event) => {}

这样丑化并没有丢弃代码,函数名称也没有改变。

我知道这已经晚了,但希望它有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.