¿Qué pueden hacer los trabajadores de servicios que los trabajadores web no puedan hacer?
¿Qué pueden hacer los trabajadores de servicios que los trabajadores web no puedan hacer? ¿O viceversa?
Parece que los trabajadores web son un subconjunto de la funcionalidad de los trabajadores de servicios. ¿Es esto correcto?
La respuesta de Buksy es correcta, pero en mi opinión no responde a la pregunta original, a saber: "¿Qué pueden hacer los trabajadores de servicios que los trabajadores web no puedan hacer? ¿O viceversa?".
Existen diferencias fundamentales en su ciclo de vida y la cantidad de instancias por origen que puede tener. En breve:
| Web Workers | Service Workers |
|--------------|--------------|------------------|
| Instances | Many per tab | One for all tabs |
| Lifespan | Same as tab | Independent |
| Intended use | Parallelism | Offline support |
La respuesta de Buksy es básicamente la última fila de la tabla. Crédito: tomé esta tabla de Desmitificando a los trabajadores web y a los trabajadores de servicios de Nolan Lawson, a partir de la diapositiva 35 .
En particular, así es como se generan y eliminan trabajadores web:
Usando trabajadores web
Considerando que los trabajadores de servicios tienen su propio ciclo de vida, que sin duda es su "parte más complicada":
El ciclo de vida del trabajador de servicios
Entonces, el ciclo de vida es una diferencia fundamental entre los dos (una consecuencia del uso previsto).
Solía haber una gran diferencia en la compatibilidad del navegador : los trabajadores de servicio no estaban disponibles en Safari para iOS hasta la versión 11.3 (29 de marzo de 2018), consulte ¿ Puedo usar trabajadores de servicio? Por el contrario, los trabajadores web ya tenían un soporte de navegador mucho mejor en 2012: ¿puedo utilizar trabajadores web?
Si tiene que admitir IE11, solo puede usar trabajadores web: IE11 no tiene trabajadores de servicio y aparentemente el fin del soporte para IE11 es el 14 de octubre de 2025 .
Existen diferencias sutiles en la compatibilidad con API entre navegadores; consulte HTML5 Worker Test (también de Nolan Lawson). En un navegador concreto, un tipo de trabajador puede admitir una determinada llamada API mientras que el otro no. ¡Visite esa página y pruebe su propio navegador!
Hay una gran diferencia en su finalidad:
Trabajadores web
Web Workers proporciona un medio sencillo para que el contenido web ejecute scripts en subprocesos en segundo plano. El hilo de trabajo puede realizar tareas sin interferir con la interfaz de usuario. Además, pueden realizar E/S utilizando XMLHttpRequest (aunque los atributos de canal y XML de respuesta siempre son nulos). Una vez creado, un trabajador puede enviar mensajes al código JavaScript que lo creó publicando mensajes en un controlador de eventos especificado por ese código (y viceversa).
Fuente: uso de trabajadores web
Trabajador del servicio
Los trabajadores de servicios actúan esencialmente como servidores proxy que se ubican entre las aplicaciones web, el navegador y la red (cuando estén disponibles). Su objetivo es (entre otras cosas) permitir la creación de experiencias fuera de línea efectivas, interceptar solicitudes de red y tomar las medidas adecuadas en función de si la red está disponible y si los activos actualizados residen en el servidor. También permitirán el acceso a notificaciones automáticas y API de sincronización en segundo plano.
Fuente: API de trabajador de servicio
Por lo tanto, los Web Workers son útiles para ejecutar scripts costosos sin que la interfaz de usuario se congele, mientras que los Service Workers son útiles para modificar la respuesta de las solicitudes de red (por ejemplo, al crear una aplicación fuera de línea).
Trabajadores de servicios
Los trabajadores de servicios son un proxy entre el navegador y la red. Al interceptar las solicitudes realizadas por el documento, los trabajadores del servicio pueden redirigir las solicitudes a un caché, lo que permite el acceso sin conexión.
/* main.js */
navigator.serviceWorker.register('/service-worker.js');
/* service-worker.js */
// Install
self.addEventListener('install', function(event) {
// ...
});
// Activate
self.addEventListener('activate', function(event) {
// ...
});
// Listen for network requests from the main document
self.addEventListener('fetch', function(event) {
// ...
});
trabajadores web
Los trabajadores web son scripts de propósito general que nos permiten descargar el trabajo intensivo del procesador desde el hilo principal.
/* main.js */
// Create worker
const myWorker = new Worker('worker.js');
// Send message to worker
myWorker.postMessage('Hello!');
// Receive message from worker
myWorker.onmessage = function(e) {
console.log(e.data);
}
Publicación original aquí