ライフタイムが延長された共有ワーカーのオリジン トライアル

公開日: 2025 年 7 月 31 日

Chrome 139 以降では、共有ワーカーのライフタイム延長の新しいオリジン トライアルに参加できます。このトライアルでは、共有ワーカーが最後のドキュメントのアンロード後も存続できるようにする新しい extendedLifetime: true オプションが追加されます。

延長されたライフタイム機能のユースケース

多くのサイトでは、ユーザーがページから移動したときに何らかの処理を行いたいと考えています。たとえば、状態を保存したり、分析情報を記録したりするために、ストレージに書き込んだり、サーバーにデータを送り返したりします。

ウェブ プラットフォームには、簡単なユースケースに対応するための API がいくつか用意されていますが、それぞれに制限があります。

  • localStorage 書き込みなどの同期 JavaScript API は、現在のページがアンロードされる前に完了まで実行されます。
  • fetch API には、keepalive や最近の fetchLater など、リクエストの送信をドキュメントのアンロード後も短期間継続できるオプションがいくつかあります。

ただし、これらは最後の fetch リクエストを除き、同期作業のみを対象としています。IndexedDBCompression StreamsWeb Crypto などの非同期 API を使用してハッシュ化や暗号化を行うことはできません。多くの API、特に新しい API は、メインスレッドのブロックを回避するために非同期であるため、unload でこれらの API を使用できないのは制限的です。

別の方法として、個々のページのライフサイクルの外に存在するサービス ワーカーを使用する方法があります。ただし、これはかなり重いソリューションであり、デベロッパーにとってはライフサイクルと管理の要件が複雑になり、ユーザーにとってはプロセスとメモリの要件が追加されます。また、サービス ワーカーの主なユースケース(ネットワーク リクエストのプロキシとして機能する)とも一致しません。ページのアンロード時に何らかの処理を完了するというユースケースのためだけにフル サービス ワーカーを使用するのは、やりすぎのように思えます。

提案するソリューション

SharedWorker API は、メインスレッドから処理をオフロードするために使用される軽量な API です。ただし、現時点では、オリジンの有効期間(そのオリジンの最後のページがアンロードされたとき)を超えて存続することはありません。Chrome は、SharedWorker API に新しいオプションを追加して、共有ワーカーがドキュメントの破棄後も短時間存続できるようにすることを提案しています。

HTML 標準では、同じオリジンのページ間の移動で共有ワーカーが破棄されて再作成されないように、ドキュメントのアンロード後も共有ワーカーを短時間存続させるよう実装に推奨しています。拡張ライフタイムの提案は、ユーザーが同一オリジンのデスティネーションに移動していない場合でも、非同期処理を完了できるように、ユーザー エージェントが共有ワーカーを一定期間存続させるべきであると提案することで、この期間を延長するものです。

この提案は、最後のドキュメントのアンロード後も、サーバー ワーカーがアイドル状態を維持できる時間と同じ時間(Chrome の場合は 30 秒)だけ、共有ワーカーが存続できるようにするものです。共有ワーカーの場合、これはアイドル時間ではなく、アンロード後の最大有効期間です。つまり、30 秒の制限はアイドル時間ではなく、アンロードから始まります。この期間内に開始され、まだ完了していない作業はキャンセルされます。

延長された有効期間を有効にする

この機能をサイトで有効にするには、有効期間が延長された共有ワーカーオリジン トライアルに登録します。または、デベロッパーは chrome://flags/#enable-experimental-web-platform-features フラグを使用して、独自のブラウザで有効にすることもできます。

コード例

トライアルまたは機能フラグを有効にした後、次のようにして延長されたライフタイムを有効にします。

const myWorker = new SharedWorker("worker.js", { extendedLifetime: true });

共有ワーカーは BLOB もサポートしているため、別のスクリプトなしで有効にすることもできます。たとえば、IndexedDb にデータを書き込むには:

const sharedWorkerScript = `
  const transaction = db.transaction("analytics", "readwrite");
  const store = transaction.objectStore("analytics");
  const request = store.get("visitCount");
  request.onsuccess = (event) => {
    const newCount = (event.target.result || 0) + 1;
    store.put(newCount, "visitCount");
  };
`;

document.addEventListener("pagehide", () => {
  const blob = new Blob([sharedWorkerScript], { type: "text/javascript" });
  const blobURL = URL.createObjectURL(blob);
  new SharedWorker(blobURL, { extendedLifetime: true });
});

また、https://sharedworker-extendedlifetime.netlify.app/ にサンプルアプリがあります。ページを再読み込みした場合(または 30 秒以内に閉じて再度開いた場合)、以前の計算結果は引き続き利用できます。

共有ワーカーは chrome://inspect/#workers でサイトごとに確認できます。また、extendedLifetime オプションが使用されたかどうかを表示する機能がまもなく追加されます。拡張ライフタイムの共有ワーカーも、ページのアンロード後 30 秒間はこのページに表示され続けます。

フィードバックをお寄せください

延長された共有ワーカーのオリジン トライアルについて、皆様からのフィードバックをお待ちしております。

API の形状については GitHub で議論されており、より詳細な技術解説も用意されています。

Chrome の実装に関するフィードバックについては、Chromium のバグを報告してください。