超碰人人人人人,亚洲AV午夜福利精品一区二区,亚洲欧美综合区丁香五月1区,日韩欧美亚洲系列

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

[點(diǎn)晴永久免費(fèi)OA]詳解 WebWorker 的概念、使用場(chǎng)景、示例

admin
2025年1月10日 8:40 本文熱度 349


前言

提到 WebWorker,可能有些小伙伴比較陌生,不知道是做什么的,甚至不知道使用場(chǎng)景,今天這篇文章就帶大家一起簡(jiǎn)單了解一下什么是 webworker!

概念

WebWorker 實(shí)際上是運(yùn)行在瀏覽器后臺(tái)的一個(gè)單獨(dú)的線程,因此可以執(zhí)行一些耗時(shí)的操作而不會(huì)阻塞主線程。WebWorker 通過(guò)與主線程之間傳遞消息實(shí)現(xiàn)通信,這種通信是雙向的。WebWorker不能直接訪問(wèn) DOM,也不能使用像 window 對(duì)象這樣的瀏覽器接口對(duì)象,但可以使用一些WebWorker 標(biāo)準(zhǔn)接口和 Navigator 對(duì)象的部分屬性和方法。

為什么使用WebWorker?

  1. 提高應(yīng)用響應(yīng)能力:主線程被獨(dú)占執(zhí)行一些耗時(shí)的計(jì)算或操作時(shí),會(huì)導(dǎo)致UI無(wú)響應(yīng)。WebWorker 可以把這些任務(wù)轉(zhuǎn)移到后臺(tái)線程,從而保證主線程的運(yùn)行,提高應(yīng)用的響應(yīng)能力。

  2. 充分利用多核CPU:現(xiàn)代CPU都是多核的,WebWorker 可以讓 Web 應(yīng)用利用多核 CPU 的并行計(jì)算能力,充分發(fā)揮計(jì)算機(jī)硬件性能。

  3. 避免渲染阻塞:JavaScript 運(yùn)行在主線程,如果主線程一直占用,就無(wú)法執(zhí)行 GUI 渲染任務(wù),導(dǎo)致界面渲染受阻。WebWorker 把一些費(fèi)時(shí)任務(wù)分流到后臺(tái)線程就可以避免這一問(wèn)題。

  4. 后臺(tái)持續(xù)運(yùn)行:WebWorker 所在后臺(tái)線程可持續(xù)運(yùn)行,即使頁(yè)面被掛起或最小化,任務(wù)仍在后臺(tái)執(zhí)行,非常適合一些需要長(zhǎng)時(shí)間運(yùn)行的操作。

使用場(chǎng)景

一般來(lái)說(shuō),當(dāng)遇到如下幾種情況時(shí)可以考慮使用 WebWorker:

  1. 大量數(shù)據(jù)的計(jì)算/處理:比如圖像處理、數(shù)據(jù)分析等

  2. 長(zhǎng)時(shí)間運(yùn)行的操作:如一些復(fù)雜的數(shù)學(xué)計(jì)算

  3. 非阻塞式操作:希望執(zhí)行一些耗時(shí)操作時(shí)不阻塞主線程

示例

假設(shè)我們有一個(gè)需要計(jì)算斐波那契數(shù)列的任務(wù),我們可以使用 Web Worker 來(lái)進(jìn)行計(jì)算,以避免阻塞主線程。以下是一個(gè)簡(jiǎn)單的示例:

?主線程

主線程創(chuàng)建 worker 實(shí)例,向子線程通過(guò) postMessage 發(fā)送消息,通過(guò) onmessage 監(jiān)聽(tīng)子線程返回的數(shù)據(jù)。

  1. const myWorker = new Worker('./worker.js')

  2. myWorker.onmessage = function (e) {
  3. console.log('Fibonacci result:', e.data)
  4. }

  5. myWorker.postMessage(40) // 請(qǐng)求計(jì)算斐波那契數(shù)列的第40項(xiàng)

worker.js

