Las Progressive Web Aplicaciones dan un instalable, experiencia de aplicación como en ordenadores de escritorio y móviles que se crean y entregan de forma directa a través de la página web. Son aplicaciones web que son rápidas y confiables. Y lo más importante, son aplicaciones web que marchan en cualquier navegador. Si estás creando una aplicación web hoy, ya estás en el camino cara la creación de una Progressive Web Aplicación.
Toda experiencia web debe ser rápida, y esto es en especial cierto para las Progressive Web Apps. Rápida se refiere al paso que se tarda en conseguir contenido significativo en la pantalla y brinda una experiencia interactiva en menos de cinco segundos.
Y, debe ser confiablemente rápido. Es difícil enfatizar lo suficiente lo bueno que es el rendimiento fiable. diseño web Granada énsalo de esta manera: la primera carga de una aplicación nativa es frustrante. Está recluído por una tienda de aplicaciones y una descarga enorme, mas en el momento en que llegas al punto de instalar la aplicación, ese coste inicial se amortiza en todos los principios de la aplicación, y ninguno de esos principios tiene un retraso variable. Cada inicio de aplicación es tan rápido como el último, sin variación. Una Progressive Web Aplicación debe ofrecer este rendimiento fiable que los usuarios esperan de cualquier experiencia instalada.
Las Progressive Web Apps pueden ejecutarse en una pestaña del navegador, mas también son instalables. Añadir a marcadores un lugar simplemente agrega un acceso directo, mas una Progressive Web Aplicación instalada se ve y se comporta como todas las demás aplicaciones instaladas. Se comienza desde el mismo sitio que se lanzan otras aplicaciones. Puedes controlar la experiencia de lanzamiento, incluyendo una pantalla de comienzo personalizada, iconos y más. Se ejecuta como una aplicación, en una ventana de aplicación sin una barra de direcciones u otra interfaz de usuario del navegador. Y como todas y cada una de las demás aplicaciones instaladas, es una aplicación de nivel superior en el gestor de labores.
Recuerda, es esencial que una PWA instalable sea rápida y confiable. Los usuarios que instalan una PWA aguardan que sus aplicaciones funcionen, sin importar un mínimo en qué tipo de conexión de red estén conectados. Es una expectativa de referencia que todas y cada una de las aplicaciones instaladas deben cumplir.
Mediante el empleo de técnicas de diseño acomodable, las Progressive Web Apps funcionan en el móvil y escritorio, utilizando una base de código única entre plataformas. Si estás considerando redactar una aplicación nativa, eche una ojeada a los beneficios que ofrece una PWA.
En este laboratorio de código, vas a edificar una aplicación web meteorológica usando las técnicas de una Progressive Web Aplicación. Tu aplicación:
beforeinstallprompt
para notificar al usuario que es instalable.Este laboratorio de código está enfocado en Progressive Web Apps. Los conceptos y los bloques de código no relevantes se pasan por alto y se dan a fin de que usted simplemente copie y pegue.
Nuestros datos meteorológicos provienen de . Para poder usarlo, deberás pedir una API key. Es fácil de emplear y sin coste para proyectos no comerciales.
Para probar que tu API key marcha correctamente, efectúa una petición HTTP a la API de DarkSky. Actualiza la URL a continuación para sustituir DARKSKY_API_KEY
con tu API key. Si todo marcha, debería ver el último pronóstico del tiempo para la urbe de la ciudad de Nueva York.
/forecast/DARKSKY_API_KEY/40. ,-setenta y tres.
Hemos puesto todo cuanto precisas para este proyecto en un repositorio de Git. Para comenzar, deberás obtener el código y abrirlo en tu ambiente de desarrollo preferido. Para este laboratorio de código, recomendamos emplear Glitch.
Usar Glitch es el método recomendado para trabajar a través de este código.
.env
y actualízalo con tu API key DarkSky.Si quieres descargar el código y trabajar de forma local, deberás tener una versión reciente de Node y la configuración del editor de códigos y listo para usar.
npm install
para instalar las dependencias precisas para ejecutar el servidor.server.js
y configura la API key de DarkSky.node server.js
para iniciar el servidor en el puerto ocho mil.Nuestro punto de partida es una aplicación meteorológica básica diseñada para este laboratorio de código. El código se ha simplificado demasiado para mostrar los conceptos en este laboratorio de código y tiene poco manejo de errores. Si escoges reutilizar algo de este código en una aplicación de producción, asegúrate de manejar cualquier fallo y probar completamente todo el código.
Algunas cosas para probar...
FORECAST_DELAY
en server.js
es una herramienta fácil de emplear para ayudar a progresar la calidad de tus sitios y páginas. Cuenta con auditorías de rendimiento, accesibilidad, Progressive Web Aplicaciones y más. Cada auditoría tiene un documento de referencia que explica por qué la auditoría es importante, así como la forma de solucionarla.
Usaremos Lighthouse para auditar nuestra aplicación Weather y contrastar los cambios que hemos realizado.
Nos vamos a centrar en los resultados de la auditoría de la Progressive Web App.
Y hay mucho rojo en lo que centrarse:
start_url
no responde con un doscientos cuando está desconectado.start_url.
¡Saltemos y empecemos a solucionar algunos de estos problemas!
Al final de esta sección, nuestra aplicación meteorológica pasará las próximas auditorías:
es un fichero JSON simple que deja que tú, el desarrollador, puedas supervisar cómo se muestra tu aplicación al usuario.
Usando el manifiesto de la aplicación web, tu aplicación web puede:
display
).start_url
).short_name
, icons
).name
( name
, icons
, colors
).orientation
).Crea un archivo llamado public/manifest.json
en tu proyecto y copia/pega los próximos contenidos:
public/manifest.json
El manifiesto admite una serie de iconos, destinados a diferentes tamaños de pantalla. Para este laboratorio de código, hemos incluido otros ya que los necesitábamos para nuestra integración con iOS.
A continuación, debemos informarle al navegador sobre nuestro manifiesto añadiendo <link rel="manifest"...
a cada página de nuestra aplicación. Añade la siguiente línea al elemento <head>
en tu fichero index.html
.
DevTools proporciona una forma rápida y fácil de revisar tu archivo manifest.json
. Abre el panel Manifest en el panel Aplication. Si has agregado la información del manifiesto correctamente, podrás verla analizada y mostrada en un formato comprensible por los humanos en este panel.
Safari en iOS no acepta el manifiesto de aplicación web (), por lo que deberás añadir al <head>
de tu archivo index.html
:
Nuestra auditoría de Lighthouse mencionó algunas otras cosas que son bastante fáciles de reparar, así que cuidémoslas mientras estamos aquí.
Bajo la auditoría de posicionamiento en buscadores, Lighthouse anotó que nuestro "". Las descripciones se pueden mostrar en los resultados de búsqueda de Google. Las descripciones únicas y de alta calidad pueden hacer que tus resultados de búsqueda sean más relevantes para los usuarios y pueden acrecentar tu tráfico de búsqueda.
Para añadir una descripción, agrega la próxima etiqueta meta
al <head>
de tu documento:
En la auditoría de PWA, Lighthouse observó que nuestra aplicación "". El hecho de que la barra de direcciones del navegador coincida con los colores de su marca proporciona una experiencia de usuario más envolvente.
Para establecer el tono del tema en el móvil, agrega la siguiente etiqueta meta
al <head>
de tu documento:
Ejecuta Lighthouse nuevamente (haciendo click en el signo + en el rincón superior izquierda del panel Audits) y verifica tus cambios.
Auditoría SEO
Auditoría de Progressive Web App
start_url
no responde con un 200 cuando está desconectado.start_url.
Los usuarios esperan que las aplicaciones instaladas siempre y en toda circunstancia tengan una experiencia de referencia si están sin conexión. De ahí que es fundamental que las aplicaciones web instalables nunca muestren el dinosaurio sin conexión de Google Chrome. La experiencia sin conexión puede englobar desde una página sin conexión simple hasta una experiencia de solo lectura con datos almacenados previamente en caché, hasta una experiencia sin conexión plenamente funcional que se sincroniza automáticamente cuando se restaura la conexión de red.
En esta sección, añadiremos una página sin conexión simple a nuestra aplicación meteorológica. Si el usuario intenta cargar la aplicación mientras que está sin conexión, mostrará nuestra página adaptada, en vez de la página sin conexión típica que muestra el navegador. Al final de esta sección, nuestra aplicación meteorológica pasará las próximas auditorías:
start_url
no responde con un doscientos cuando está desconectado.start_url.
En la próxima sección, reemplazaremos nuestra página sin conexión adaptada con una experiencia sin conexión completa. Esto mejorará la experiencia sin conexión, mas lo que es más importante, mejorará significativamente nuestro desempeño, puesto que la mayoría de nuestros activos (HTML, CSS y JavaScript) se almacenarán y servirán localmente, eliminando la red como un posible cuello de botella.
Si no estás familiarizado con los service workers, leyendo puedes hacerte una idea básica sobre lo que pueden hacer, cómo funciona su ciclo vital y más. Cuando hayas completado este laboratorio de código, asegúrate de revisar el para tener una visión más detallada de cómo trabajar con los service workers.
Las funciones proporcionadas a través de los service workers se deben considerar una mejora progresiva y se deben añadir solo si el navegador las acepta. Por ejemplo, con los service workers puedes guardar en caché la y los datos de tu aplicación, de tal modo que esté disponible aun cuando la red no lo esté. Cuando los service workers no son compatibles, no lleva por nombre al código sin conexión y el usuario obtiene una experiencia básica. El empleo de la detección de características para otorgar mejoras progresivas tiene poca sobrecarga y no se interrumpirá en los navegadores viejos que no son compatibles con esa característica.
El primer paso es registrar al service worker. Añade el próximo código a tu fichero index.html
:
Este código comprueba si la API de service workers está libre y, si lo está, el service worker en /service-worker.js
se registra cuando la página es .
Ten en cuenta que el service worker se sirve desde el directorio raíz, no desde un directorio /scripts/
. Esta es la forma más fácil de configurar el scope
de tu service worker. El scope
del service worker determina qué archivos controla el service worker, es decir, desde qué ruta el service worker interceptará las peticiones. El valor predeterminado de scope
es la ubicación del archivo de service worker y se extiende a todos los directorios a continuación. Entonces, si service-worker.js
se halla en el directorio raíz, el service worker controlará las peticiones de todas las páginas web en este dominio.
Primero, debemos decirle al service worker qué almacenar en caché. Ya hemos creado una simple (public/offline.html
) que se mostrará cada vez que no haya conexión de red.
En tu service-worker.js
, añade '/offline.html',
al array de FILES_TO_CACHE
, el resultado final debería verse así:
A continuación, debemos actualizar el evento install
para indicar al service worker que precachee la página sin conexión:
Nuestro acontecimiento install
ahora abre la caché con caches.open()
y proporciona un nombre de caché. Suministrar un nombre de caché nos permite versionar archivos, o bien datos separados de los recursos guardados en caché a fin de que podamos actualizar fácilmente uno mas no afecte al otro.
Una vez que la caché esté abierta, podemos llamar a cache.addAll()
, que obtiene una lista de URLs, las obtiene del servidor y añade la contestación a la caché. Ten presente que cache.addAll()
se rechazará si falla ciertas solicitudes individuales. Eso significa que tienes la garantía de que, si el paso de instalación se efectúa correctamente, tu caché estará en un estado consistente. Pero, si falla por alguna razón, lo intentará nuevamente automáticamente la próxima vez que se inicie el service worker.
Veamos cómo puedes usar DevTools para entender y depurar los service workers. Antes de volver a cargar tu página, abre DevTools, ve al panel Service Workers en el panel Aplication. Debe tener un aspecto como este:
Cuando ves una página en blanco como esta, quiere decir que la página hoy día abierta no tiene ningún service worker registrado.
Ahora, recarga tu página. El panel service workers ahora debería tener este aspecto:
Cuando veas información como esta, quiere decir que la página tiene un service worker en ejecución.
Junto a la etiqueta de estado, hay un número (34251 en un caso así), vigila ese número mientras que trabaja con los service workers. Es una forma fácil de saber si tu service worker ha sido actualizado.
Usaremos el evento activate
para limpiar los datos viejos en nuestro caché. Este código garantiza que tu service worker actualiza nuestra caché toda vez que cambie ciertos archivos de la shell de la aplicación. A fin de que esto funcione, necesitarías incrementar la variable CACHE_NAME
en la parte superior de tu archivo de service worker.
Agrega el próximo código a tu acontecimiento activate
:
Con el panel service workers abierto, actualiza la página, verá el nuevo service worker instalado y el aumento del número de estado.
El service worker actualizado toma el control de forma inmediata porque nuestro acontecimiento install
finaliza con self.skipWaiting()
y el evento activate
finaliza con self.clients.claim()
. Sin esos, el service worker precedente continuaría controlando la página siempre y cuando haya una pestaña abierta en la página.
Y finalmente, necesitamos manejar los acontecimientos de fetch
. Vamos a emplear una . El service worker primero intentará recuperar el recurso de la red, si eso falla, devolverá la página sin conexión de la caché.
El controlador fetch
solo necesita manejar las navegaciones de la página, por lo que otras peticiones pueden ser eliminadas del controlador y serán tratadas en general por el navegador. Pero, si la petición .mode
es navigate
, utiliza fetch
para procurar conseguir el elemento de la red. Si falla, el manejador de catch
abre la caché con caches.open(CACHE_NAME)
y usa cache.match('offline.html')
para obtener la página sin conexión predefinida. El resultado se devuelve al navegador a través de evt.respondWith()
.
Revisemos para asegurarnos de que todo marcha como lo aguardamos. Con el panel service workers abierto, actualiza la página, verás el nuevo service worker instalado y el incremento del número de estado.
También podemos verificar qué ha sido guardado en caché. Ve al panel Cache Storage en el panel Application de DevTools. Haz click con el botón derecho en Cache Storage, escoge Refresh Caches, expande la sección y deberías ver el nombre de su caché estática en el lado izquierdo. Al hacer clic en el nombre de la memoria caché se muestran todos los ficheros que están en caché.
Ahora, vamos a probar el modo perfecto sin conexión. Vuelve al panel Service Workers de DevTools y marca la casilla Offline. Después de cambiarlo, deberías ver un pequeño icono de advertencia amarillo junto a la pestaña del panel Network. Esto señala que estás desconectado.
Recarga tu página y... ¡funciona! ¡Obtenemos nuestro panda desconectado, en lugar del dino desconectado de Google Chrome!
Depurar a los service workers puede ser un desafío, y cuando se trata de almacenaje en caché, las cosas pueden transformarse en una pesadilla aún más si la caché no se actualiza cuando se espera. Entre el ciclo vital típico de un service worker y un error en su código, puedes frustrarte rápidamente. Pero no .
En el panel service workers del panel Application, hay algunas casillas de verificación que harán tu vida mucho más fácil.
En algunos casos, es posible que esté cargando datos en caché o que las cosas no se actualizan como esperas. Para borrar todos y cada uno de los datos guardados (localStorage, indexedDB data, cached files) y eliminar cualquier service worker, usa el panel Clear storage en la pestaña Application. De forma alternativa, también puedes trabajar en una ventana de incógnito.
Consejos adicionales:
Ejecuta Lighthouse nuevamente y contrasta tus cambios. ¡No olvides desactivar la opción Offline ya antes de verificar tus cambios!
Auditoría SEO
Auditoría de Progressive Web App
start_url
responde con un doscientos cuando está desconectado.start_url.
Tómate un instante, pon tu teléfono en modo avión e procura ejecutar algunas de sus aplicaciones favoritas. En casi todos los casos, dan una experiencia sin conexión bastante robusta. Los usuarios esperan un experiencia robusta de sus aplicaciones. Y la web no debería ser diferente. Las Progressive Web Aplicaciones deben diseñarse para unas condiciones sin conexión como escenario primordial.
El ciclo vital del service worker es la parte más complicada. Si no sabes qué es lo que está tratando de hacer y cuáles son las ventajas, puedes sentir que está luchando contra ti. Pero una vez que sepas cómo marcha, puedes ofrecer actualizaciones integrales y prudentes a los usuarios, mezclando lo mejor de la página web y los patrones nativos.
install
El primer acontecimiento que recibe un service worker es install
. Se activa tan pronto como el worker se ejecuta, y solo se llama una vez por service worker. Si modificas la secuencia de comandos de tu service worker, el navegador lo considerará un service worker diferente, y obtendrá su propio evento install
.
Normalmente, el evento install
se emplea para almacenar en caché todo cuanto necesita a fin de que tu aplicación se ejecute.
activate
El service worker recibirá un evento activate
toda vez que se inicie. El objetivo principal del acontecimiento activate
es configurar el comportamiento del service worker, limpiar los recursos que quedan de las ejecuciones precedentes (por ejemplo, cachés antiguas) y preparar al service worker para manejar las solicitudes de red (por servirnos de un ejemplo, el evento fetch
que se describe a continuación).
fetch
El evento fetch permite que el service worker intercepte cualquier petición de red y maneje las peticiones. Puede ir a la red para conseguir el recurso, puede extraerlo de su propia caché, generar una contestación adaptada o cualquiera de las múltiples opciones. Echa un vistazo a para ver las distintas estrategias que puedes usar.
El navegador verifica si hay una nueva versión de tu service worker en cada carga de página. Si encuentra una nueva versión, la nueva versión se descarga e instala en segundo plano, mas no está activada. Se halla en estado de espera, hasta que ya no queda ninguna página abierta que utilice el antiguo service worker. Una vez que se cierran todas las ventanas que emplean el viejo service worker, el nuevo service worker se activa y puede tomar el control. Consulte la sección del documento del ciclo de vida del service worker para obtener más detalles.
Elegir la adecuada depende del tipo de recurso que intentes guardar en caché y de cómo podría precisarlo más adelante. Para nuestra aplicación meteorológica, vamos a dividir los recursos que necesitamos para almacenar en caché en 2 categorías: los recursos que deseamos incluir en caché y los datos que almacenaremos en caché en tiempo de ejecución.
Precachear tus recursos es un concepto afín a lo que ocurre cuando un usuario instala una aplicación de escritorio o móvil. Los recursos clave necesarios a fin de que la aplicación se ejecute se instalan o bien se almacenan en la memoria caché del dispositivo a fin de que puedan cargarse más tarde, si hay conexión de red o no.
Para nuestra aplicación, almacenaremos anteriormente todos nuestros recursos estáticos cuando nuestro service worker esté instalado, de tal modo que todo cuanto necesitamos para ejecutar nuestra aplicación se almacene en el dispositivo del usuario. Para garantizar que nuestra aplicación se cargue a la velocidad de la luz, usaremos la estrategia ; en vez de ir a la red para conseguir los recursos, se extraen de la caché local; Sólo si no está libre, intentaremos conseguirlo de la red.
Extraer de la memoria caché local suprime cualquier variabilidad de la red. No importa en qué género de red esté el usuario (WiFi, 5G, 3G o incluso 2G), los recursos clave que necesitamos para ejecutar están disponibles casi inmediatamente.
La es ideal para determinados tipos de datos y funciona bien para nuestra aplicación. Obtiene los datos en la pantalla lo más rápido posible, después los actualiza en el momento en que la red ha devuelto los datos más recientes. Stale-while-revalidate quiere decir que debemos iniciar 2 solicitudes asíncronas, una para la memoria caché y otra para la red.
En circunstancias normales, los datos guardados en la memoria caché se devolverán casi de manera inmediata proporcionando la aplicación con datos recientes que puede utilizar. Luego, cuando vuelva la petición de red, la aplicación se actualizará utilizando los datos más recientes de la red.
Para nuestra aplicación, esto proporciona una mejor experiencia que la red, recurriendo a la estrategia de caché pues el usuario no tiene que esperar hasta el momento en que la solicitud de la red caduque para poder ver algo en la pantalla. Posiblemente inicialmente vean datos más antiguos, mas en el momento en que se devuelva la petición de red, la aplicación se actualizará con los datos más recientes.
Como se mencionó anteriormente, la aplicación debe iniciar 2 peticiones asíncronas, una para la caché y otra para la red. La aplicación emplea el objeto caches
libre en window
para acceder a la memoria caché y recuperar los últimos datos. Este es un genial ejemplo de mejora progresiva ya que el objeto caches
puede no estar disponible en todos y cada uno de los navegadores, y si no es así, la petición de red debería marchar.
Actualiza la función getForecastFromCache()
para verificar si el objeto caches
está disponible en el objeto global window
y, si lo está, pide los datos de la memoria caché.
Después, debemos modificar a fin de que haga 2 llamadas, una a getForecastFromNetwork()
para obtener el pronóstico de la red y otra a getForecastFromCache()
para obtener el último pronóstico guardado en caché:
Nuestra aplicación meteorológica ahora realiza 2 solicitudes asíncronas de datos, una desde la caché y otra a través de un fetch
. Si hay datos en la caché, serán devueltos y procesados exageradamente rápido (decenas y decenas de milisegundos). Entonces, cuando responda fetch
, la tarjeta se actualizará con los datos más recientes directamente de la API meteorológica.
Observe cómo la solicitud de caché y la petición fetch
acaban con una llamada para actualizar la tarjeta de pronóstico. ¿Cómo sabe la aplicación si muestra los últimos datos? Esto se maneja en el siguiente código de renderForecast()
:
Cada vez que se actualiza una tarjeta, la aplicación guarda la marca de tiempo de los datos en un atributo escondo en la tarjeta. La aplicación sencillamente comprueba si la marca de tiempo que existe en la tarjeta es más reciente que los datos que se pasaron a la función.
En el service worker, agregamos un DATA_CACHE_NAME
para poder separar los datos de nuestras aplicaciones del shell de la aplicación. Cuando se actualiza el shell de la aplicación y se eliminan los cachés más antiguas, nuestros datos permanecerán intactos, listos para una carga súper rápida. Ten en cuenta que si su formato de datos cambia en el futuro, necesitará una forma de manejar eso y asegurar que el shell y el contenido de la aplicación estén sincronizados.
No olvides actualizar también CACHE_NAME
; Vamos a estar mudando todos nuestros recursos estáticos también.
Para que nuestra aplicación funcione sin conexión, debemos guardar previamente todos los recursos que necesita. Esto también ayudará a nuestro rendimiento. En lugar de tener que obtener todos y cada uno de los recursos de la red, la aplicación podrá cargarlos todos desde la caché local, suprimiendo la inestabilidad de la red.
Actualiza el array FILES_TO_CACHE
con la lista de archivos:
Ya que estamos generando manualmente la lista de ficheros a cachear, toda vez que actualizamos un fichero, debemos actualizar CACHE_NAME
. Pudimos eliminar offline.html
de nuestra lista de ficheros en caché porque nuestra aplicación ahora cuenta con todos los recursos necesarios para trabajar sin conexión y nunca volverá a mostrar la página sin conexión.
Para asegurar que nuestro acontecimiento activate
no suprime accidentariamente nuestros datos, en el evento activate
de service-worker.js
, reemplaza if (key !== CACHE_NAME)
con:
Necesitamos modificar el service worker para interceptar las solicitudes a la API metereológica y almacenar sus respuestas en la caché, para que podamos acceder a ellas fácilmente más adelante. En la estrategia stale-while-revalidate, aguardamos que la respuesta de la red sea la "fuente de la verdad", siempre y en todo momento nos da la información más reciente. Si no puede, está bien fallar pues ya hemos recuperado los últimos datos guardados en caché en nuestra aplicación.
Actualiza el manejador de acontecimiento fetch
para manejar las peticiones a la API de datos por separado de otras solicitudes.
El código intercepta la petición y verifica si es para un pronóstico del tiempo. Si es así, emplea fetch
para realizar la solicitud. En el momento en que se devuelve la respuesta, abre la memoria caché, clona la contestación, la almacena en la memoria caché y devuelve la contestación al demandante original.
Necesitamos quitar la comprobación evt.request.mode !== 'navigate'
porque queremos que nuestro service worker maneje todas las solicitudes (incluidas imágenes, scripts, archivos CSS, etcétera), no solo las navegaciones. Si dejamos ese registro, solo se entregará el HTML desde la memoria caché del service worker, todo lo demás se solicitará desde la red.
La aplicación, sin conexión, debe estar absolutamente funcional ahora. Actualiza la página para cerciorarte de que tienes instalado el service worker más reciente, entonces guarda un par de urbes y presiona el botón de actualización en la aplicación para obtener información actualizada sobre el tiempo.
Luego ve al panel Cache Storage en el panel Application de DevTools. Expande la sección y verás el nombre de su caché estático y la caché de datos en el lado izquierdo. Al abrir la caché de datos se deben enseñar los datos almacenados para cada urbe.
Luego, abre DevTools y cambia al panel service workers, y marca la casilla de verificación Offline, entonces intenta regresar a cargar la página, después desconecta y vuelve a cargar la página.
Si estás en una red rápida y desea ver cómo se actualiza datos de previsión del tiempo en una conexión lenta, ajusta el FORECAST_DELAY
propiedad en server.js
a 5000
. Todas las peticiones a la API de pronóstico se retrasarán 5000ms.
También es una buena idea regresar a ejecutar Lighthouse.
Auditoría SEO
Auditoría de Progressive Web App
start_url
responde con un doscientos cuando está desconectado.start_url.
Cuando se instala una Progressive Web Aplicación, se ve y se comporta como todas y cada una de las demás aplicaciones instaladas. Se comienza desde el mismo lugar que se lanzan otras aplicaciones. Se ejecuta en una aplicación sin una barra de direcciones o bien otra interfaz de usuario del navegador. Y como todas y cada una de las demás aplicaciones instaladas, es una aplicación de nivel superior en el conmutador de labores.
En Chrome, una Progressive Web Aplicación puede instalarse a través del menú contextual de 3 puntos, o puede suministrar un botón u otro componente de UI al usuario que le pedirá que instale tu aplicación.
Para que un usuario pueda instalar tu Progressive Web App, debe cumplir con . La manera más fácil de verificar es usar Lighthouse y cerciorarse de que cumpla con los criterios instalables.
Si has trabajado con este código, tu PWA ya debería cumplir con estos criterios.
Primero, agregamos el install.js
a nuestro archivo index.html
.
beforeinstallprompt
Si se cumple la función de agregar a la pantalla de inicio , Chrome activará un acontecimiento de beforeinstallprompt
, que puede emplear para apuntar que tu aplicación se puede "instalar" y después pedir al usuario que la instale. Añade el siguiente código para percibir el evento beforeinstallprompt
:
En nuestra función saveBeforeInstallPromptEvent
, saveBeforeInstallPromptEvent
una referencia al evento beforeinstallprompt
para poder llamar a prompt()
más adelante y actualizar nuestra interfaz de usuario para enseñar el botón de instalación.
Cuando el usuario hace click en el botón de instalación, debemos llamar a .prompt()
en el evento beforeinstallprompt
guardado. También necesitamos ocultar el botón de instalación, por el hecho de que solo se puede llamar a .prompt()
una vez en todos y cada acontecimiento guardado.
Al llamar a .prompt()
se mostrará un diálogo modal al usuario y se te pedirá que agregues tu aplicación a la pantalla de inicio.
Puedes verificar qué respondió el usuario al cuadro de diálogo de instalación escuchando la promesa que devuelve la propiedad userChoice
del acontecimiento beforeinstallprompt
salvado. La promesa devuelve un objeto con una propiedad outcome
después de que se haya mostrado la solicitud y el usuario haya contestado a ella.
Un comentario sobre userChoice
, , no es una función como podría esperarse.
Adicionalmente a cualquier UI que añadadas para instalar tu aplicación, los usuarios también pueden instalar tu PWA a través de otros métodos, por ejemplo, el menú de 3 puntos de Google Chrome. Para rastrear estos eventos, escuche el evento instalado.
Después, necesitaremos actualizar la función logAppInstalled
, para este laboratorio de código, solo usaremos console.log
, pero en una aplicación de producción, seguramente desearás registrar esto como un acontecimiento en tu software de analíticas.
No olvides actualizar CACHE_NAME
en tu fichero service-worker.js
, puesto que has efectuado cambios en los archivos que ya están en caché. Habilitar la casilla de verificación Bypass for network en el panel service workers del panel de aplicaciones en DevTools funcionará en el desarrollo, pero no ayudará en el mundo real.
Vamos a ver cómo fue nuestro paso de instalación. Para estar seguro, emplea el botón Clear site data en el panel de aplicaciones de DevTools para quitar todo y cerciorarte de que estamos comenzando de nuevo. Si ya instalaste la aplicación, asegúrate de desinstalarla, de lo contrario, el icono de instalación no volverá a aparecer.
Primero, comprobamos que nuestro ícono de instalación se muestre adecuadamente, asegúrate de probar esto tanto en el escritorio como en el móvil.
A continuación, nos cercioramos de que todo se instala apropiadamente y de que nuestros acontecimientos se activan correctamente. Puedes hacerlo tanto en tu escritorio como en tu móvil. Si quieres probar esto en el móvil, asegúrate de que estás utilizando la depuración remota para ver lo que se está registrado en la consola.
Ten en cuenta que si está ejecutando en el escritorio desde localhost, tu PWA instalada puede enseñar una pancarta de dirección porque localhost no se considera un host seguro.
Veamos también el comportamiento en iOS. Si tienes un dispositivo iOS, puedes utilizarlo, o si estás utilizando un Mac, prueba el simulador de iOS libre con Xcode.
La media query display-mode
deja aplicar estilos en dependencia de cómo se lanzó la aplicación, o determinar cómo se lanzó con JavaScript.
También puedes revisar la media query display-mode
con .
Recuerda, beforeinstallevent
no se dispara si la aplicación ya está instalada, con lo que a lo largo del desarrollo seguramente querrás instalarla y desinstalarla varias veces para cerciorarte de que todo marcha como se esperaba.
En Android se desinstalan de igual forma que otras aplicaciones instaladas.
En ChromeOS, las PWA se desinstalan fácilmente desde el cuadro de búsqueda del iniciador.
En Mac y Windows se deben desinstalar a través de Chrome.
¡Enhorabuena, has construido con éxito tu primera Progressive Web Aplicación!
Agregaste un manifiesto de aplicación web para dejar que se instalase, y agregaste un service worker para garantizar que tu PWA sea siempre rápida y fiable. Has aprendido cómo utilizar DevTools para auditar una aplicación y cómo esto puede mejorar la experiencia de usuario.
Ahora conoce los pasos clave necesarios para transformar cualquier aplicación web en una Progressive Web App.
Ayúdanos a mejorar nuestros laboratorios de códigos mandando una hoy. ¡Y gracias!