Siempre tendemos a elegir entre un cliente simulado o un servidor. Pero en realidad, hay algo intermedio, y eso se llama service worker. Un service worker es una API que es una especie de web worker, un módulo de JavaScript que reside junto a tu aplicación en un navegador y se ejecuta en un hilo separado.
Este es un ejemplo de un archivo de worker. Los workers tienen ciertos eventos del ciclo de vida y uno de ellos es el evento de fetch. El worker lo activa cada vez que tu aplicación realiza cualquier tipo de solicitud. En este controlador, indico que quiero buscar la respuesta en caché y, si hay una respuesta en caché, simplemente responda con ella, sin realizar solicitudes reales. Pero si no hay caché, ejecute la solicitud fetch como de costumbre.
Ahora puedes ver cómo, con esto, hay un gran potencial para implementar el almacenamiento en caché de esta manera en el lado del cliente, pero esto me hizo pensar, ¿qué pasaría si en lugar de respuestas en caché, pudiéramos devolver respuestas simuladas? Intentemos eso. El mismo worker, pero esta vez en el evento de fetch, respondemos con este cuerpo de respuesta codificado y el código de estado 200. Y ahora, cualquier solicitud que realice nuestra aplicación, saldrá de la aplicación y llegará al worker, y como respuesta, se devolverá esta respuesta estática.
Esto es genial, así que usemos Service Workers para simulación y el problema estará resuelto. Pero si intentas hacer eso, te enfrentarás a varios desafíos. En primer lugar, los Service Workers tienen un contexto de ejecución limitado, y esto se debe principalmente a consideraciones de seguridad. No puedes acceder al objeto window o al DOM y, obviamente, no puedes acceder al código del lado del cliente ni a tus funciones, utilidades y bibliotecas. Los workers pueden quedar obsoletos y cada vez que registras un worker, esto no necesariamente empuja el último worker al navegador y puedes terminar con un worker obsoleto, lo cual no es agradable. Cuando cargas la página, el worker se detendrá y tendrás que volver a cargar la página para verlo en funcionamiento nuevamente. Esto crea una experiencia de desarrollo distorsionada. Los workers también controlan clientes no relacionados y lo hacen porque el worker establece una conexión con el cliente en función de su URL. Por lo tanto, puedes abrir un proyecto completamente diferente en la misma URL, en localhost, y ver un worker no relacionado que intenta simular respuestas. Y esto es simplemente confuso.
A pesar de estos desafíos, me gusta la idea. Hace un par de años, escribí la biblioteca llamada MockServiceWorker o MSW abreviado. Y aprovecha la capacidad de ServiceWorker para interceptar solicitudes y hacerlo de manera elegante. MSW es lo más parecido a un servidor real sin tener que crear uno, y esto es gracias a los Service Workers. Permíteme mostrarte cómo se ve el flujo de trabajo con la biblioteca antes de adentrarnos en los detalles internos. Lo primero que haré es indicarle a la biblioteca qué solicitudes capturaré. Y estoy escribiendo estas cosas llamadas controladores de solicitud, simplemente funciones que describen la información de la solicitud y qué respuesta producir.
Comments