ServiceWorkerContainer
Baseline
Widely available
*
This feature is well established and works across many devices and browser versions. It’s been available across browsers since abril de 2018.
* Some parts of this feature may have varying levels of support.
Contexto seguro: Esta función está disponible solo en contextos seguros (HTTPS), en algunos o todos los navegadores que lo soportan.
Nota: Esta característica está disponible en Web Workers.
La interfaz ServiceWorkerContainer de la API Service Worker proporciona un objeto que representa al service worker como una unidad general en el ecosistema de la red, incluidas las facilidades para registrar, cancelar el registro y actualizar los service workers, y acceder al estado de los service workers y sus registros.
Lo más importante es que expone el método ServiceWorkerContainer.register() que se usa para registrar service workers, y la propiedad ServiceWorkerContainer.controller que se usa para determinar si la página actual está siendo controlada activamente o no.
Los objetos ServiceWorkerContainer se exponen en el ámbito de la ventana a través de Navigator.serviceWorker y en los workers mediante WorkerNavigator.serviceWorker (si es compatible — consulte compatibilidad con navegadores).
Propiedades de instancia
ServiceWorkerContainer.controllerRead only-
Un objeto
ServiceWorkerque representa al service worker activo que controla la página actual, onullsi la página no tiene un service worker activo o en proceso de activación. ServiceWorkerContainer.readyRead only-
Devuelve un
Promiseque se resuelve con elServiceWorkerRegistrationasociado a la página actual, pero solo cuando hay un service worker activo. Esto proporciona un mecanismo para diferir la ejecución del código hasta que un service worker esté activo.
Métodos de instancia
ServiceWorkerContainer.getRegistration()-
Obtiene un objeto
ServiceWorkerRegistrationcuyo alcance coincide con la URL del documento proporcionado. El método devuelve unPromiseque se resuelve en unServiceWorkerRegistrationoundefined. ServiceWorkerContainer.getRegistrations()-
Devuelve todos los objetos
ServiceWorkerRegistrationasociados con unServiceWorkerContaineren un arreglo. El método devuelve unPromiseque se resuelve en un arreglo deServiceWorkerRegistration. ServiceWorkerContainer.register()-
Crea o actualiza un
ServiceWorkerRegistrationpara elscriptURLdado. ServiceWorkerContainer.startMessages()-
Inicia explícitamente el flujo de mensajes que se envían desde un service worker a las páginas bajo su control (por ejemplo, enviados a través de
Client.postMessage()). Esto se puede usar para reaccionar antes a los mensajes enviados, incluso antes de que el contenido de esa página haya terminado de cargarse.
Eventos
controllerchange-
Se dispara cuando el
ServiceWorkerRegistrationasociado al documento adquiere un nuevo workeractive. message-
Se dispara cuando el objeto
ServiceWorkerContainerrecibe mensajes entrantes (por ejemplo, a través de una llamada aMessagePort.postMessage()). messageerror-
Se dispara cuando el objeto
ServiceWorkerContainerno puede deserializar los mensajes entrantes (por ejemplo, a través de una llamada aMessagePort.postMessage()).
Ejemplos
El siguiente ejemplo primero verifica si el navegador es compatible con service workers. Si es compatible, el código registra el service worker y determina si la página está siendo controlada activamente por el service worker. Si no es así, solicita al usuario que vuelva a cargar la página para que el service worker pueda tomar el control. El código también informa de cualquier error de registro.
if ("serviceWorker" in navigator) {
// Registrar un service worker alojado en la raíz del
// sitio utilizando el alcance predeterminado.
navigator.serviceWorker
.register("/sw.js")
.then((registration) => {
console.log(
"El registro del service worker se realizó correctamente:",
registration,
);
// En este punto, opcionalmente se puede hacer algo
// con el registro. Ver https://mdn.go-mizu.dev/es/docs/Web/API/ServiceWorkerRegistration
})
.catch((error) => {
console.error(`El registro del service worker falló: ${error}`);
});
// Independientemente del registro, también mostremos
// información sobre si la página actual está controlada
// por un service worker existente y cuándo cambia ese
// controlador.
// Primero, hacer una verificación única para saber si
// actualmente hay un service worker en control.
if (navigator.serviceWorker.controller) {
console.log(
"Esta página está actualmente controlada por:",
navigator.serviceWorker.controller,
);
}
// Luego, registrar un manejador para detectar cuándo
// un service worker nuevo o actualizado toma el control.
navigator.serviceWorker.oncontrollerchange = () => {
console.log(
"Esta página ahora está controlada por",
navigator.serviceWorker.controller,
);
};
} else {
console.log("Los service workers no son compatibles.");
}
Especificaciones
| Specification |
|---|
| Service Workers Nightly> # serviceworkercontainer-interface> |