【问题标题】:Importing node modules to web worker in React/Webpack app在 React/Webpack 应用程序中将节点模块导入到 Web Worker
【发布时间】:2019-07-28 11:47:20
【问题描述】:

我有一个与 Webpack 捆绑的 React 应用程序。我想为我的一个组件使用网络工作者,它将数据导出到 Pdf。 pdf 的生成可能需要一段时间并锁定浏览器,所以我想在 web worker 中完成这项工作,以便在单独的线程中完成。我遇到的问题是将 JsPDF 库导入到我的网络工作者脚本中,以便我可以使用它。

这是我的工作脚本:

import * as JsPDF from "jspdf";

export default () => {
    self.addEventListener("message", event => {
        const canvases = event.data;

        const pdf = new JsPDF({
            orientation: "l",
            unit: "in",
        });
        // tslint:disable-next-line:prefer-for-of
        for (let i = 0; i < canvases.length; i++) {
            if (i > 0) pdf.addPage();
            pdf.addImage(canvases[i].toDataURL("image/png"), "PNG", 0.25, 0, 11, 8);
        }
        pdf.save("report.pdf");
        self.postMessage("done", "");
    });
};

这在运行时给了我这个错误:

Uncaught ReferenceError: jspdf__WEBPACK_IMPORTED_MODULE_0__ is not defined
    at blob:http://localhost:11449/ea75c456-15ee-45e9-b82b-902c518dc635:4

我也尝试过使用 importScript() 函数,如下所示:

export default () => {
    importScripts("jspdf");
    self.addEventListener("message", event => {
        const canvases = event.data;

        const pdf = new JsPDF({
            orientation: "l",
            unit: "in",
        });
        // tslint:disable-next-line:prefer-for-of
        for (let i = 0; i < canvases.length; i++) {
            if (i > 0) pdf.addPage();
            pdf.addImage(canvases[i].toDataURL("image/png"), "PNG", 0.25, 0, 11, 8);
        }
        pdf.save("report.pdf");
        self.postMessage("done", "");
    });
};

我得到这个错误:

Uncaught DOMException: Failed to execute 'importScripts' on 'WorkerGlobalScope': The URL 'jspdf' is invalid.

或者我试试:

importScripts("../../../../node_modules/jspdf/dist/jspdf.min.js");

我得到同样的无效 URL 错误。 我还尝试在导出之外使用 require:

const JsPDF = require("jspdf");

但我仍然收到未定义 JsPDF 的错误。我还能尝试什么?

我应该提到,web worker 是使用自定义类实例化的,如https://medium.com/prolanceer/optimizing-react-app-performance-using-web-workers-79266afd4a7,用于通过 webpack 获取正确的 URL:

export default class WebWorker {
    constructor(worker: any) {
        const code = worker.toString();
        const blob = new Blob([`(${code})()`]);
        return new Worker(URL.createObjectURL(blob));
    }
}

【问题讨论】:

  • Webpack 应该绝对支持导入已安装的 npm 包。 target: "webworker" 在你的 webpack 配置中为工作包设置了吗?

标签: reactjs webpack import web-worker


【解决方案1】:

我最终将 worker-loader 用于 webpack。这允许我在工作脚本中导入模块,就像在任何其他脚本中一样。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-01-06
  • 1970-01-01
  • 2020-07-20
  • 2018-01-27
  • 1970-01-01
  • 2017-07-30
  • 2019-05-09
  • 1970-01-01
相关资源
最近更新 更多