10

我正在尝试使用 webpack 的 worker 加载器将 web worker 脚本加载到我的 React 应用程序中。但是,我收到一个未找到模块的错误。

./src/index.js 中的错误模块未找到:错误:无法解析“C:\Users\wyrm\Documents\Project\src”中的“./file.worker”

这是我的 src/index.js,它是 webpack 的入口点

import React from "react";
import ReactDOM from "react-dom";
import Worker from "./file.worker";

const worker = new Worker();
worker.postMessage({ message: "Hello there" });

const Index = () => <div>Hello there General Kenobi!</div>;

ReactDOM.render(<Index />, document.getElementById("index"));

我在 Project/public 文件夹中有名为 file.worker.js 的网络工作者脚本

/* eslint-env worker */

onmessage = e => {
  const message = e.data;
  console.log(`[From Main]: ${message}`);
};

这是我的 webpack 配置文件:

const HtmlWebPackPlugin = require("html-webpack-plugin");

const htmlPlugin = new HtmlWebPackPlugin({
  template: "./src/index.html",
  filename: "./index.html"
});

module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: [{ loader: "babel-loader" }, { loader: "eslint-loader" }]
      },
      {
        test: /\.worker\.js$/,
        use: [{ loader: "worker-loader", options: { publicPath: "/public/" } }]
      }
    ]
  },
  plugins: [htmlPlugin]
};

根据 webpack文档,我需要做的就是将以下内容添加到我的配置文件中,我已经完成了:

// webpack.config.js
{
  module: {
    rules: [
      {
        test: /\.worker\.js$/,
        use: { loader: 'worker-loader' }
      }
    ]
  }
}

我进一步指定了此处记录的公共路径:

// App.js
// This will cause the worker to be downloaded from `/workers/file.worker.js`
import Worker from './file.worker.js';

// webpack.config.js
{
  loader: 'worker-loader'
  options: { publicPath: '/workers/' }
}

但即使我已将 publicPath 指定为 Project/public,抛出的错误似乎表明它正在 Project/src 文件夹中查找 web worker 脚本。在我看来,默认情况下 webpack 在 Project/public 文件夹中查找 web worker 脚本,所以正确地为 publicPath 指定 Project/public 应该是多余的?

我还应该提到我正在使用 webpack 开发服务器。是不是我的 webpack 开发服务器缺少某种配置,并且它没有拾取我的 web worker 脚本?

当我似乎正确地遵循了文档时,我真的无法弄清楚为什么我会收到一个未找到模块的错误。

Project directory
Project
- dist
  - index.html
  - main.js
- public
  - file.worker.js
- src
  - index.html
  - index.js
- .babelrc
- .eslintrc.json
- package.json
- webpack.config.js
4

2 回答 2

3

尝试以下操作:

import Worker from 'worker-loader!./file.worker.js';

您需要指定哪个加载程序(即worker-loader)将显式加载工作程序。

另外,我认为您不需要配置publicPath选项。

于 2019-05-16T11:17:53.227 回答
2

尝试将 file.worker.js 移动到 src 中。那就是你正在寻找它的地方import Worker from "./file.worker";

于 2019-05-16T10:13:22.280 回答