背景
有的時候我們需要向後端傳送多個網路請求,如果全部在主執行緒中操作的話頁面會變得非常卡頓,我們可以使用webwoker來傳送網路請求,一旦服務響應結果,我們再從子執行緒給主執行緒傳送訊息
步驟
預設情況下vue2是不支援webwoker。
- 安裝
worker-loader
npm i -D worker-loader
- vue.config.js配置
配置loader來解析xx.worker.js
字尾的檔案
module.exports = defineConfig({
configureWebpack: config => {
config.module.rules.push({
test: /\.worker.js$/,
use: {
loader: 'worker-loader',
// 允許將內聯的 web worker 作為 BLOB
options: { inline: 'no-fallback' }
},
})
},
parallel: false, // 打包報錯的配置
})
- 建立worker來傳送網路請求
src下建立worker/list.worker.js
import axios from "axios";
self.onmessage = (e) => {
axios.get('http://127.0.0.1:3000/public/test.jpg').then(res => {
self.postMessage(res.data)
})
}
- vue元件
<template>
<div class="app">
<button @click="sendMessage">傳送訊息</button>
</div>
</template>
<script>
import listWorker from './worker/list.worker'
export default {
created() {
// 引入子執行緒執行的js檔案,然後建立worker示例
const worker = new listWorker()
this.worker = worker
this.worker.addEventListener('message', (e) => {
console.log('主執行緒監聽到子執行緒傳送的訊息事件', e.data)
})
},
methods: {
sendMessage() {
this.worker.postMessage(123)
},
},
}
</script>
<style lang="less" scoped></style>
效果
參考文件
https://juejin.cn/post/6979487181739917343#heading-8