首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法与Vuejs和Webpack一起使用Worker-Loader

无法与Vuejs和Webpack一起使用Worker-Loader
EN

Stack Overflow用户
提问于 2018-08-30 05:39:57
回答 4查看 6.5K关注 0票数 10

我正在尝试让网络工作者启动并运行Vue cli3,但我在让它工作时遇到了问题。

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

根据他们的教程,我尝试使用vue线索修改webpack,如下所示:

代码语言:javascript
复制
module.exports = {
    chainWebpack: config => {
        config.module
          .rule('worker-loader')
          .test(/\.worker\.js$/)
          .use('worker-loader')
            .loader('worker-loader')
            .end()
    }
}

我希望它能和他们的

代码语言:javascript
复制
{
  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)。

我的组件非常简单:

代码语言:javascript
复制
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文件中,我有:

代码语言:javascript
复制
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();
}

我一直收到错误消息:

代码语言:javascript
复制
ReferenceError: window is not defined a162426ab2892af040c5.worker.js:2:15

经过一些谷歌搜索,我发现了这个帖子:https://github.com/webpack/webpack/issues/6642,它建议解决这个问题的最好方法是在webpack中添加以下内容:

代码语言:javascript
复制
output: {
       path: path.join(__dirname, 'dist'),
       filename: 'bundle.js'
       publicPath: 'http://localhost:3000',
       globalObject: 'this'
},

修改我的vue.config.js文件后,我得到了:

代码语言:javascript
复制
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')
    }
}

我仍然得到...but window is not defined错误。

有人知道哪里出了问题吗?这似乎是webpack身上的一个奇怪的错误。

谢谢!

编辑:哦,是的,这也是为网络工作者提供的MDN页面:https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers

EN

回答 4

Stack Overflow用户

发布于 2020-03-21 23:48:59

作为Javascript的新手,当我尝试在VueJS中使用web workers时,我不断地回到这个问题上来。我从来没有想过让它在vue-workerworker-loader上工作。

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

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

index.js创建模块:

代码语言:javascript
复制
const worker = new Worker('./worker.js', { type: 'module' });

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

export default {
  worker,
  send
}

worker.js包含以下逻辑:

代码语言:javascript
复制
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:

代码语言:javascript
复制
const WorkerPlugin = require('worker-plugin')
module.exports = {
  configureWebpack: {
    output: {
      globalObject: "this"
    },
    plugins: [
      new WorkerPlugin()
    ]
  }
};

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

使用带有worker.send(payload).的worker.worker.onmessage = event => { // do something when receiving postMessage }

  • Start
  1. mounted()生命周期钩子中的侦听器导入它

我在github上设置了一个启动器代码。不过,我还是没能让HMR工作。

票数 5
EN

Stack Overflow用户

发布于 2020-06-14 14:40:50

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

代码语言:javascript
复制
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文件

票数 5
EN

Stack Overflow用户

发布于 2018-09-05 23:46:36

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52086438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档