開始之前您需要了解的有關 Web Worker 的所有資訊。
最近我一直在研究 Web Worker,這是一份全面的指南,涵蓋了開始使用 Web Worker 所需了解的所有內容。
如果您想跳過閱讀部落格並查看程式碼,這裡是包含所有程式碼片段的 github 儲存庫。
Github Web Worker 儲存庫
目錄
- 常見誤解
-
Web Worker 基本設定
- 使用本機 JavaScript 設定 Web Worker
- 使用 Comlink 設定 Web Workers
- 如何檢查我的工人是否已正確註冊?
- 延伸閱讀
常見的誤解
所以,促使我探索 Web Workers 的原因是,在我建立的平台中,一項計算繁重的任務會阻塞 UI。
所以我想,『嗯,好吧,我該如何讓它不阻塞 UI』?我是否應該使用 setTimeout 來確保主線程中的所有程式碼都已執行完畢,然後才能運行計算量大的任務?
所以這是一個誤解-使用setTimeout並不代表UI不會被阻塞。是的,主執行緒上的所有內容都會在 setTimeout 回呼運行之前執行,但是,當該回呼從巨集任務佇列中彈出時,它會在主執行緒本身中運行,從而使 UI 無回應。
要了解更多有關 setTimeout 如何運作的信息,請參考一些參考資料 —
- 從頭開始的非同步 JavaScript 和事件循環 - Akshay Saini
- 事件循環、Web API、任務佇列 - Lydia Hallie
Web Worker 基本設定
JavaScript 本質上是一種“單執行緒語言”,但是 Web Worker 使我們能夠在單獨的執行緒中運行計算量大的程式碼。
在開始之前,有幾件事要注意 -
- Web Worker 無法與 DOM 互動
- Web Worker 作用域是 self,而不是 window。
- Workers 相對較重,不適合大量使用。例如,為四兆像素影像的每個像素啟動一名工作人員是不合適的。 [參考 - HTML 規範]
- 此外,Web Worker 並不是要讓某件事需要 2 秒而不是 4 秒,而是要在 DOM 凍結 0 秒的情況下完成這件事。 [參考 - Web Workers 很慢,沒關係 - Calvin Metcalf]
- 工作人員可能會產生新的工作人員,只要這些工作人員託管在與父頁面相同的來源中。 [參考 - MDN]
使用原生 JavaScript 的 Web Worker
- 建立一個新的 JavaScript 文件,其中包含要在工作執行緒中執行的程式碼。 (如worker.js)
- 在主腳本中實例化worker -
const worker = new Worker("./worker.js")
注意:worker.js 不是一個模組,不能使用 import 語句。然而。 :')
要將worker.js當作模組,請在建構子的選項中指定type: module。
const worker = new Worker("./worker.js")
- 資料透過訊息系統在工作人員之間發送 - 雙方都使用 postMessage() 方法發送訊息,並透過 onmessage 事件處理程序回應訊息
- 要在 postMessage() 中傳遞具有循環參考的複雜對象,請使用 StructuredClone 方法。
- 要終止 Web Worker,請使用 Worker API 的終止方法。這並不為工人提供完成其正在進行的操作的機會;它立即停止。
const worker = new Worker('./worker.js', { type: 'module' })
把它們放在一起
現在,讓我們看看整合 Web Worker 後我們的程式碼是什麼樣子。
主執行緒程式碼:
worker.terminate()
工作執行緒程式碼:
// ... function workerFunction() { // Don't spin up a new worker instance if the process has already been started. if (statusElement.textContent !== PROCESS_STATUS.PROCESSING && window.Worker) { const worker = new Worker('./worker.js', { type: 'module' }) // Sending 10000000000000 to the web worker worker.postMessage(10000000000000) statusElement.textContent = PROCESS_STATUS.PROCESSING // This piece of code is executed after worker finishes its task and returns data. worker.onmessage = function (event) { statusElement.textContent = event.data } } } // ...
結果:
當我們執行應用程式時,您會注意到執行計算量大的任務時不會阻塞 UI。
使用 Comlink 設定 Web Worker
Comlink 是一個小型庫(1.1kB),它消除了思考 postMessage 邏輯的心理障礙。
在更抽象的層面上,它是 postMessage 和 ES6 代理程式的 RPC 實作。
我使用 Comlink 的一個具體原因是我無法使用純 JavaScript 將函數從主執行緒傳遞到工作執行緒。使用 Comlink 的代理,我能夠輕鬆地將回呼函數從主執行緒傳遞到工作執行緒。 [參考此部分]
要開始在專案中使用 comlink,請安裝庫
const worker = new Worker("./worker.js")
要開始使用這個函式庫,我們需要了解以下這些方法 -
Comlink.wrap(端點)
- 它包裝工作人員公開的對象,返回一個代理,您可以像本地對像一樣與之交互。
- 代理將具有公開值的所有屬性和功能,但存取和呼叫本質上是非同步的。即,如果函數傳回一個數字,它現在將傳回該數字的承諾。
const worker = new Worker('./worker.js', { type: 'module' })
Comlink.expose(值、端點?、allowedOrigins?)
- 暴露函數將值從一個執行緒暴露給另一個執行緒(即將物件從工作執行緒暴露給主執行緒)
worker.terminate()
如何檢查我的工人是否已正確註冊?
- 檢查工作文件是否已在網頁瀏覽器中註冊(我使用的是 Chrome)
- 右鍵單擊→檢查,然後轉到來源面板,您將在其中找到工作文件。
- 終止後,工作文件不應在「來源」面板中可見
- 如果您在終止工作人員後仍然可以看到工作人員文件,那麼很可能您已經註冊了多個工作人員,但並非所有工作人員都已被終止。
延伸閱讀
以上是開始之前您需要了解的有關 Web Worker 的所有資訊。的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。
