不能将Worker-Loader与Vuejs和Webpack一起使用

时间:2018-08-29 21:39:57

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

我正在尝试使网络工作者使用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

4 个答案:

答案 0 :(得分:3)

作为Java的新手,在尝试将Web Worker与VueJS结合使用时,我不断回到这个问题。我从未设法使其与vue-workerworker-loader一起使用。

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

要使用它,请创建包含两个文件my-workerindex.js的模块worker.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()
    ]
  }
};

现在您可以在组件中使用工作线程了:

  1. import worker from '@/my-worker'导入。
  2. 使用mounted()worker.worker.onmessage = event => { // do something when receiving postMessage }生命周期挂钩中设置侦听器
  3. worker.send(payload)开始工作。

我在github上设置了入门代码。我仍然没有设法使HMR工作...

答案 1 :(得分: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文件,因此两个加载程序不会争用同一个js文件

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

ENV Lang en_us.utf-8