心智圖資源庫 Web Worker
web worker的理解與使用,Web Worker 是HTML5提供並規範的一套API,它為JavaScript創造了一個多執行緒的運行環境。
編輯於2024-03-08 16:53:42This is a mind map about bacteria, and its main contents include: overview, morphology, types, structure, reproduction, distribution, application, and expansion. The summary is comprehensive and meticulous, suitable as review materials.
This is a mind map about plant asexual reproduction, and its main contents include: concept, spore reproduction, vegetative reproduction, tissue culture, and buds. The summary is comprehensive and meticulous, suitable as review materials.
This is a mind map about the reproductive development of animals, and its main contents include: insects, frogs, birds, sexual reproduction, and asexual reproduction. The summary is comprehensive and meticulous, suitable as review materials.
This is a mind map about bacteria, and its main contents include: overview, morphology, types, structure, reproduction, distribution, application, and expansion. The summary is comprehensive and meticulous, suitable as review materials.
This is a mind map about plant asexual reproduction, and its main contents include: concept, spore reproduction, vegetative reproduction, tissue culture, and buds. The summary is comprehensive and meticulous, suitable as review materials.
This is a mind map about the reproductive development of animals, and its main contents include: insects, frogs, birds, sexual reproduction, and asexual reproduction. The summary is comprehensive and meticulous, suitable as review materials.
Web Worker
Web Worker的誕生
眾所周知,js最初設計是運行在瀏覽器中的
為了防止多個執行緒同時操作DOM,帶來渲染衝突問題,所以js執行器被設計成單執行緒
隨著前端技術的發展,當遇到需要大量運算的場景時,js執行緒往往會被長時間阻塞,甚至造成頁面卡頓,影響使用者體驗
了解 Web Worker
什麼是 Web Worker?
Web Worker 是 HTML5 標準的一部分
定義了一套 API,讓我們在 js 主執行緒之外開闢新的 Worker 線程,並將一段 js 腳本運行其中
賦予了開發者利用 js 操作多執行緒的能力
即使腳本執行了很長時間,Web 應用程式的 UI 仍然可以保持回應
Web Worker 的優點
提高頁面效能:在後台線程中執行一些計算密集型或耗時的操作,如資料處理、圖像處理等,而不會佔用主線程,從而避免了頁面卡頓或卡死的情況,提高了頁面的性能和響應速度。
處理大規模數據:可以處理大規模的數據,因為它們在單獨的執行緒中運行,不會影響主執行緒的運行,可以更有效率地處理大規模的數據,提高了程式碼的效率和可擴展性。
使程式碼更加模組化:可以將程式碼分割成多個模組,分別運行在不同的執行緒中,從而使得程式碼更加模組化,可維護性和可讀性更強。
支援多線程:支援多線程,因此可以利用多核心處理器的優勢,提高程式碼的運行效率。
Web Worker的使用場景
影像處理:如旋轉、裁切、縮放、濾鏡等。這可以提高影像處理的效能和反應速度。
資料處理:如資料集的過濾、排序、歸納、轉換等。這可以提高數據處理的效率和準確性。
計算密集型任務:如模擬、最佳化、預測、統計等。這可以提高計算任務的速度和精度。
即時通訊:如聊天室、遊戲、視訊會議等。這可以提高即時通訊的穩定性和效能。
離線快取:可以將常用的資源預先下載到客戶端本機快取中,並在無法存取網際網路時使用快取中的資源。這可以提高應用程式的可用性和響應速度,尤其是在行動裝置上。
多執行緒處理:如平行計算、任務分發、負載平衡等。這可以提高系統的並發性和可擴展性。
Web Worker 使用
建立 Worker: 只需要透過 new 呼叫 Worker() 建構函式即可,它接收兩個參數:const worker = new Worker(path, options);
js 主執行緒與 worker 執行緒資料傳遞:主執行緒與 worker 執行緒都是透過 postMessage 方法來傳送訊息,以及監聽 message 事件來接收訊息
主執行緒與 worker 執行緒之間的資料傳遞是傳值而不是傳送位址。因此即使傳遞的是一個Object,並且直接傳遞回來,接收到的也不是原來的那個值了。
監聽錯誤訊息:web worker 提供兩個事件監聽錯誤
error:當worker內部出現錯誤時觸發
messageerror:當 message 事件接收到無法被反序列化的參數時觸發
關閉Worker執行緒:worker 執行緒的關閉在主執行緒和 worker 執行緒都能進行操作,但對 worker 執行緒的影響略有不同
相同點:無論是在主執行緒關閉 worker,或是在 worker 執行緒內部關閉 worker,worker 執行緒目前的 Event Loop 中的任務會繼續執行
不同點:在主執行緒手動關閉worker,主執行緒與worker 執行緒之間的連線都會立刻停止,即使worker 執行緒目前的Event Loop 中仍有待執行的任務繼續呼叫postMessage() 方法,但主執行緒不會再接收到訊息。 在 worker 執行緒內部關閉 worker,不會直接斷開與主執行緒的連接,而是等待 worker 執行緒目前的 Event Loop 所有任務執行完,再關閉。也就是說,在目前 Event Loop 中繼續呼叫 postMessage() 方法,主執行緒還是能透過監聽message事件收到訊息的。
Worker 線程引用其他js文件
web worker在 worker 執行緒中提供了 importScripts() 方法來載入我們需要的js文件,而且,透過此方法載入的js文件不受同源策略約束
ESModule 模式:js 檔案為ESModule 模式時,importScripts() 匯入檔案會失敗,此時需要用const worker = new Worker('/worker.js', {type: 'module'})指定檔案類型,然後就能用import方式引入了
主線程和 worker 線程可傳遞哪些類型數據
Error和Function物件以及Dom節點無法傳遞
SharedWorker
是一種特殊類型的 Worker,可以被多個瀏覽上下文訪問,例如多個 windows,iframes 和 workers,但這些瀏覽上下文必須同源
實作於一個不同於普通 worker 的接口,具有不同的全域作用域:SharedWorkerGlobalScope ,但是繼承自WorkerGlobalScope
與worker的區別:主線程與SharedWorker 線程是透過MessagePort建立起鏈接,資料通訊方法都掛載在SharedWorker.port上,如果採用addEventListener 來接收message 事件,那麼在主執行緒初始化SharedWorker() 後,也要調用SharedWorker.port.start() 方法來手動開啟端口,但是如果採用onmessage 方法,則預設開啟端口,不需要再手動調用SharedWorker.port.start()方法
注意:在 sharedWorker 線程裡使用 console 列印訊息,不會出現在主線程的的控制台中
調試 sharedWorker,需要在 Chrome 瀏覽器輸入 chrome://inspect/ ,這裡能看到所有正在運行的 sharedWorker,然後開啟一個獨立的 dev-tool 面板
相容性
web workers 已經被大多數瀏覽器支持,使用上基本上不用考慮相容問題
sharedWorker 在 Safari 以及行動裝置的相容性不是很好,使用時還需注意