Web Workers 調用 API,減輕主執行緒負擔

閱讀時間約 5 分鐘

本篇要解決的問題

這陣子,不知道是不是演算法的關係,看到的文章很常出現「Web Workers」這個詞,查了一下後發現,Web Workers 是一個連 IE10 都支援的功能,看來是歷史悠久牌子老、街頭巷尾都稱讚的 API,就想說來看一下。

看完幾篇教學文,發現應該再早點知道的,可以處理工作上遇到的一些問題。

Web Workers 可以解決的問題,August 想到的有以下:

  • 調用回應時間比較長的 API
  • 在背後收集使用者的行為
  • 想提前載入頁面上其它區塊會需要的資料

總之,就是可以把一些處理時間較長、不必要在頁面一載入就撈取的資料,丟給另一條執行緒去處理,不讓主執行緖有阻塞,進而減少使用者在操作上會有的卡頓感。

本篇會先簡單說明什麼是 Web Workers,接著是使用方法,以及附上 August 最想應用的方式:調用 API 的 Demo。


簡單解釋 Web Workers

本段最後會提供的參考資源,把 Web Workers 都解釋得很清楚了,所以這段的說明,會用 August 的方式來簡單形容。

我們假設瀏覽器是一間便利商店,這間便利商店因為慣老闆的原因(咦?),只有一位員工,這位員工就是 JS 的主執行緒。超商員工是很辛苦的,又要上架商品、又要結帳、又要煮咖啡、又要幫顧客找網購的商品,然後薪水才這麼一點(哎這樣說好嗎?)

通常,「找網購商品」這件事是耗時最久的,因為員工要在一堆的包裹裡找到特定顧客的那件,耗掉的時間有可能會阻礙結帳,讓結帳的人流排到店門口。而這件事就是網頁上最常發生的調用 API,是不是很像?在 API 回應我們特定需要的資料前,我們就只能等,還什麼事情都不能做。

後來,老闆覺得這樣累績負面評價有害公司的名聲(如:讀取時間會影響 SEO 排名),所以他選擇了最快的解決方式:再找一位員工來,讓他在後面協助處理找包裹這件事,如果煮咖啡也覺得久,那就讓他順便處理煮咖啡好了。這位新來的員工,就是這篇在講的 Web Workers。

Web Workers,就是在網頁上除了 JS 主執行緒之外的另一條執行緒。

參考資源:


Web Workers 使用

Web Workers 的使用方式很簡單,整理成下圖:

Web Workers 使用說明

Web Workers 使用說明

網頁的 JS 跟 Web Workers 溝通的方式就是 postMessageonmessage

postMessage 是傳送資料。

onmessage 是接收資料。

我們先看網頁上的主要 JS,我們命名為 main.js。

main.js

worker = new Worker('worker.js');

// 傳送資料
work.postMessage({ name: 'August' });

// 接收 Web Workers 來的資料
worker.onmessage = e => {const data = e.data;console.log(data);}

接著來看 Web Workers 的內容,我們命名為 work.js。

work.js

importScripts('https://cdnjs.cloudflare.com/ajax/libs/axios/1.6.0/axios.min.js');

// 接收資料
self.onmessage = e => {
const data = e.data;
if(data) {
const result = axios.post(...); // 調用 API
self.postMessage(result); // 傳送資料
}
}


是的,你沒看錯,我也沒寫錯,work.js 在 importScript 時,可以引用 CDN,而且寫程式的方式可以用 ES6。

這點因為看的教程上都沒有,是問了 ChatGPT 後,再透過實作去嘗試才知道的。


Web Workers 使用範例:調用 API

最後這段,是 August 寫了一個 Demo,讓 Web Workers 來處理調用 API 的部份,然後回傳給主執行緒,讓網頁上呈現結果。

完整的原始碼已放上 GitHub,不過有一段 August 想列出來,就是 Web Workers 處理 API 的部份。

原本 August 自己寫了一個,結果丟給 ChatGPT 看,想問它還有沒有可以優化的地方,殊不知,它就給了一個加上「限制最大請求數」的方式,覺得這樣子的方式更符合實際需求,就採用了。


Demo、原始碼

本篇的 Demo 跟原始碼,都放上 GitHub,取用前請分享此篇文章,或對 GitHub 專案點個星星,你的小小舉動,對本站都是大大的鼓勵。

