Progressive web apps:
UNIENDO DOS MUNDOS

Joel A. Villarreal Bertoldi

Joel A. Villarreal Bertoldi

¿Qué?
¿Cómo?
¿Dónde?

Web Mobile → PWA ← Native Apps

Compañeros inseparables. Casi como la pizza y la cerveza.

Basado en

progressive

enhancement

"It is now possible to provide a progressive, gradually enhanced experience across a wide array of browsers, using one markup document and a variety of different stylesheets"

"Inclusive Web Design for the Future" - Steve Champeon, SXSW 2003

Es decir: si se puede dar una mejor experiencia, ¡démosla!

Entonces, ¿Qué es una

progressive

Web APP?

A Progressive Web App uses

       modern web capabilities to deliver
       an app-like user experience. They
       evolve from pages in browser tabs
       to immersive, top-level apps,
       maintaining the web's low friction
       at every moment.

— Addy Osmani

Páginas que escapan de la pestaña del navegador para ofrecer una experiencia inmersiva de primera clase.

Progressive

Responsive

Connectivity independent

App-like

Fresh

Safe

Discoverable

Re-engageable

Installable

Linkable

UNA PWA ES...

Progressive

Responsive

Connectivity independent

App-like

Fresh

Safe

Discoverable

Re-engageable

Installable

Linkable

Funciona para todos los usuarios, sin importar el navegador que estén usando. Las PWAs se construyen en torno al paradigma de progressive enhancement.

UNA PWA ES...

Progressive

Responsive

Connectivity independent

App-like

Fresh

Safe

Discoverable

Re-engageable

Installable

Linkable

Se ajustan a cualquier form factor (desktop, mobile, tablets, lo que el futuro traiga).

UNA PWA ES...

Progressive

Responsive

Connectivity independent

App-like

Fresh

Safe

Discoverable

Re-engageable

Installable

Linkable

Utilizando Service Workers las PWAs pueden operar en modo offline o en redes con una conexión de baja calidad.

UNA PWA ES...

Progressive

Responsive

Connectivity independent

App-like

Fresh

Safe

Discoverable

Re-engageable

Installable

Linkable

Las PWAs emplean el modelo App Shell para ofrecer navegación e interacciones al estilo de una app nativa. 

UNA PWA ES...

Progressive

Responsive

Connectivity independent

App-like

Fresh

Safe

Discoverable

Re-engageable

Installable

Linkable

A través de procesos de actualización servidos vía Service Workers, la PWA siempre está actualizada.

UNA PWA ES...

Progressive

Responsive

Connectivity independent

App-like

Fresh

Safe

Discoverable

Re-engageable

Installable

Linkable

Las PWAs son servidas a través de HTTPS para asegurar la integridad del contenido ofrecido.

UNA PWA ES...

Progressive

Responsive

Connectivity independent

App-like

Fresh

Safe

Discoverable

Re-engageable

Installable

Linkable

Las PWAs pueden ser encontradas por buscadores gracias a los W3C Manifests y al scope de registración de los Service Workers.

UNA PWA ES...

Progressive

Responsive

Connectivity independent

App-like

Fresh

Safe

Discoverable

Re-engageable

Installable

Linkable

Las PWAs buscan la generación de hábitos de uso a través de características como Push Notifications.

UNA PWA ES...

Progressive

Responsive

Connectivity independent

App-like

Fresh

Safe

Discoverable

Re-engageable

Installable

Linkable

Los usuarios pueden conservar un shortcut a la PWA en su home screen sin las complicaciones de una app store.

UNA PWA ES...

Progressive

Responsive

Connectivity independent

App-like

Fresh

Safe

Discoverable

Re-engageable

Installable

Linkable

Las PWAs se pueden compartir directamente a través de URLs con un proceso de instalación muy simple.

UNA PWA ES...

Chrome, Opera,

Firefox y PWAs:

un sólo corazón

Safari:

Te seguimos
esperando.

(No hay soporte
para service
workers)

Buenísimo, pero... ¿MANIFEST? ¿SERVICE WORKER? ¿Y ESO?
 

¿Cómo se hace?

lo primero es un

Web app

manifest

https://www.w3.org/TR/appmanifest/

{
  "lang": "es",
  "dir": "ltr",
  "name": "MercadoLibre",
  "description": "Compra y vende...",
  "short_name": "MercadoLibre",
  "icons": [{
    "src": "icon/lowres.webp",
    "sizes": "64x64",
    "type": "image/webp"
  },{
    "src": "icon/lowres.png",
    "sizes": "64x64"
  }, {
    "src": "icon/hd_hi",
    "sizes": "128x128"
  }],
  "scope": "/meli/",
  "start_url": "/meli/start.html",
  "display": "fullscreen",
  "orientation": "portrait",
  "theme_color": "yellow",
  "background_color": "whgite"
}

Es un archivo JSON que controla cómo la app se presenta al usuario en convivencia con otras apps, qué puede ejecutarse y de qué manera.

manifest.json

resultado

INSTALACIÓN
ACCESO @ HOME
SPLASH SCREEN

