Vue?中使用?WebWorker的示例代碼
安裝 loader
npm install worker-loader -D
如果直接把worker.js放到public目錄下,則不需要安裝loader
vue.config.js
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
transpileDependencies: true,
lintOnSave:false, // 關(guān)閉eslint檢查
parallel: false ,
chainWebpack: config => {
config.module
.rule('worker')
.test(/\.worker\.js$/) // 文件名必須要xxx.worker.js
.use('worker')
.loader('worker-loader')
}
})index.vue
<template>
<div class="HoneViewPage">
<div class="HoneViewPageOutbox">
<el-button @click="useWorker">calculate</el-button>
<div>
{{ result }}
</div>
</div>
</div>
</template>
<script>
import Worker from './demo.worker.js'; // this.worker = new Worker(); 方式才需要引入
export default {
name: 'HoneViewPage',
data() {
return {
result: 0,
worker: null
}
},
mounted() {
this.InitFun()
},
methods: {
InitFun() {
/*
**1.this.worker = new Worker() 這種方式使用,需要這樣引入 import Worker from './demo.worker.js';
**使用上面import進(jìn)來的js,名字為 demo.worker.js,不可配置,路徑相對比較靈活,需要worker-loader npm install worker-loader -D
**2.this.worker = new Worker('worker.js', { name : 'myWorker' });讀取public目錄下得js文件,可以配置名字,簡單粗暴,不需要worker-loader
**worker的名字,主要在谷歌瀏覽器 - 控制臺 - sources 中體現(xiàn)
*/
//
this.worker = new Worker();
this.worker.onmessage = event => {
this.result = event.data;
console.log('主線程收到回復(fù),即將關(guān)閉worker連接');
// this.worker.terminate();
}
},
useWorker() {
const path = [
[108.566, 40.688],
[107.53, 40.551],
];
this.worker.postMessage(path)
}
},
beforeDestroy() {
this?.worker?.terminate()
},
}
</script>
<style scoped lang="scss">
.HoneViewPage {
display: flex;
flex-flow: row nowrap;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
// background: #dde3e3;
.HoneViewPageOutbox {
display: flex;
flex-flow: column;
justify-content: center;
align-items: center;
width: calc(100% - 30px);
height: calc(100% - 30px);
background: #dde3e3;
}
}
</style>demo.worker.js
import * as THREE from 'three';
onmessage = (e) => {
console.log(e.data);
console.log(`THREE`, THREE);
const posArry = e.data; // e.data用于存儲移動路線的數(shù)組
const path = new THREE.LineCurve(posArry[0], posArry[1]);
console.log(`path`, path);
postMessage(path);
}應(yīng)用場景
瀏覽器的JS線程和GUI渲染線程互斥
在主線程跑吃性能的同步任務(wù),GUI渲染線程會掛起,頁面不能及時響應(yīng)渲染
在worker跑時,GUI渲染線程不會被掛起,頁面可以正常響應(yīng)
優(yōu)勢:
避免頁面渲染阻塞。用一個worker處理主線程的任務(wù),兩者處理時間差不多,worker的優(yōu)勢在于處理過程中不會影響頁面的渲染(e.g. 導(dǎo)出時 Element.message組件彈出提示,但是由于JS處理時間過長,導(dǎo)致頁面渲染被阻塞,提示不能及時顯示)
減少任務(wù)處理時間。worker可以有多個(多線程),用多個worker處理主線程的任務(wù)時,總的任務(wù)時長會減少(e.g. 壓縮100張圖片)
打包時錯誤處理

