Vue 中使用 WebWorker

news2024/12/29 10:36:55

目录

安装 loader

应用场景

打包时错误处理


安装 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, // 关闭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进来的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 中体现

            */

            //

            this.worker = new Worker();

            this.worker.onmessage = event => {

                this.result = event.data;

                console.log('主线程收到回复,即将关闭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用于存储移动路线的数组

    const path = new THREE.LineCurve(posArry[0], posArry[1]);

    console.log(`path`, path);

    postMessage(path);



}

 应用场景

浏览器的JS线程和GUI渲染线程互斥

在主线程跑吃性能的同步任务,GUI渲染线程会挂起,页面不能及时响应渲染

在worker跑时,GUI渲染线程不会被挂起,页面可以正常响应

优势:

避免页面渲染阻塞。用一个worker处理主线程的任务,两者处理时间差不多,worker的优势在于处理过程中不会影响页面的渲染(e.g. 导出时 Element.message组件弹出提示,但是由于JS处理时间过长,导致页面渲染被阻塞,提示不能及时显示)

减少任务处理时间。worker可以有多个(多线程),用多个worker处理主线程的任务时,总的任务时长会减少(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 有很大机率会打包失败,报错如上。

thread-loader 与worker-loader有冲突。

解决:

vue.config.js 配置

parallel: false  

构建正式环境关闭thread-loader

parallel: false  

vue.config.js 

const { defineConfig } = require('@vue/cli-service')

module.exports = defineConfig({
    transpileDependencies: true,
    lintOnSave:false, // 关闭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

预览:https://1t1824d.github.io/vue-worker_loader_preview/#/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/853213.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JS逆向系列之猿人学爬虫第14题-备而后动-勿使有变

文章目录 题目地址参数分析参考jspython 调用往期逆向文章推荐题目地址 https://match.yuanrenxue.cn/match/14题目难度标的是困难,主要难在js混淆部分。 参数分析 初始抓包有无限debugger反调试,可以直接hook 函数构造器过掉无限debugger Function.prototype.__construc…

C++异常体系

文章目录 一.C对运行时错误的处理方式函数调用链中的异常机制 二.异常的使用规范三.C异常体系C标准库中的异常体系 四.关于C异常的注意事项 一.C对运行时错误的处理方式 传统的C语言处理运行时错误采用的是assert或者错误码的方式,这种异常处理机制对错误信息的定位和描述能力…

ArcGIS Pro技术应用(暨基础入门、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合)

GIS是利用电子计算机及其外部设备&#xff0c;采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲&#xff0c;它是在一定的地域内&#xff0c;将地理空间信息和 一些与该地域地理信息相关的属性信息结合起来&#xff0c;达到对地理和属性信息的综合管理。GIS的…

lc137. 只出现一次的数字 II

数组排序&#xff0c;既和前不一样又和后不一样的就是唯一的一个 public static int numberOnce(int[] nums) {Arrays.sort(nums);if (nums.length > 2 && nums[0] ! nums[1]) {//避免只有一个元素的数组return nums[0];}if (nums.length > 2 && nums[nu…

994. 腐烂的橘子

题目描述&#xff1a; 主要思路&#xff1a; 宽度优先搜索&#xff0c;利用队列实现。 需要注意的是放进队列的时候就需要标记&#xff0c;而不是取出的时候再标记。 class Solution { public:int orangesRotting(vector<vector<int>>& grid) {int ngrid.siz…

解决Spring Boot 2.6及之后版本取消了循环依赖的支持的问题

目录 1、问题&#xff1a; 2、报错&#xff1a; 3、解决方案&#xff1a; 1、问题&#xff1a; 循环依赖指的是两个或者多个bean之间相互依赖,形成一个闭环。直接表现为两个service层互相调用对方。 此时会遇到以下问题&#xff1a; 2、报错&#xff1a; 当启动项目时&…

Smartbi 权限绕过漏洞复现(QVD-2023-17461)

0x01 产品简介 Smartbi大数据分析产品融合BI定义的所有阶段&#xff0c;对接各种业务数据库、数据仓库和大数据分析平台&#xff0c;进行加工处理、分析挖掘和可视化展现&#xff1b;满足所有用户的各种数据分析应用需求&#xff0c;如大数据分析、可视化分析、探索式分析、复杂…

odoo-033 比较 float 浮点数大小之精度坑

文章目录 前提原因问题 前提 产品单位精确到6位小数生产制造模块&#xff0c;重写了完成的方法&#xff0c;在点击完成的时候报错如下&#xff1a; &#xff08;解释下&#xff1a;就是很奇怪&#xff0c;明明都是必填字段&#xff0c;也都赋值了但是就是拿不到值&#xff09;…

2.若依前后端分离版第一个增删查改

1.介绍 若依提供了代码生成功能&#xff0c;单表的CRUD可以直接用若依框架提供的代码生成进行创建。 2.实现 2.1 在数据库创建业务表test_teacher 2.2 生成代码 运行系统&#xff0c;进入菜单[系统工具]-》[代码生成],点击导入按钮&#xff0c;选择需要生成代码的表进行导…

Redis储存结构

Redis怎么储存的 这个redisDb是数据库对象 里面的其他字段忽略了 然后里面有个dict列表(字典列表) 我们随便来看一个redisObject 区分一下子啊 他这个dict里面没有存redisObject的对象 也没有存dict对象 它只是存了个数据指针 你看那个redis每个底层编码 抠搜的 这块要是再保存…

信道复用技术

信道划分介质访问控制将使用介质的每个设备与来自同一通信信道上的其他设备的通信隔离开来&#xff0c;把时域和频域资源合理地分配给网络上的设备 多路复用&#xff1a;就是将多个信号组合在一条物理信道上进行传输&#xff0c;使多个计算机或终端设备共享信道资源&#xff0c…

分班查询系统学生信息在线采集方法和具体操作教程

作为教师&#xff0c;特别是临近新学年&#xff0c;我们经常需要进行学生分班工作&#xff0c;这是一项繁琐但非常重要的工作。为了提高工作效率&#xff0c;我们可以利用易查分轻松生成一个学生分班查询系统。本文将介绍如何利用易查分设计和开发这样一个系统。 我们可以选择使…

vue+element 下载压缩包和导出

export function goodsInspectionReportDwnloadZip (params) {return axios({url: "/warehouse-entry-server/v1/goodsInspectionReport/downloadZip",method: "get",params,responseType: "blob"}) } //下载handleDownloadFile() {if (!this.$r…

【LeetCode】删除并获得点数

删除并获得点数 题目描述算法分析编程代码空间优化 链接: 删除并获得点数 题目描述 算法分析 编程代码 class Solution { public:int deleteAndEarn(vector<int>& nums) {const int N 10001;int arr[N] {0};for(const auto& n : nums){arr[n]n;}vector<in…

小红书数据分析丨现实版模拟人生,这届网友热衷于“云开店”?

近期&#xff0c;小红书出现的一个神秘的热心群体&#xff0c;他们经常活跃在各种小店店主发布的求助帖评论区中&#xff0c;积极地帮助店主出谋划策&#xff0c;寻找小店经营的优化之道&#xff0c;成功帮助小店成功转亏为盈&#xff01;江湖人称一一云股东。小红书话题#爱上帮…

微信小程序启动自动检测版本更新,检测到新版本则提示更新

UpdateManager 对象&#xff0c;用来管理更新&#xff0c;可通过 wx.getUpdateManager 接口获取实例 在app.js中的示例代码 onShow() {// 获取小程序更新机制的兼容&#xff0c;由于更新的功能基础库要1.9.90以上版本才支持&#xff0c;所以此处要做低版本的兼容处理if (wx.c…

java serialport 串口助手源码 RXTX java 11还崩溃。java串口支持jdk11,jdk13,jdk14版本win10 64位系统bug修复库nrjavaserial好用

Java提供了一些API来支持串口通信。主要包括&#xff1a; javax.comm&#xff1a;Java Communications API&#xff0c;是一个用于串行通信的Java API。然而&#xff0c;这个API已经很长时间没有更新了&#xff0c;而且只支持32位的Windows系统。官网已经删。 RXTX&#xff1a;…

成功解决Linux下中文乱码问题,CentOS7设置系统字符编码

在linux中&#xff0c;可以使用以下命令查看当前系统的字符编码&#xff1a; echo $LANG 如果不是UTF-8&#xff0c;就会出现中文乱码现象! 解决办法&#xff1a;设置字符编码环境变量为utf-8 1. 打开 ~/.bashrc 或 ~/.bash_profile 文件 vi ~/.bashrc 或 vi ~/.bash_prof…

北航基于openEuler构建工业机器人操作系统,打造“开箱即用”的机器人基础软件平台

北京航空航天大学是国家“双一流”建设高校&#xff0c;以建设扎根中国大地的世界一流大学为发展目标。北京航空航天大学在机器人领域一直处于行业前沿&#xff0c;以其亮眼的成果和优秀的师资力量&#xff0c;成为国内机器人领域的重要参与者和建设者。机器人操作系统是机器人…

根证书和中间证书有什么区别?

通常即使是获取了SSL证书的人&#xff0c;也只知道他们需要SSL证书&#xff0c;而且他们必须在服务器上安装SSL证书&#xff0c;才能通过HTTPS为网站提供服务。当进一步提到中间证书、根证书时&#xff0c;大多数人都感到陌生。本文小编就将为您介绍根证书与中间证书的定义以及…