【发布时间】:2020-07-20 10:14:14
【问题描述】:
我正在尝试创建一个 web worker 来防止 React 主线程停止。工人应该阅读图像并做各种事情。
该应用是使用create-react-app 创建的。
目前我有
WebWorker.js
export default class WebWorker {
constructor(worker) {
const code = worker.toString();
const blob = new Blob(['('+code+')()'], {type: "text/javascript"});
return new Worker(URL.createObjectURL(blob), {type: 'module'});
}
}
readimage.worker.js
import Jimp from "jimp";
export default () => {
self.addEventListener('message', e => { // eslint-disable-line no-restricted-globals
if (!e) return;
console.log('Worker reading pixels for url', e.data);
let data = {};
Jimp.read(e.data).then(image => {
// jimp does stuff
console.log('Worker Finished processing image');
})
postMessage(data);
})
};
然后在我的 React 组件 AppContent.js 我有
从“./workers/WebWorker”导入 WebWorker;
从'./workers/readimage.worker.js'导入readImageWorker;
export default function AppContent() {
const readWorker = new ReadImageWorker(readImageWorker);
readWorker.addEventListener('message', event => {
console.log('returned data', event.data);
setState(data);
});
// callback that is executed onClick from a button component
const readImageContents = (url) => {
readWorker.postMessage(url);
console.log('finished reading pixels');
};
}
但是当我运行它时,我得到了错误
未捕获的引用错误:jimp__WEBPACK_IMPORTED_MODULE_0___default 未定义
如何将模块正确导入网络工作者?
编辑:
根据 Kaiido 的建议,我尝试安装 worker-loader,并将我的 webpack.config.js 编辑为以下内容:
module.exports = {
module: {
rules: [
{
test: /\.worker\.js$/,
use: { loader: 'worker-loader' }
}
]
}
};
但是当我运行它时,我仍然得到错误
未捕获的引用错误:未定义 jimp__WEBPACK_IMPORTED_MODULE_0__
【问题讨论】:
标签: javascript reactjs web-worker