【问题标题】:Reference worker relative to JavaScript file相对于 JavaScript 文件的参考工作者
【发布时间】:2018-08-28 18:43:19
【问题描述】:

我正在使用webpack 组合一个使用Web Workers 的项目。为此,我使用了worker-loader 加载程序。

我创建了一个minimal plunk 来演示我的环境(我还将粘贴下面的代码以供后代使用)。

问题是,工作文件的解析没有按预期运行。如果我启动index.html(我正在使用HTTP 服务器为根文件夹提供服务),它自然可以解析../dist/TestMain.js,但它会尝试从./ 相对于index.html 解析TestWorker.js。我希望它从./ 相对于TestMain.js 解决。

我尝试添加output.publicPath = "./",但没有帮助。我已经在文档(和 worker-loader 的文档)中搜索了类似的选项,但没有发现任何我可以说是相关的(我可能是错的)。

通常情况下,我会全部使用resolve.alias,但输出应该能够被拖放到 HTML 页面可引用的任何文件夹中(主 JS 文件和工作 JS 文件将一起保留在同一个文件夹中) .

我还看到我可以内联工作程序,但我想避免这种情况,因为它会阻塞工作程序(可能导致其他类型的引用问题)。

我是否缺少启用相对引用的选项或我错过的解决方法?

结构如下:

Project
 |- dist
 |   |- TestMain.js
 |   |- TestWorker.js
 |- src
 |   |- workers
 |   |   |- TestWorker.js
 |   |- index.js
 |- test
 |   |- index.html
 |- webpack.config.js

这是我的 webpack.config.js:

const path = require("path");

module.exports = {
  entry: "./src/index.js",
  mode: "development",
  output: {
    filename: "TestMain.js",
    path: path.resolve(__dirname, "dist"),
    library: "MyLib",
    libraryTarget: "umd"
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        include: [
          path.resolve(__dirname, "src/workers"),
        ],
        use: {
          loader: "worker-loader",
          options: {
            name: "[name].js"
          }
        }
      }
    ]
  }
};

如果你愿意,我会分享我的其他文件,但如果工作文件与 index.html 位于同一文件夹中,它确实有效

【问题讨论】:

    标签: webpack web-worker worker-loader


    【解决方案1】:

    为 worker-loader 指定 publicPath 选项:

            use: {
              loader: "worker-loader",
              options: {
                name: "[name].js",
                publicPath: "/dist"
              }
            }
    

    或者,您可以考虑在构建过程中添加一个步骤,将静态资产(包括 index.html)复制到 dist 文件夹。

    【讨论】:

    • 这对publicPath: "./" 有用吗?想法是将两个 JavaScript 文件放在同一个目录中,而不管它在哪里(并且很可能不会/dist 中)。因此,无论它们部署在何处,我都希望我的TestMain.js 能够从同一目录 引用TestWorker.js。我希望./TestMain.js 相关,而不是与index.html 生活的任何地方相关,这就是它目前的工作方式。
    • @TheJim01 我现在才检查了你的 plunk。我设置了它(顺便说一句,我知道 plunk 是如何工作的,但我必须手动安装所有包——你的 package.json 没有什么帮助)。我注意到您正在尝试发布整个事件,结果为DataCloneError: The object could not be cloned.。您应该只发布可序列化的数据。在onmessage 处理程序中,您可以访问作为参数传递给event.data 中的postMessage 的内容。
    • worker URL(以及扩展的worker-loader的publicPath)是相对于请求它的HTML,而不是JS脚本。解析相对于源的路径取决于 Webpack。因此,通过设置publicPath: '/dist/',我让它适用于/test/index.html 以及它在/index.html 的副本。我无法使它适用于 /test/foo/index.html,但这是另一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 2016-03-04
    • 2010-09-15
    • 1970-01-01
    相关资源
    最近更新 更多