【问题标题】:Can't use Worker-Loader with Vuejs and Webpack无法将 Worker-Loader 与 Vuejs 和 Webpack 一起使用
【发布时间】:2019-02-04 18:34:02
【问题描述】:

我正在尝试使用 Vue cli3 启动和运行网络工作者,但我无法让它工作。

我想使用以下包,worker-loader(而不是 vue-worker),因为它看起来维护得很好并且贡献更多。

按照他们的教程,我尝试使用 vue cli 修改 webpack,如下所示:

module.exports = {
    chainWebpack: config => {
        config.module
          .rule('worker-loader')
          .test(/\.worker\.js$/)
          .use('worker-loader')
            .loader('worker-loader')
            .end()
    }
}

我希望应该匹配他们的

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

可以在此处阅读 (https://github.com/webpack-contrib/worker-loader)。我尽量遵循 vue cli3 的文档(在这里找到:https://cli.vuejs.org/guide/webpack.html#simple-configuration)。

我的组件很简单:

import Worker from 'worker-loader!./../../sharedComponents/equations/recurringTimeComposer.js';

<...>
watch:{

 recurringPaymentReturnObj: function(newVal, oldVal){
        const myWorker = new Worker;
        myWorker.postMessage({ hellothere: 'sailor' });
        myWorker.onmessage = (e) => {
            console.log('value of e from message return', e.data);
 }
}
<...>

在我的./../../sharedComponents/equations/recurringTimeComposer.js 文件中,我有:

onmessage = function(e) {
    console.log('Message received from main script: ', e.data);
    // var workerResult = 'Result: ' + e.data;
    // console.log('Posting message back to main script');
    postMessage('hello back handsome');
    close();
}

我不断收到错误消息:

ReferenceError: window is not defined a162426ab2892af040c5.worker.js:2:15

经过一番谷歌搜索后,我发现了这篇文章:https://github.com/webpack/webpack/issues/6642,这表明解决此问题的最佳方法是将以下内容添加到 webpack:

output: {
       path: path.join(__dirname, 'dist'),
       filename: 'bundle.js'
       publicPath: 'http://localhost:3000',
       globalObject: 'this'
},

修改我的vue.config.js 文件后,我有:

module.exports = {
    chainWebpack: config => {
        config.module
          .rule('worker-loader')
          .test(/\.worker\.js$/)
          .use('worker-loader')
            .loader('worker-loader')
            .end()
        config
            .output
            .path(path.join(__dirname, 'dist'))
            .filename('bundle.js')
            .publicPath('http://localhost:8080')
            .globalObject('this')
    }
}

...但我仍然收到未定义窗口错误。

有谁知道出了什么问题?这似乎是 webpack 中的一个奇怪的错误。

谢谢!

编辑:哦,是的,这里也是 webworker 的 MDN 页面:https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers

【问题讨论】:

  • 啊....如果有人对此问题有答案,请添加,但目前我正在使用 vue-worker,因为我无法让另一个集成到 webpack 中。谢谢~

标签: multithreading asynchronous vue.js webpack web-worker


【解决方案1】:

作为 Javascript 的新手,我在尝试将 Web Worker 与 VueJS 一起使用时,我不断地回到这个问题。我从来没有设法使它与vue-workerworker-loader 一起工作。

现在是 2020 年,Google 发布了worker-plugin

要使用它,请创建一个模块 my-worker,其中包含两个文件 index.jsworker.js

index.js 创建模块:

const worker = new Worker('./worker.js', { type: 'module' });

const send = message => worker.postMessage({
  message
})

export default {
  worker,
  send
}

worker.js 包含逻辑:

import _ from 'lodash'
addEventListener("message", async event => {
    let arrayToReverse = event.data.message.array
    let reversedArray = _.reverse(arrayToReverse)
    // Send the reversed array
    postMessage(reversedArray)
});

您还需要更新您的 vue.config.js 以使用 WorkerPlugin:

const WorkerPlugin = require('worker-plugin')
module.exports = {
  configureWebpack: {
    output: {
      globalObject: "this"
    },
    plugins: [
      new WorkerPlugin()
    ]
  }
};

现在你可以在你的组件中使用你的 worker:

  1. 使用import worker from '@/my-worker' 导入。
  2. mounted() 生命周期钩子中使用worker.worker.onmessage = event =&gt; { // do something when receiving postMessage } 设置监听器
  3. worker.send(payload)启动worker。

我在github 上设置了启动代码。我仍然没有设法让 HMR 工作......

【讨论】:

    【解决方案2】:

    这对我有用(注意第一行):

    config.module.rule('js').exclude.add(/\.worker\.js$/)
    
    config.module
      .rule('worker-loader')
      .test(/\.worker\.js$/)
      .use('worker-loader')
      .loader('worker-loader')
    

    第一行不包括worker.js文件,所以两个loader不会争抢同一个js文件

    【讨论】:

    • 第一行也解决了我的问题,谢谢!
    【解决方案3】:

    这是你需要的吗? Vue issue with worker-loader

    【讨论】:

      【解决方案4】:

      从经典的 vue 和 webpack 配置更新,我发现要使这个工作正常,我需要停用并行化。

      // vue.config.js
      module.exports = {
          parallel: false,
          chainWebpack: (config) => {
              config.module
              .rule('worker')
              .test(/\.worker\.js$/)
              .use('worker-loader')
              .loader('worker-loader')
              .end();
          }
      };
      

      【讨论】:

        猜你喜欢
        • 2018-08-15
        • 1970-01-01
        • 2018-10-17
        • 1970-01-01
        • 2018-05-27
        • 1970-01-01
        • 2016-08-20
        • 2017-04-25
        • 2017-09-04
        相关资源
        最近更新 更多