luego aplicamos

add to home
banners

  • A través del Web App Manifest.
  • Requiere HTTPS.
  • Debe incluir Service Worker.
  • El banner se activa luego
    de dos visitas con al menos
    5 minutos de tiempo
    transcurrido entre ambas.

https://developers.google.com/web/updates/2015/03/increasing-engagement-with-app-install-banners-in-chrome-for-android

Resultado

IMAGINEMOS QUE ESTAMOS EN ESTA ISLA.

IMAGINEMOS QUE ESTAMOS EN ESTA ISLA.

sin internet.

pero queremos ver la fecha en que volvíamos a la civilización (viajamos
EN GLOBO AEROSTÁTICO).

(en el hipotético caso de que eso importara... yo me quedo ahí.)

Eso estaba en nuestra PWA, "GloboVuelos".

ACá podemos usar

service workers

Son scripts que corren en segundo plano, sensibles a eventos e incluso a tráfico de red, activándose sólo en respuesta a alguno de estos casos.

Permiten el acceso a la Cache API.

Cache API = pwa + mis datos

Cache API = pwa + mis datos

Nuestra app está cacheada,
carga mucho más rápido,
sin necesidad de conexión.

Los datos del usuario están cacheados. ¡Puedo ver la fecha de salida de mi globo aerostático!

Resultado

Herramientas:
sw-toolbox, sw-precache

Volvamos...

la cereza del postre:

pusH·PUSH!

(las notificaciones)

Permiten generar el hábito de usar la app, incluso fuera del navegador.

Requiere Web App Manifest + Service Worker.

Da acceso a la Push API.

¡OJO! Opera no tiene cerezas  notificaciones todavía.

Y eso no es todo...

PWA es un paradigma que fomenta el acoplado de múltiples herramientas que resultan en una notoria mejora de la experiencia de usuario.

background syncronisation

one-off

PERIODIC*

Un outbox para comunicarse con APIs en la nube, sensible a fallas de conectividad: intenta enviar datos a la API, y si falla, intenta más adelante, en segundo plano.

Permiten que el user-agent sincronice en el mejor momento de la manera menos disruptiva posible.

 

*en desarrollo

https://github.com/WICG/BackgroundSync/blob/master/explainer.md

web bluetooth

https://webbluetoothcg.github.io/web-bluetooth/

El objetivo es lograr la especificación de una API que permita a una Web App comunicarse con otros dispositivos vía Bluetooth.

Algunos casos de uso: Web Apps que controlen dispositivos a la Fitbit, unificar en un dashboard distintas métricas de diversos dispositivos Bluetooth, publicidad a partir de datos, control de audio...

PWA, además, se ve enriquecido por otros paradigmas provenientes de la esfera de UX.

https://developers.google.com/web/tools/chrome-devtools/profile/evaluate-performance/rail

RAIL
performance model

Response
Animation
Idle
Load
  • Foco en el usuario (usuario feliz > respuesta rápida en todo device).
  • Respuesta inmediata (feedback < 100ms).
  • Render de frames en 16ms o menos.
  • Consistencia.
  • Contenido interactivo en 1000ms o menos.

flip-based
animations

First, Last, Invert, Play

https://aerotwist.com/blog/flip-your-animations/

  • Consiste en precalcular la animación de forma dinámica para minimizar el impacto de procesamiento.
  • En base a los estados inicial y final (First, Last), se aplican transformaciones inversas (Invert) y se ejecutan las animaciones desde un faux First al removerlas.

Veamos algunas plantillas que nos facilitan la implementación del paradigma PWA.

App shell

  • Fomenta el caching de la estructura de la app (para que opere offline) y la carga de contenido vía JavaScript.
  • Permite la aparición inmediata de meaningful pixels sin necesidad de estar conectado (incluso si el contenido es online).
  • Se recomienda combinar server-side rendering con client-side progressive rendering.
  • Boilerplate: Node + Express.js. Implementación casi 100% del paradigma PWA.

https://github.com/addyosmani/app-shell

Web starter kit

  • Incluye Web App Manifest, Chrome for Android Splash Screen, Service Worker Pre-Caching (sw-precache).
  • Punto de partida para aplicaciones que prefieren vanilla JS/ES2015.
  • Ideal para desarmar y rearmar acorde a las necesidades del proyecto.

https://github.com/google/web-starter-kit

Recapitulemos.

El puente que une los mundos de web mobile y native apps se hace con...

web app manifest
add to home banners
service workers
push notifications

(y otras cosillas...)

y acá
se acabó.

Pueden leer más en:

https://addyosmani.com/blog/getting-started-with-progressive-web-apps/

https://developers.google.com/web/progressive-web-apps

https://www.w3.org/TR/appmanifest/

ALGUNAS HERRAMIENTAS:

App Shell: https://github.com/addyosmani/app-shell

Web Starter Kit: https://github.com/google/web-starter-kit

sw-precache: https://github.com/GoogleChrome/sw-precache/

también pueden consultarme ;)

¡Éxitos

y muchas

gracias!