ERROR Failed to compile with 1 error 16:12:04
error in ./src/pages/HoneViewPage/demo.worker.js
Syntax Error: Thread Loader (Worker 0)
Cannot read properties of undefined (reading 'options')
ERROR Error: Build failed with errors.
Error: Build failed with errors.
at D:\test_project\vue_worker-loader\node_modules\@vue\cli-service\lib\commands\build\index.js:207:23
at D:\test_project\vue_worker-loader\node_modules\webpack\lib\webpack.js:148:8
at D:\test_project\vue_worker-loader\node_modules\webpack\lib\HookWebpackError.js:68:3
at Hook.eval [as callAsync] (eval at create (D:\test_project\vue_worker-loader\node_modules\tapable\lib\HookCodeFactory.js:33:10), <anonymous>:6:1)
at Hook.CALL_ASYNC_DELEGATE [as _callAsync] (D:\test_project\vue_worker-loader\node_modules\tapable\lib\Hook.js:18:14)
at Cache.shutdown (D:\test_project\vue_worker-loader\node_modules\webpack\lib\Cache.js:150:23)
at D:\test_project\vue_worker-loader\node_modules\webpack\lib\Compiler.js:1225:15
at Hook.eval [as callAsync] (eval at create (D:\test_project\vue_worker-loader\node_modules\tapable\lib\HookCodeFactory.js:33:10), <anonymous>:6:1)
at Hook.CALL_ASYNC_DELEGATE [as _callAsync] (D:\test_project\vue_worker-loader\node_modules\tapable\lib\Hook.js:18:14)
at Compiler.close (D:\test_project\vue_worker-loader\node_modules\webpack\lib\Compiler.js:1218:23)
Syntax Error: Thread Loader(Worker 1)
Cannot read properties of undefined (reading 'options')
框架:@vue/cli@5 + vue@2.7 + ts
vue-cli 使用wokrer-loader 加載web woker時,使用npm run build 有很大機(jī)率會打包失敗,報錯如上。
thread-loader 與worker-loader有沖突。
解決:
vue.config.js 配置
parallel: false
構(gòu)建正式環(huán)境關(guān)閉thread-loader
parallel: false
vue.config.js
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
transpileDependencies: true,
lintOnSave:false, // 關(guān)閉eslint檢查
parallel: false ,
chainWebpack: config => {
config.module
.rule('worker')
.test(/\.worker\.js$/) // 文件名必須要xxx.worker.js
.use('worker')
.loader('worker-loader')
}
})vue-cli: Syntax Error: Thread Loader:https://blog.csdn.net/qq_35459724/article/details/127080017
配置參考 | Vue CLI (vuejs.org);https://cli.vuejs.org/zh/config/#devserver-proxy
參考鏈接:https://blog.csdn.net/weixin_44240581/article/details/129186915
預(yù)覽:https://1t1824d.github.io/vue-worker_loader_preview/#/
到此這篇關(guān)于Vue 中使用 WebWorker的文章就介紹到這了,更多相關(guān)Vue 使用 WebWorker內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Elementui?el-input輸入框校驗(yàn)及表單校驗(yàn)實(shí)例代碼
輸入框是使用非常多的元素,用來輸入用戶名、密碼等等信息,Element提供了功能和樣式豐富的輸入框,下面這篇文章主要給大家介紹了關(guān)于Elementui?el-input輸入框校驗(yàn)及表單校驗(yàn)的相關(guān)資料,需要的朋友可以參考下2023-06-06
vue?beforeDestroy?clearInterval清除定時器失效的解決
這篇文章主要介紹了vue?beforeDestroy?clearInterval清除定時器失效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06
前端Vue3項目打包成Docker鏡像運(yùn)行的詳細(xì)步驟
將Vue3項目打包、編寫Dockerfile、構(gòu)建Docker鏡像和運(yùn)行容器是部署Vue3項目到Docker的主要步驟,這篇文章主要介紹了前端Vue3項目打包成Docker鏡像運(yùn)行的詳細(xì)步驟,需要的朋友可以參考下2024-09-09
解決vue-cli項目sourcemap因?yàn)槲募孛麑?dǎo)致的文件定位映射錯誤問題
這篇文章主要介紹了解決vue-cli項目sourcemap因?yàn)槲募孛麑?dǎo)致的文件定位映射錯誤問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06
Vue.js watch監(jiān)視屬性知識點(diǎn)總結(jié)
在本篇文章里小編給大家分享的是關(guān)于Vue.js watch監(jiān)視屬性的相關(guān)知識點(diǎn)內(nèi)容,需要的朋友們學(xué)習(xí)下。2019-11-11
vue項目中常用解決跨域的方法總結(jié)(CORS和Proxy)
在vue項目中,一般我們會遇到跨域的問題,vue項目中解決跨域是非常簡單的,下面這篇文章主要給大家介紹了關(guān)于vue項目中常用解決跨域的方法,主要解釋CROS和Proxy兩種方式,需要的朋友可以參考下2022-12-12
Vue頁面手動刷新,實(shí)現(xiàn)導(dǎo)航欄激活項還原到初始狀態(tài)
這篇文章主要介紹了Vue頁面手動刷新,實(shí)現(xiàn)導(dǎo)航欄激活項還原到初始狀態(tài),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08

