如何在带有 React 的 Webworker 中使用本地 class?
How to use a local class in a Webworker with React?
我正在做网络工作者,想使用本地 class。 worker 是在具有(大部分)标准 Webpack 设置的 React 应用程序中创建和使用的。这是基本代码:
/* eslint-disable no-restricted-globals */
/* eslint-disable @typescript-eslint/explicit-function-return-type */
/* eslint-disable @typescript-eslint/explicit-member-accessibility */
/* eslint-disable no-eval */
class Executor {
run(code) {
let result = "";
let isError = false;
try {
result = eval(code);
if (typeof result === "object") {
result = JSON.stringify(result);
}
} catch (error) {
result = error.toString();
isError = true;
}
return [result, isError];
}
}
export default () => {
try {
const executor = new Executor();
} catch (e) {
console.log("Webworker startup error: " + e);
}
};
当我创建 webworker 时:
public componentDidMount(): void {
const code = runtime.toString();
const blob = new Blob(["(" + code + ")()"]);
this.worker = new Worker(URL.createObjectURL(blob));
this.worker.onmessage = this.handleWorkerMessages;
}
我收到错误:
Webworker startup error: ReferenceError: Executor is not defined
还需要什么才能让 webworker 认识到 class?
我还尝试将 class 放入外部文件并从那里导入它,但这只是稍微改变了错误:
Webworker startup error: ReferenceError: _ScriptingExecutor__WEBPACK_IMPORTED_MODULE_0__ is not defined
要了解发生了什么,您必须查看从导入模块生成的字符串(就在它被转换为 Blob 之前)。它仅包含默认导出代码(即匿名函数)。 class 不包括在内,因此,当您将代码加载到您的 worker 中时,它会错过 class.
因此,要么不为工作人员代码使用模块,要么使用 URL 脚本并将其提供给工作人员。
我认为如果将 Executor 放在 default 部分中它会起作用。
export default () => {
class Executor {
run(code) {
let result = "";
let isError = false;
try {
result = eval(code);
if (typeof result === "object") {
result = JSON.stringify(result);
}
} catch (error) {
result = error.toString();
isError = true;
}
return [result, isError];
}
}
try {
const executor = new Executor();
} catch (e) {
console.log("Webworker startup error: " + e);
}
};
我正在做网络工作者,想使用本地 class。 worker 是在具有(大部分)标准 Webpack 设置的 React 应用程序中创建和使用的。这是基本代码:
/* eslint-disable no-restricted-globals */
/* eslint-disable @typescript-eslint/explicit-function-return-type */
/* eslint-disable @typescript-eslint/explicit-member-accessibility */
/* eslint-disable no-eval */
class Executor {
run(code) {
let result = "";
let isError = false;
try {
result = eval(code);
if (typeof result === "object") {
result = JSON.stringify(result);
}
} catch (error) {
result = error.toString();
isError = true;
}
return [result, isError];
}
}
export default () => {
try {
const executor = new Executor();
} catch (e) {
console.log("Webworker startup error: " + e);
}
};
当我创建 webworker 时:
public componentDidMount(): void {
const code = runtime.toString();
const blob = new Blob(["(" + code + ")()"]);
this.worker = new Worker(URL.createObjectURL(blob));
this.worker.onmessage = this.handleWorkerMessages;
}
我收到错误:
Webworker startup error: ReferenceError: Executor is not defined
还需要什么才能让 webworker 认识到 class?
我还尝试将 class 放入外部文件并从那里导入它,但这只是稍微改变了错误:
Webworker startup error: ReferenceError: _ScriptingExecutor__WEBPACK_IMPORTED_MODULE_0__ is not defined
要了解发生了什么,您必须查看从导入模块生成的字符串(就在它被转换为 Blob 之前)。它仅包含默认导出代码(即匿名函数)。 class 不包括在内,因此,当您将代码加载到您的 worker 中时,它会错过 class.
因此,要么不为工作人员代码使用模块,要么使用 URL 脚本并将其提供给工作人员。
我认为如果将 Executor 放在 default 部分中它会起作用。
export default () => {
class Executor {
run(code) {
let result = "";
let isError = false;
try {
result = eval(code);
if (typeof result === "object") {
result = JSON.stringify(result);
}
} catch (error) {
result = error.toString();
isError = true;
}
return [result, isError];
}
}
try {
const executor = new Executor();
} catch (e) {
console.log("Webworker startup error: " + e);
}
};