在同級(jí)目錄下創(chuàng)建 worker.js文件,通過(guò) onmessage 接收主線程發(fā)來(lái)的數(shù)據(jù),計(jì)算后通過(guò)postMessage 將計(jì)算結(jié)果返回主線程。

  1. self.onmessage = function (e) {
  2. const n = e.data
  3. let a = 0,
  4. b = 1,
  5. temp
  6. for (let i = 2; i <= n; i++) {
  7. temp = a
  8. a = b
  9. b = temp + b
  10. }
  11. self.postMessage(b)
  12. }

運(yùn)行結(jié)果

可以看到主線程打印出 webworker 計(jì)算的運(yùn)行結(jié)果

Vue、React項(xiàng)目使用

接下來(lái)為大家演示 vue 以及 react 項(xiàng)目如何使用

Vue使用

vue版本:"vue": "^2.6.14",vue-cli版本:@vue/cli 5.0.8安裝 worker-loader

頁(yè)面使用

  1. <template><div>我的頁(yè)面</div></template>
  2. <script>
  3. export default {
  4. name: 'MyselfView',
  5. data() {
  6. return {
  7. worker: null,
  8. }
  9. },
  10. mounted() {
  11. // 創(chuàng)建 WebWorker 實(shí)例
  12. this.worker = new Worker(new URL('./worker.js', import.meta.url))
  13. console.log('worker: ', this.worker)
  14. this.worker.postMessage(40) // 請(qǐng)求計(jì)算斐波那契數(shù)列的第40項(xiàng)

  15. this.worker.addEventListener('message', (event) => {
  16. console.log('Fibonacci result:', event.data)
  17. })
  18. },
  19. beforeDestroy() {
  20. // 組件銷毀時(shí)終止 WebWorker
  21. this.worker.terminate()
  22. },
  23. }
  24. </script>

worker.js

  1. // worker.js
  2. self.addEventListener('message', (e) => {
  3. console.log('e: ', e)
  4. const n = e.data
  5. let a = 0,
  6. b = 1,
  7. temp
  8. for (let i = 2; i <= n; i++) {
  9. temp = a
  10. a = b
  11. b = temp + b
  12. }
  13. self.postMessage(b)
  14. })

效果 

React使用 

react版本: "react": "^18.2.0"

  1. import React, { useEffect } from 'react'
  2. // import WorkerScript from './worker.worker.js'

  3. const Demo = () => {
  4. useEffect(() => {
  5. const worker = new Worker(new URL('./worker.worker.js', import.meta.url))

  6. worker.onmessage = function (e) {
  7. console.log('Fibonacci result:', e.data)
  8. }
  9. worker.postMessage(40) // 請(qǐng)求計(jì)算斐波那契數(shù)列的第40項(xiàng)
  10. // 使用 worker ...
  11. return () => worker.terminate()
  12. }, [])

  13. return (
  14. <div>
  15. <p>count的值</p>
  16. </div>
  17. )

效果

注意

由于我們?cè)陧?xiàng)目開(kāi)發(fā)時(shí),使用不同的打包工具(vite/webpack)。幸運(yùn)的是,最新版的vite/webpack都支持Web Worker了。

我們可以通過(guò):new URL()的方式 --vite/webpack都支持

  1. new Worker(
  2. new URL(
  3. './worker.js',
  4. import.meta.url
  5. )
  6. );

總結(jié)

WebWorker是一種在 Web 應(yīng)用中實(shí)現(xiàn)多線程運(yùn)行的技術(shù),可以將耗費(fèi) CPU 的任務(wù)交給后臺(tái)線程處理,避免阻塞主線程,從而提高Web應(yīng)用的響應(yīng)性能和用戶體驗(yàn)。 總之,WebWorker的引入解決了Web應(yīng)用長(zhǎng)期以來(lái)在單個(gè)線程中運(yùn)行所帶來(lái)的諸多問(wèn)題,有效提升了Web應(yīng)用的運(yùn)行性能和用戶體驗(yàn)。


該文章在 2025/1/10 10:34:02 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved