有没有办法在webworker中加载一个类,而不仅仅是普通的javascript文件?

有没有办法在webworker中加载一个类,而不仅仅是普通的javascript文件?,javascript,class,web-worker,Javascript,Class,Web Worker,我想在webworker中加载一个文件,但它不是一个普通的javascript文件。这是一门课。因此,我们不需要将javascript文件url写入 新工人(filename.js) 我正在通过写作初始化课堂 新工作者(新类名()) 它正在读取文件并正确加载。它甚至在构造函数中显示console.log消息。但当控件移动到主文件中的postMessage方法时,它会抛出错误 我正在处理的应用程序具有非常复杂的结构。我们有一个公共模块,其中包含几个类,这些类在整个应用程序中执行一些公共功能。如果我

我想在webworker中加载一个文件,但它不是一个普通的javascript文件。这是一门课。因此,我们不需要将javascript文件url写入 新工人(filename.js)

我正在通过写作初始化课堂 新工作者(新类名())

它正在读取文件并正确加载。它甚至在构造函数中显示console.log消息。但当控件移动到主文件中的postMessage方法时,它会抛出错误

我正在处理的应用程序具有非常复杂的结构。我们有一个公共模块,其中包含几个类,这些类在整个应用程序中执行一些公共功能。如果我直接在应用程序中执行,我正在使用的功能可能会导致性能问题。因此,我将它加载到webworker中。因为它是一个类,所以我必须使用new关键字调用它。因此,不是:

var ww = new Worker(filename.js);
我在写:

var ww = new Worker(new ClassName());
现在,它调用该类,将在控制台中记录在构造函数中编写的语句,但在主文件中执行postMessage时,javascript抛出错误并停止该方法的执行

请参阅下面的代码:

mainFile.js

    var ww = new Worker(new CommonWebWorker());
        ww.postMessage('LOAD');
        ww.onmessage = function (e) {
            console.log(e.data);
    }
CommonWebWorker.js

'use strict';

class CommonWebWorker {
    constructor() {
        console.log("commonWebWorker invoked");
        this.onmessage = function (e) {
            this.postMessage((e.data === 'LOAD' ? 'Loading...' : 'Loading Error'));
        }
    }
}

module.exports = CommonWebWorker;
我希望该文件将通过WebWorker在后台加载,但实际上它正在中断并抛出下面提到的错误

获取404(未找到)


非常感谢您提供的任何帮助。

出现错误的原因是
Worker
希望URL字符串作为其第一个参数,而不是对象。因此,它将其转换为字符串,当您在大多数对象上执行此操作时,您会得到
“[object object]”“
(虽然我本来希望代码中出现
“[object CommonWebWorker]”“
,但我假设您使用的是transpiler或其他输出ES5代码的东西,这将为您提供
“[object object]”

您的主页和工作是完全不同的JavaScript环境。如果需要,您当然可以在worker中使用类,但您需要在worker中实例化它,例如:

class CommonWebWorker {
 // ...
}
new CommonWebWorker(); // To instantiate it
您的worker还可以通过从另一个JavaScript文件导入
(不久它就可以使用ES2015+模块语法),因此如果您想在多个worker中使用同一个类,您可以将其放在自己的文件中并执行以下操作:

importScripts("common-web-worker.js");
new CommonWebWorker(); // To instantiate it
一旦ES2015+语法在workersª中广泛使用,您就可以使用相关的模块标志(
newworker(“worker.js”{type:“module”})
)启动worker,并改为执行以下操作:

import CommonWebWorker from "./common-web-worker.js";
new CommonWebWorker();


大约一个月前我检查了一下,唯一支持它的浏览器是Chrome,它背后有一个
--启用实验性web平台功能的标志。但这东西变化很快…:-)

Worker()
构造函数的参数必须是URL字符串。它可以是Blob URL字符串。它不能只是某个类的实例。通常它接受脚本位置的url。我想您不能使用direct类。您可以尝试这个
新工作程序(URL.createObjectURL(new ClassName())我没有测试它…:-|