当前位置: 首页 > 知识库问答 >
问题:

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

夹谷鸿福
2023-03-14

我正在尝试让web workers启动并运行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。

共有1个答案

景宏盛
2023-03-14

作为Javascript的新手,在尝试使用web workers和VUEJS时,我不断地回到这个问题。我从未设法使它与vue-workerworker-loader一起工作。

现在是2020年,谷歌发布了Worker-Plugin。

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

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. 使用从“@/my-worker”导入worker导入它。
  2. 使用worker.worker.onmessage=event=>{//接收postMessage时执行某些操作}
  3. mounted()生命周期钩子中设置侦听器
  4. 使用worker.send(有效负载)启动工作程序。

我在GitHub上设置了一个起始代码。但我还是没能让HMR工作...

 类似资料:
  • 我有一个烧瓶服务器运行在http://127.0.0.1:5000和一个vuejs前端运行http://localhost:8080我已经做了api,并用postman测试了它,一切都如预期的那样工作:( > 将请求发布到/登录- (将请求发送至/登录)- 烧瓶API代码: 登录。vue: 指数vue 当我使用邮递员登录时,我得到的响应为;当我使用邮递员获取url/索引时,我得到响应。数据但当我使

  • 问题内容: 我想使用Go模板以及VueJS进行数据绑定。有人整合过吗? 我希望主要将VueJS用于Ajax调用,因为手动(或使用jQuery)总是使我的代码混乱。 更具体地说,如果我有一个简单的标签,其值是从Go模板生成的,如下所示: 现在我想像这样绑定到值 : 两者都用于同一标签。 问题答案: 如果要将Vue.js与另一个模板系统混合,则可以选择使用其他方式更改插值定界符(默认情况下)。 现在,

  • 我试图设置我的vuejs应用程序,但我不知道如何正确配置这个与我的webpack配置html lint。我目前正在尝试htmlhint-loader。我使用以下命令安装了它: 并在我的网页中添加了以下代码。基础配置: 但这不起作用,让我知道,如果还有什么需要使它工作。 当我使用这个正则表达式时: 我发现以下错误: 错误/~/html网页包插件/lib/loader。js/指数html模块分析失败:

  • 问题内容: 当我尝试将Webpack与简单的Express服务器一起使用时,总是会收到大量错误消息: express.js 我得到所有这些错误: 这是我的配置文件: 我该怎么办,我还需要在服务器端使用webpack。 我像这样运行express.js文件: 问题答案: 我最终要做的是,我使用了两种不同的配置,一种用于使用webpack将服务器内容打包在一起,另一种用于将所有浏览器内容打包在一起,并

  • 问题内容: 我用Webpack和react-rounter构建一个项目。这是我的代码: 当我请求时,就可以了!但是地址有误。查看错误消息:在此处输入图片描述 我的WebpackDevServer配置为: 我不知道怎么回事,帮帮我! 问题答案: 您正在使用相对路径来描述index.html中bundle.js的路径。 您应该在index.html中为bundle.js使用绝对路径 绝对路径包含根目录