SharedWorker

可用性有限

此特性不是基線特性,因為它在一些最廣泛使用的瀏覽器中不起作用。

SharedWorker 介面代表一種特殊的 worker,可以被多個瀏覽上下文(例如多個視窗、iframe 甚至 worker)訪問。它們實現的介面與專用 worker 不同,並且擁有不同的全域性作用域:SharedWorkerGlobalScope

注意: 如果 SharedWorker 可以被多個瀏覽上下文訪問,那麼所有這些瀏覽上下文必須共享完全相同的源(相同的協議、主機和埠)。

EventTarget SharedWorker

建構函式

SharedWorker()

建立一個共享 Web Worker,它會執行指定 URL 的指令碼。

例項屬性

繼承其父級 EventTarget 的屬性。

SharedWorker.port 只讀

返回一個 MessagePort 物件,用於與共享 worker 通訊和控制它。

事件

error

當共享 worker 中發生錯誤時觸發。

例項方法

繼承其父級 EventTarget 的方法。

示例

在我們 簡單的共享 worker 示例執行共享 worker)中,我們有兩個 HTML 頁面,每個頁面都使用一些 JavaScript 來執行簡單的計算。不同的指令碼使用相同的 worker 檔案來執行計算——即使它們的頁面執行在不同的視窗中,它們都可以訪問它。

下面的程式碼片段展示了使用 SharedWorker() 建構函式建立 SharedWorker 物件。兩個指令碼都包含這個

js
const myWorker = new SharedWorker("worker.js");

注意: 一旦建立了共享 worker,同一源中的任何指令碼都可以獲得對該 worker 的引用並與之通訊。只要共享 worker 的全域性作用域所有者集合(一組 DocumentWorkerGlobalScope 物件)不為空(例如,如果存在任何持有對其引用的活動頁面,可能是透過 new SharedWorker()),該共享 worker 就會一直存在。有關共享 worker 生命週期的更多資訊,請參閱 HTML 規範的 worker 的生命週期部分。

然後,兩個指令碼都透過使用 SharedWorker.port 屬性建立的 MessagePort 物件來訪問 worker。如果使用 addEventListener 附加了 onmessage 事件,則透過其 start() 方法手動啟動 port。

js
myWorker.port.start();

當 port 啟動後,兩個指令碼分別使用 port.postMessage()port.onmessage 向 worker 傳送訊息並處理從 worker 傳送來的訊息。

注意: 您可以使用瀏覽器開發者工具來除錯您的 SharedWorker,方法是在瀏覽器的位址列輸入 URL 來訪問開發者工具的 worker 檢查器;例如,在 Chrome 中,URL 是 chrome://inspect/#workers,在 Firefox 中,URL 是 about:debugging#workers

js
[first, second].forEach((input) => {
  input.onchange = () => {
    myWorker.port.postMessage([first.value, second.value]);
    console.log("Message posted to worker");
  };
});

myWorker.port.onmessage = (e) => {
  result1.textContent = e.data;
  console.log("Message received from worker");
};

在 worker 內部,我們使用 onconnect 處理程式來連線到上面討論的同一個 port。與該 worker 關聯的 port 在 connect 事件的 ports 屬性中可用——然後我們使用 MessagePortstart() 方法來啟動 port,並使用 onmessage 處理程式來處理從主執行緒傳送的訊息。

js
onconnect = (e) => {
  const port = e.ports[0];

  port.addEventListener("message", (e) => {
    const workerResult = `Result: ${e.data[0] * e.data[1]}`;
    port.postMessage(workerResult);
  });

  port.start(); // Required when using addEventListener. Otherwise called implicitly by onmessage setter.
};

規範

規範
HTML
# shared-workers-and-the-sharedworker-interface

瀏覽器相容性

另見