Demo:https://letswritetw.github.io/letswrite-web-workers/

原始碼:https://github.com/letswritetw/letswrite-web-workers

9會員
19內容數
沙龍到底是…做什麼用的勒?
留言0
查看全部
發表第一個留言支持創作者!
Let's Write 的沙龍 的其他內容
本篇介紹了一個名為 DOMPurify 的套件,它可以增加網站對 XSS 攻擊的防護力。DOMPurify 可以幫助開發人員過濾和清除不受信任的輸入,以防止 XSS 攻擊。本文提供了 DOMPurify 的安裝和使用方法,並提供了一個範例 Demo 供參考。
本篇大綱:本篇要解決的問題。用 Docker 安裝 Verdaccio。上傳 package。使用 package。刪除 package。修改 config.yml。改變 CSS。
本篇大綱:本篇要解決的問題。取得 Postman Collection Access Key。Google Apps Script 上寫備份程式碼。設定自動備份。
這篇文章教你如何在本機使用 Gitea 架設 Git Server。內容涵蓋了安裝 Docker、設定和安裝 Gitea 的 dokcer-compose.yml、Gitea 的安裝流程,以及如何刪除安裝的 Gitea。文章也包含了一個 Docker 的彩蛋,教你如何清理安裝或未清理的緩存。
深入了解使用 Cookie 實現客戶端數據存儲的技巧和最佳實踐。本文詳細解釋了 Cookie 的基本概念、限制、原生寫法,並推薦了一個實用的 JavaScript Cookie 套件,附帶實用 Demo 和原始碼。
探討如何免費建立自己的網站,結合 WordPress 和 Cloudflare Pages。文章涵蓋從本機安裝 WordPress、產出靜態檔案,到將檔案部署到 Cloudflare Pages 的完整流程,並探討其優點和缺點。
本篇介紹了一個名為 DOMPurify 的套件,它可以增加網站對 XSS 攻擊的防護力。DOMPurify 可以幫助開發人員過濾和清除不受信任的輸入,以防止 XSS 攻擊。本文提供了 DOMPurify 的安裝和使用方法,並提供了一個範例 Demo 供參考。
本篇大綱:本篇要解決的問題。用 Docker 安裝 Verdaccio。上傳 package。使用 package。刪除 package。修改 config.yml。改變 CSS。
本篇大綱:本篇要解決的問題。取得 Postman Collection Access Key。Google Apps Script 上寫備份程式碼。設定自動備份。
這篇文章教你如何在本機使用 Gitea 架設 Git Server。內容涵蓋了安裝 Docker、設定和安裝 Gitea 的 dokcer-compose.yml、Gitea 的安裝流程,以及如何刪除安裝的 Gitea。文章也包含了一個 Docker 的彩蛋,教你如何清理安裝或未清理的緩存。
深入了解使用 Cookie 實現客戶端數據存儲的技巧和最佳實踐。本文詳細解釋了 Cookie 的基本概念、限制、原生寫法,並推薦了一個實用的 JavaScript Cookie 套件,附帶實用 Demo 和原始碼。
探討如何免費建立自己的網站,結合 WordPress 和 Cloudflare Pages。文章涵蓋從本機安裝 WordPress、產出靜態檔案,到將檔案部署到 Cloudflare Pages 的完整流程,並探討其優點和缺點。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
本篇文章探討了元宇宙在Web4.0中的應用,將虛擬現實(VR)、區塊鏈、增強現實(AR)等技術整合,並解析其如何影響虛擬經濟、社交互動及教育訓練等方面。探討物理與虛擬世界的無縫連接,以及用戶在這一環境中的數據擁有權與交互體驗。這些技術將重塑未來網絡環境,提供更具沉浸感的體驗。
Thumbnail
Inpaint-web 免費開源的 AI 圖像擦除與放大工具,在用戶端瀏覽器載入模型,處理過程都在本機裝置上執行。完全免費,無須註冊也沒有限制次數,簡單塗抹標記即可擦除該區域的影像,輸出圖片會保留原來尺寸,還可將圖片解析度放大四倍。
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
作為一個非常不專業的前端初學者,有陣子常常卡在公司官網,要插入 Youtube 影片無法RWD(響應式)的問題。 跟不熟悉 網頁技術的朋友們介紹,RWD 就是指網頁的排版能跟著螢幕的大小縮放、變化編排,在這個人手一機的時代,特別重要。
Thumbnail
Service Worker 是用於客戶端的攔截器,可以使用 Cache Storage 和 IndexDB,並有自己的生命週期。Web Worker 用於處理可能會使用到大量運算且不希望影響到使用者體驗的任務。Shared Worker 可以在相同 Domain 的不同頁面上共享訊息。
Thumbnail
Web Workers主要提供簡單的API讓網頁在背景執行緒中執行程式而不干擾使用者的操作。 javascript主要功能是與user操作頁面互動及操作dom,試想若使用多執行緒的概念,那麼一個動作是新增至某個dom節點,另一個動作則是修改該dom節點,此時瀏覽器應該使用哪個動作為準? 所以為了避免
Thumbnail
Service worker與Web workers相同,也都是一段運行在瀏覽器後台的腳本,提供一些不需要與頁面直接交互的功能(操作dom),主要處理網路相關的問題,可以攔截網路請求進行相對應的優化動作,我們把它想像成與伺服器之間的代理服務器可能會比較容易理解,當網路環境不佳時便回應快取資源,待網路
Thumbnail
還記得連千毅事件一發生,NFT從2022年初的神壇位置就開始動搖,再到Luna崩盤, 一路整個WEB3好像都從未來趨勢,在大眾眼中轉成詐騙集團。 其實認真平心靜氣地了解過WEB 3的商業模式就知道,這些來的一點都不突然 - 當然,或許這一切發生的不會這麼快。 總是很多人笑,賺錢的叫做NFT,不賺錢的
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
本篇文章探討了元宇宙在Web4.0中的應用,將虛擬現實(VR)、區塊鏈、增強現實(AR)等技術整合,並解析其如何影響虛擬經濟、社交互動及教育訓練等方面。探討物理與虛擬世界的無縫連接,以及用戶在這一環境中的數據擁有權與交互體驗。這些技術將重塑未來網絡環境,提供更具沉浸感的體驗。
Thumbnail
Inpaint-web 免費開源的 AI 圖像擦除與放大工具,在用戶端瀏覽器載入模型,處理過程都在本機裝置上執行。完全免費,無須註冊也沒有限制次數,簡單塗抹標記即可擦除該區域的影像,輸出圖片會保留原來尺寸,還可將圖片解析度放大四倍。
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
作為一個非常不專業的前端初學者,有陣子常常卡在公司官網,要插入 Youtube 影片無法RWD(響應式)的問題。 跟不熟悉 網頁技術的朋友們介紹,RWD 就是指網頁的排版能跟著螢幕的大小縮放、變化編排,在這個人手一機的時代,特別重要。
Thumbnail
Service Worker 是用於客戶端的攔截器,可以使用 Cache Storage 和 IndexDB,並有自己的生命週期。Web Worker 用於處理可能會使用到大量運算且不希望影響到使用者體驗的任務。Shared Worker 可以在相同 Domain 的不同頁面上共享訊息。
Thumbnail
Web Workers主要提供簡單的API讓網頁在背景執行緒中執行程式而不干擾使用者的操作。 javascript主要功能是與user操作頁面互動及操作dom,試想若使用多執行緒的概念,那麼一個動作是新增至某個dom節點,另一個動作則是修改該dom節點,此時瀏覽器應該使用哪個動作為準? 所以為了避免
Thumbnail
Service worker與Web workers相同,也都是一段運行在瀏覽器後台的腳本,提供一些不需要與頁面直接交互的功能(操作dom),主要處理網路相關的問題,可以攔截網路請求進行相對應的優化動作,我們把它想像成與伺服器之間的代理服務器可能會比較容易理解,當網路環境不佳時便回應快取資源,待網路
Thumbnail
還記得連千毅事件一發生,NFT從2022年初的神壇位置就開始動搖,再到Luna崩盤, 一路整個WEB3好像都從未來趨勢,在大眾眼中轉成詐騙集團。 其實認真平心靜氣地了解過WEB 3的商業模式就知道,這些來的一點都不突然 - 當然,或許這一切發生的不會這麼快。 總是很多人笑,賺錢的叫做NFT,不賺錢的