過去三天我們介紹了 Service Worker 與 Dedicated Worker:
今天要登場的,是 Web Worker 家族的第三位成員——SharedWorker。
它的特色是:多個分頁可以共享同一個執行緒,非常適合用來同步狀態或共用連線資源。 🚀
類型 | 執行範圍 | 是否能被多頁共享 | 能否操作 DOM | 主要用途 |
---|---|---|---|---|
Dedicated Worker | 單一頁面 | ❌ 否 | ❌ 否 | 背景計算、重運算任務 |
SharedWorker | 多個分頁(同來源) | ✅ 是 | ❌ 否 | 多頁共享資料、統一連線或緩存 |
Service Worker | 網域層級 | ✅ 是 | ❌ 否 | 離線快取、攔截請求、推播通知 |
可以這樣理解:
Dedicated Worker:單頁助理,幫一個頁面處理重任務。
SharedWorker:團隊助理,讓多個頁面共用同一份資料。
Service Worker:守門員,幫整個網站攔截與快取請求。
想像一個情境:你開了同一個網站的兩個分頁(例如一個是聊天頁,一個是通知頁),這兩頁都需要連線到伺服器的 WebSocket。
如果用 Dedicated Worker,每一頁都會各自開一條連線,浪費資源。
但如果用 SharedWorker,它們可以共用同一個背景執行緒與連線,互相同步資料、節省頻寬。
// worker.js
const connections = [];
onconnect = function (e) {
const port = e.ports[0];
connections.push(port);
port.onmessage = (event) => {
console.log('收到訊息:', event.data);
// 將訊息廣播給所有連線中的頁面
connections.forEach((p) => p.postMessage(`[廣播] ${event.data}`));
};
port.start(); // 開始監聽
};
// main.js
const worker = new SharedWorker('./worker.js');
const port = worker.port;
port.onmessage = (e) => {
console.log('收到來自 SharedWorker 的訊息:', e.data);
};
port.start();
// 傳送資料給 SharedWorker
port.postMessage('Hello from Page A!');
開啟兩個同來源頁面,開啟 console 就會看到兩邊互相廣播的結果 ✨
不同分頁(或 iframe)只要屬於相同 origin(協定、網域、port 相同),就能共用同一個 SharedWorker 實例。
這表示:
port
溝通(不是 postMessage()
)SharedWorker 必須透過 MessagePort
進行雙向傳遞。每個頁面都要呼叫 port.start()
,否則不會接收訊息。
這點與 Dedicated Worker 的 worker.onmessage
最大不同。
localStorage
監聽(可用 BroadcastChannel 作為替代)。場景 | 說明 |
---|---|
WebSocket 共享連線 | 多頁面共用一條連線,節省伺服器壓力與頻寬。 |
多頁資料同步 | 分頁 A 登入、分頁 B 即時更新登入狀態。 |
集中快取處理 | 讓多頁共享同一份 IndexedDB 或計算結果。 |
協作應用 | 如線上編輯器或聊天室,可透過 SharedWorker 廣播更新狀態。 |
想直接體驗 SharedWorker 多分頁共享的神奇效果,可以參考這個線上範例 - 多分頁共享計數器:⏱️
記得開啟多個分頁測試,你會看到所有分頁的計數器即時同步!一定要試試看喔~🎉
SharedWorker 能讓多分頁共享同一個執行緒,但在實務上仍屬於少數人使用的技術。
主要不是因為它不好,而是「相容性、需求量與生態成熟度」讓它顯得相對邊緣。
Service Worker + BroadcastChannel
:結合離線快取與跨分頁通訊。MessageChannel + IndexedDB
:提供雙向傳遞與快取資料機制。localStorage
的 storage
事件:快速同步小量狀態(登入、偏好設定等)。類型 | 可跨頁共享 | 攔截請求 | 典型用途 | 支援度 | 開發難度 | 流行程度 |
---|---|---|---|---|---|---|
Dedicated Worker | ❌ 否 | ❌ 否 | 計算、壓縮、AI 推論 | ✅ 全瀏覽器 | ⭐ | ⭐⭐⭐⭐ |
Shared Worker | ✅ 是 | ❌ 否 | 跨分頁共享資料 | ⚠️ Safari 16+ | ⭐⭐ | ⭐ |
Service Worker | ✅ 是 | ✅ 是 | PWA、快取、推播 | ✅ Safari 11.1+ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
Shared Worker 依然在大型協作應用(如雲端 IDE、資料分析平台)中發揮關鍵作用,只是如今更多人選擇更穩定的替代方案來實現相同目標。
SharedWorker 是 Web Worker 家族中最適合「多頁同步」的成員:
Dedicated Worker 解決「單頁卡頓」,
Service Worker 解決「網站離線」,
SharedWorker 解決「多頁共享」。
👉 歡迎追蹤這個系列,我會從 Canvas 開始,一步步帶你認識更多 Web API 🎯