Испытание происхождения совместно используемых рабочих ресурсов с увеличенным сроком службы

Опубликовано: 31 июля 2025 г.

Начиная с Chrome 139, участвуйте в новом исследовании Origin для общих рабочих процессов с увеличенным сроком службы . В пробной версии добавлена новая опция extendedLifetime: true , позволяющая общим рабочим процессам существовать после последней выгрузки документа.

Вариант использования функции продленного срока службы

Многие сайты хотят выполнять определённые действия, когда пользователь покидает страницу. Например, запись в хранилище или отправка данных обратно на серверы для сохранения состояния или аналитики.

Веб-платформа предоставляет несколько API для решения некоторых простых задач, но у каждого из них есть ограничения:

  • Синхронные API JavaScript, такие как записи localStorage , выполняются до завершения перед выгрузкой текущей страницы.
  • fetch API имеет ряд опций, таких как keepalive и недавно появившаяся fetchLater , которая позволяет запросам на отправку на короткий период времени опережать выгрузку документа.

Однако они охватывают только синхронную работу, за исключением последнего запроса fetch . Они не позволяют использовать асинхронные API, такие как IndexedDB , Compression Streams или Web Crypto, для хеширования или шифрования. Многие API, особенно новые, являются асинхронными, чтобы избежать блокировки основного потока, поэтому невозможность использования этих API при выгрузке данных является ограничением.

Альтернативой является использование сервис-воркеров , которые существуют вне жизненного цикла отдельных страниц. Однако это довольно громоздкое решение, предъявляющее более высокие требования к жизненному циклу и управлению для разработчиков, не говоря уже о дополнительных требованиях к процессам и памяти для пользователей. Кроме того, оно не соответствует основному назначению сервис-воркеров (выступать в качестве прокси-сервера для сетевых запросов). Использование полноценных сервис-воркеров исключительно для выполнения какой-либо работы по выгрузке страниц кажется излишним.

Предлагаемое решение

API SharedWorker — это более лёгкий API, используемый для разгрузки основного потока. Однако в настоящее время он не существует дольше срока существования источника (пока не будет загружена последняя страница этого источника). Chrome предлагает добавить новую опцию в API SharedWorker, которая позволит общим рабочим процессам сохранять работоспособность после удаления документа в течение короткого периода времени.

Стандарт HTML уже рекомендует реализациям сохранять общие рабочие процессы активными в течение короткого времени после выгрузки документа, чтобы навигация между страницами с одним источником не приводила к удалению и повторному созданию общего рабочего процесса. Предложение о продлении срока действия лишь расширяет это правило, предполагая, что даже если пользователь не переходит к целевому объекту с тем же источником, пользовательский агент должен поддерживать общий рабочий процесс активным в течение некоторого времени, чтобы асинхронная работа могла быть завершена.

Предложение заключается в том, чтобы разрешить общим рабочим процессам продолжать работу после последней выгрузки документа в течение того же времени, которое разрешено серверным рабочим процессам бездействовать — 30 секунд для Chrome. Обратите внимание, что для общих рабочих процессов это максимальное время жизни после выгрузки, а не время простоя. То есть 30-секундный лимит начинается с момента выгрузки, а не с момента простоя. Работа, начатая и не завершенная в течение этого периода, будет отменена.

Включить продленный срок службы

Эту функцию можно включить на сайтах для пользователей, зарегистрировавшихся в пробной версии Origin для совместно используемых рабочих процессов с увеличенным сроком службы . Разработчики также могут включить её в своих браузерах, используя флаг 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 .