使用worker-loader在vue中使用worker,并且兼容ie11

worker

多线程可以让网页进行大量数据处理的时候,避免UI渲染阻塞。
我这次使用woker来进行数据的预先获取数据并且处理
由于数据预计会比较多,如果一次性获取的话,UI渲染就会阻塞,导致用户体验下降。

案例

MDN上介绍以及非常详细

由于woker不支持file路径,所以一般都是将文件布置到服务器生成一个url,但是在开发过程中这样太不方便了,所以webpack上有一个loader:worker-loader

安装

npm i worker-loader --save-dev

webpack配置

module.exports ={
	/***/
	module:{
		rules:[
			/**
				省略
			*/
			{
        	test: /\.worker\.js$/,
	        use: {
	          loader: 'worker-loader',
	          options: { inline: true, name: 'workerName.[hash].js' },
	
	        }
	      }
		]
	}
	/***/
}

看了配置就知道,woker的文件是以worker.js结尾的。

worker文件

// test.worker.js
// Respond to message from parent thread
self.addEventListener('message', (event) => {
  console.log('worker has got')
  /**数据处理*/
  self.postMessage(handleDatas(event.data))
})

app.js

import  test from "../worker/test.worker.js";
module.exports={
	created(){
		let myWorker = new test();
        myWorker.postMessage(datas); // 发送
        myWorker.onmessage = event => {
          // 接收
          this.totalDatas = this.totalDatas.concat(
            event.data.slice(sliceIndex)
          );
        };
	}
}

大部分网上的例子到此就结束了,但是实际上直接这样使用会发现使用不了。

问题与解决

  1. 在这里插入图片描述
    在ie11中出现不知名的错误
原因推测:

应该是import在ie11上出现了问题,导致不能正确的导入worker.js

在worker-loader上加上babel-loader进行转换就可以兼容ie11

     {
        test: /\.worker\.js$/,
        use: [{
          loader: 'worker-loader',
          options: { inline: true, name: 'workerName.[hash].js' },

        },
        { loader: 'babel-loader' }]// 增加es6 转换语法
      }

添加之后,就可以正常地使用了。

在这里插入图片描述
官方的文档也写清楚了,如果使用ES2015就需要配置balbel-loader
在这里插入图片描述
但是网上的大部分案例都没有注明这一个,因为没有配置在chorm也是能够正常运行的,但是在ie却不行。

Vue.js 2.x中,要引入Web Worker并在组件中使用,你可以按照以下步骤操作: 1. 首先,你需要安装`worker-loader`和`vue-cli-plugin-webpack-worker-loader`。如果你还没有全局安装它们,可以使用npm或yarn: ```bash npm install --save-dev worker-loader vue-cli-plugin-webpack-worker-loader # 或者 yarn add --dev worker-loader vue-cli-plugin-webpack-worker-loader ``` 2. 安装完成后,在`main.js`或其他配置文件(如`vue.config.js`)中启用webpackworker loader插件。如果是`.js`文件: ```javascript // 如果在vue.config.js中 module.exports = { chainWebpack: config => { config.module .rule('worker') .test(/\.worker\.js$/) // 指定匹配worker脚本的文件名后缀 .use('worker-loader') // 使用worker-loader处理 .loader('worker-loader') // 配置loader .options({ filename: 'your-worker-name.js', // 输出到指定文件 publicPath: './', // 设置公共路径,根据实际项目结构调整 }); } }; ``` 或者在`plugins`部分添加: ```javascript new VueCLIPluginWebpackWorkerLoader({ test: /\.worker\.js$/, filename: 'your-worker-name.js', publicPath: './' }) ``` 3. 然后在你的组件里创建一个引用Web Worker的实例。假设你有一个名为`MyWorker.js`的worker脚本,可以在组件的methods中这样使用: ```html <template> <button @click="startWorker">Start Worker</button> </template> <script> import MyWorker from '@/workers/MyWorker.worker.js'; export default { methods: { async startWorker() { const worker = new Worker(MyWorker); // 监听worker的消息事件 worker.onmessage = (event) => { console.log(`Received message: ${event.data}`); }; // 发送消息给worker worker.postMessage('Hello from the main thread'); // 关闭worker时调用 worker.terminate(); }, }, }; </script> ``` 记得将`MyWorker.worker.js`替换为你实际的worker文件路径。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值