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會員
17內容數
沙龍到底是…做什麼用的勒?
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
創作者要怎麼好好休息 + 避免工作過量?《黑貓創作報#4》午安,最近累不累? 這篇不是虛假的關心。而是《黑貓創作報》發行以來可能最重要的一篇。 是的,我們這篇講怎麼補充能量,也就是怎麼休息。
Thumbnail
avatar
黑貓老師
2024-06-29
【Web 3.0】🎊語言學習沙龍🎊開張了!|2023 主題:「AI」「ChatGPT」🔥🔥火紅的 AI聊天機器人 ChatGPT 如何幫助「語言學習」?!
Thumbnail
avatar
Yao-Xiang Huang
2023-05-30
【Web微知識系列】 Web WorkersWeb Workers主要提供簡單的API讓網頁在背景執行緒中執行程式而不干擾使用者的操作。 javascript主要功能是與user操作頁面互動及操作dom,試想若使用多執行緒的概念,那麼一個動作是新增至某個dom節點,另一個動作則是修改該dom節點,此時瀏覽器應該使用哪個動作為準? 所以為了避免
Thumbnail
avatar
阿Han
2023-04-23
【Web微知識系列】 Service WorkersService worker與Web workers相同,也都是一段運行在瀏覽器後台的腳本,提供一些不需要與頁面直接交互的功能(操作dom),主要處理網路相關的問題,可以攔截網路請求進行相對應的優化動作,我們把它想像成與伺服器之間的代理服務器可能會比較容易理解,當網路環境不佳時便回應快取資源,待網路
Thumbnail
avatar
阿Han
2023-04-23
WEB 3 的商業價值 | 談談WEB 2.5的興起還記得連千毅事件一發生,NFT從2022年初的神壇位置就開始動搖,再到Luna崩盤, 一路整個WEB3好像都從未來趨勢,在大眾眼中轉成詐騙集團。 其實認真平心靜氣地了解過WEB 3的商業模式就知道,這些來的一點都不突然 - 當然,或許這一切發生的不會這麼快。 總是很多人笑,賺錢的叫做NFT,不賺錢的
Thumbnail
avatar
酒吧七 反思世界道理並快樂的活著
2022-11-15
Web 3.0 系列 III - 跟著 FinTech 樞紐新加坡學習設計金融服務 (其他金融領域)當談到賦權,所有區塊鏈參與者都可以帶動網絡的發展,因此與其思考如何消滅競爭者,倒不如鼓勵合作。
Thumbnail
avatar
Neverlandseeker SC
2022-02-24
Web 3.0 系列 II - 跟著 FinTech 樞紐新加坡學習設計金融服務 (個人金融市場)我個人認為至少在未來的 5~10 年,金融機構仍可以打出「絕對的信任」這張王牌保住客戶。加上如同我在另一篇《關於 AI 和 ML 在開放銀行的運用,你不可不知的二三事》一文所分享的,即便目前客戶大多傾向享受開放金融帶來的便利,普羅大眾仍對分享自身數據有諸多懷疑。
Thumbnail
avatar
Neverlandseeker SC
2022-01-17
Web 3.0 系列 I - 跟著 FinTech 樞紐新加坡學習設計金融服務 (保險市場)除了最近特斯拉剛宣布要用客戶的駕駛行為分數來決定其保險費用,在未來,我們可能會看到更多的保險公司透過 IoV 車聯網紀錄你開車時的一舉一動,或是透過量子計算啟動智慧合約...
Thumbnail
avatar
Neverlandseeker SC
2021-12-30
Web瀏覽器的 Same-origin policy (同源政策)同源政策是瀏覽器基於安全性考量而存在的一個政策,針對瀏覽器指令碼的限制。
avatar
Vic Lin
2020-10-07
Web Design Hong Kong - MiracleWeb design Agency Miracle Hong Kong understands the importance of a website design that works and converts your target audience into customers. We hav
avatar
Marlon Francis
2020-03-18