SlideShare uma empresa Scribd logo
1 de 37
Baixar para ler offline
PROGRESSIVE WEB APPS
INTRODUCCIÓN A LAS
GABRIEL PERALES
twitter: @g_perales
github.com/gabrielperales
FULL STACK JAVASCRIPT DEVELOPER
INTRODUCCIÓN
¿QUE ES UNA PWA?
PROGRESSIVE WEB APPS
DEFINICIÓN
▸ Progressive Web Apps son aplicaciones web que son:
▸ Fehacientes - Cargan instantáneamente, incluso con
malas condiciones de conexión.
▸ Rápidas - Responden rápido a la interacción con el
usuario con animaciones suaves.
▸ Atractivas - Parecen aplicaciones nativas, con una
inmersiva experiencia de usuario.
PROGRESSIVE WEB APPS
FEHACIENTES: SERVICE WORKERS I
▸ Cuando lanzamos la aplicación, el
service worker permite a la PWA
cargar inmediatamente, sin
importar el estado de la conexión.
▸ Un service worker es como un
proxy escrito en JavaScript que te
permite controlar la caché y cómo
responder a peticiones de
recursos.
▸ Pre-cacheando recursos podemos
eliminar la dependencia de
conexión.
PROGRESSIVE WEB APPS
FEHACIENTES: SERVICE WORKERS II
PROGRESSIVE WEB APPS
RÁPIDAS: RENDERIZACIÓN OPTIMIZADA - HTML IMPORTS - HTTP/2
▸ Transiciones CSS3 (alcanzando 60fps con propiedades como will-change)
▸ Html imports
▸ HTTP/2 permite enviar varias respuestas para una sola petición. El servidor puede enviar recursos adicionales al
cliente, sin que el cliente los haya pedido explícitamente.
PROGRESSIVE WEB APPS
ATRACTIVAS I
▸ Conseguiremos que nuestras
aplicaciones sean más atractivas y
capten mejor la atención de los
usuarios.
▸ Podremos tener aplicaciones web
que funcionan a pantalla completa,
instalables y que reciben
notificaciones push aún cuando no
esté en primer plano.
PROGRESSIVE WEB APPS
ATRACTIVAS II
SERVICE WORKERS,
OFFLINE FIRST Y APP
SHELLS
APPLICATION
SHELL
PROGRESSIVE WEB APPS
QUE ES UN APPLICATION SHELL?
▸ Un application shell es
el HTML, CSS y
JavaScript mínimo
necesario para crear
una interfaz de usuario.
▸ Debe
▸ Cargar rápido
▸ Ser cacheado
▸ Mostrar contenido
dinámico
PROGRESSIVE WEB APPS
WEB APP MANIFEST FILE
▸ En las pwa podemos definir un
manifest.json en el cual podemos
incluir el nombre de nuestra
aplicación, iconos, si queremos
que la aplicación se vea en
pantalla completa cuando la
instalemos.
{
name: "MurciaFrontend WPA",
gcm_sender_id: "156559432692",
permissions: [
"gcm"
],
icons: [
{
src: "assets/icons/96.png",
sizes: "96x96",
type: "image/png"
},
{
src: "assets/icons/144.png",
sizes: "144x144",
type: "image/png"
},
{
src: "assets/icons/192.png",
sizes: "192x192",
type: "image/png"
}
],
start_url: "/",
display: "standalone",
theme_color: "#9A1319"
}
SERVICE
WORKERS
PROGRESSIVE WEB APPS
REGISTRANDO UN SERVICE WORKER
if('serviceWorker' in navigator) {
navigator.serviceWorker
.register('./service-worker.js', {scope: ‘/app'})
.then(function(register){
console.log('Service Worker Registered');
});
}
- Los service workers se definen en un archivo diferente al de nuestra aplicación.
- Importante!: El sw debe ser servido desde https
- Al registrar el sw podemos indicar un scope para especificar un subconjunto de los
contenidos sobre los que queramos que el sw tenga control. Fuera de ese ámbito, el sw no
tendrá efecto.
PROGRESSIVE WEB APPS
SERVICE WORKERS: EVENTOS
‣ Los service workers responden a eventos
‣ Eventos de ciclo de vida
‣ install
‣ activate
‣ message: Envío de mensajes al service worker
‣ navigator.serviceWorker.controller.postMessage(message);
‣ Eventos funcionales
‣ fetch: Petición http
‣ sync: Sincronización en segundo plano
‣ push: Notificación push
PROGRESSIVE WEB APPS
CICLO DE UN SERVICE WORKER
▸ Instalación: La primera vez que se ejecuta un sw cacheamos la app
shell.
▸ Activación: Si la fase de instalación se completa con éxito, activamos
el sw cacheando nuevos recursos y borrando la caché obsoleta.
▸ En espera: Esperamos que ocurran eventos (fetch, push, sync…)
var log = console.log.bind(console);
var err = console.error.bind(console);
self.addEventListener('install', (e)=>{ log('Service Worker: Installed'); });
self.addEventListener('activate',(e)=>{ log('Service Worker: Active'); });
self.addEventListener('fetch', (e)=>{ log('Service Worker: Fetch'); });
CACHEANDO
RECURSOS
PROGRESSIVE WEB APPS
CACHEANDO EL APPLICATION SHEL
const CACHE_VERSION = 'v1';
self.addEventListener('install', (event) => {
console.log('Service worker installing...');
event.waitUntil(
caches.open(CACHE_VERSION)
.then(cache => cache.addAll([
'/',
'index.html',
'main.js',
'css/style.css',
]))
);
});
En el momento en el que instalamos un service worker podemos cachear el application shell, puesto
que será la base de nuestra aplicación y siempre necesitaremos que esté disponible.
Si nuestra aplicación tiene muchos archivos, podemos usar plugins para grunt, gulp o wepback para
que nos cachee los ficheros estáticos eel application shell.
PROGRESSIVE WEB APPS
ELIMINANDO CACHES ANTIGUAS
self.addEventListener('activate', (event) => {
console.log('Service worker activating...');
console.log('Clearing old caches');
caches.keys()
.then(cacheNames => cacheNames
.filter(cacheName => cacheName !== CACHE_VERSION)
.forEach(cacheName => caches.delete(cacheName)));
});
El evento activate ocurre cuando se instala satisfactoriamente un service worker.
Si los recursos de nuestra aplicación han cambiado, y por eso estamos cargando un nuevo
service worker, éste es el momento para borrar los viejos recursos.
PROGRESSIVE WEB APPS
CACHEANDO RECURSOS I
self.addEventListener('fetch', (event) => {
console.log('Fetching: ', event.request.url);
if (event.request.method !== 'GET')
return fetch(event.request);
event.respondWith(
caches.match(event.request)
.then(
response =>
response
||
fetch(event.request)
.then(response =>
caches.open(CACHE_VERSION)
.then(cache => {
console.log('caching: ', event.request);
cache.put(event.request, response.clone());
return response;
})
)
.catch(err => cache.match('/fallback.html'))
)
);
});
PROGRESSIVE WEB APPS
CACHEANDO RECURSOS II
self.addEventListener('fetch', (event) => {
console.log('Fetching: ', event.request.url);
if (event.request.method !== 'GET')
return fetch(event.request);
event.respondWith(
fetch(event.request)
.then(response =>
caches.open(CACHE_VERSION)
.then(cache => {
console.log('caching: ', event.request);
cache.put(event.request, response.clone());
return response;
})
)
.catch(err =>
cache.match(event.request)
.catch(() => cache.match('/fallback.html'))
)
)
);
});
PROGRESSIVE WEB APPS
CACHEANDO RECURSOS III
▸ Condición de carrera?
▸ Promise.race(fetch(…), caches.match(…)) ?
▸ Gestión más compleja
▸ Google SW-Toolbox
// Match URLs that end in index.html
toolbox.router.get(/index.html$/, function(request) {
return new Response('Handled a request for ' + request.url);
});
// Match URLs that begin with https://api.example.com
toolbox.router.post(/^https://api.example.com//, apiHandler);
RECIBIENDO
NOTIFICACIONES
PROGRESSIVE WEB APPS
NOTIFICACIONES PUSH I
navigator.serviceWorker
.register('/sw.js')
.then(function(registration){
registration.pushManager
.subscribe({
userVisibleOnly: true,
applicationServerKey: publicKey,
})
.then(function(subscription){
// send subscription object to server
fetch('/subscription', {
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
method: 'POST',
body: JSON.stringify({ subscription: subscription }),
});
})
})
PROGRESSIVE WEB APPS
NOTIFICACIONES PUSH I
self.addEventListener('push', (event) => {
const json = JSON.parse(event.data.text());
event.waitUntil(
self.registration.showNotification(json.title, {
body: json.body,
})
);
});
DEMO
PROGRESSIVE WEB APPS
DEMO
▸ código: github.com/gabrielperales/MurciaFrontendPWA
▸ website: https://murciafrontendpwa.now.sh
EJEMPLOS DE
PWA
PROGRESSIVE WEB APPS
EJEMPLOS DE PWA
▸ mobile.twitter.com
▸ flipkart.com
▸ pokedex.org
▸ m.aliexpress.com
▸ washingtonpost.com/pwa
▸ wiki-offline.jakearchibald.com
▸ voice-memos.appspot.com
▸ pwa.rocks/
RECURSOS
PROGRESSIVE WEB APPS
RECURSOS
▸ Chrome Lighthouse extension
▸ SW Toolbox
▸ PouchDB
▸ whatwebcando.today
▸ PRPL Pattern
▸ sw-precache-webpack-plugin
▸ github.com/GoogleChrome/sw-precache
¿PREGUNTAS?
MUCHAS GRACIAS
ARTÍCULOS
PROGRESSIVE WEB APPS
ARTÍCULOS
▸ https://www.fastly.com/blog/service-workers-pwas-and-
whats-next-for-mobile
▸ https://www.polymer-project.org/1.0/toolbox/server
▸ https://medium.com/@addyosmani/progressive-web-
apps-with-react-js-part-i-introduction-50679aef2b12

Mais conteúdo relacionado

Destaque

Getting Started with Progressive Web Apps
Getting Started with Progressive Web AppsGetting Started with Progressive Web Apps
Getting Started with Progressive Web AppsBill Stavroulakis
 
Why Progressive Web App is what you need for your Business
Why Progressive Web App is what you need for your BusinessWhy Progressive Web App is what you need for your Business
Why Progressive Web App is what you need for your BusinessLets Grow Business
 
San Diego Daily Transcript - PR Newswire Event July 2009
San Diego Daily Transcript - PR Newswire Event July 2009San Diego Daily Transcript - PR Newswire Event July 2009
San Diego Daily Transcript - PR Newswire Event July 2009Michael Pranikoff
 
“How can we face Facebook?”
“How can we face Facebook?”“How can we face Facebook?”
“How can we face Facebook?”Coreconsulting
 
Introducción js
Introducción jsIntroducción js
Introducción jsTareas Db
 
The Hitchhiker's Guide to Building a Progressive Web App
The Hitchhiker's Guide to Building a Progressive Web AppThe Hitchhiker's Guide to Building a Progressive Web App
The Hitchhiker's Guide to Building a Progressive Web AppChristopher Nguyen
 
03. Introduccion a JavaScript y JQuery
03. Introduccion a JavaScript y JQuery03. Introduccion a JavaScript y JQuery
03. Introduccion a JavaScript y JQueryDanae Aguilar Guzmán
 
Demystifying progressive web apps
Demystifying progressive web appsDemystifying progressive web apps
Demystifying progressive web appsMarcus Hellberg
 
Progressive web apps
Progressive web appsProgressive web apps
Progressive web appsTimmy Kokke
 
Chris Wilson: Progressive Web Apps
Chris Wilson: Progressive Web AppsChris Wilson: Progressive Web Apps
Chris Wilson: Progressive Web AppsDanielle A Vincent
 
PWA 101
PWA 101PWA 101
PWA 101m_catt
 
Progressive web apps - prepare your web for 2017 (Devfest Ukraine 2016)
Progressive web apps - prepare your web for 2017 (Devfest Ukraine 2016)Progressive web apps - prepare your web for 2017 (Devfest Ukraine 2016)
Progressive web apps - prepare your web for 2017 (Devfest Ukraine 2016)jskvara
 
Offline-First Progressive Web Apps
Offline-First Progressive Web AppsOffline-First Progressive Web Apps
Offline-First Progressive Web AppsAditya Punjani
 
Progressive Web Apps
Progressive Web AppsProgressive Web Apps
Progressive Web AppsJana Moudrá
 
Turku <3 Frontend - Progressive Web Apps, Web and Apps
Turku <3 Frontend - Progressive Web Apps, Web and AppsTurku <3 Frontend - Progressive Web Apps, Web and Apps
Turku <3 Frontend - Progressive Web Apps, Web and AppsJoni Juup
 
Progressive Web Apps - Porque nativo no es significa mejor
Progressive Web Apps - Porque nativo no es significa mejorProgressive Web Apps - Porque nativo no es significa mejor
Progressive Web Apps - Porque nativo no es significa mejorIsrael Blancas
 
Building Progressive Web Apps (Kyle Buchanan)
Building Progressive Web Apps (Kyle Buchanan)Building Progressive Web Apps (Kyle Buchanan)
Building Progressive Web Apps (Kyle Buchanan)Red Hat Developers
 

Destaque (20)

Getting Started with Progressive Web Apps
Getting Started with Progressive Web AppsGetting Started with Progressive Web Apps
Getting Started with Progressive Web Apps
 
Why Progressive Web App is what you need for your Business
Why Progressive Web App is what you need for your BusinessWhy Progressive Web App is what you need for your Business
Why Progressive Web App is what you need for your Business
 
San Diego Daily Transcript - PR Newswire Event July 2009
San Diego Daily Transcript - PR Newswire Event July 2009San Diego Daily Transcript - PR Newswire Event July 2009
San Diego Daily Transcript - PR Newswire Event July 2009
 
“How can we face Facebook?”
“How can we face Facebook?”“How can we face Facebook?”
“How can we face Facebook?”
 
Introducción js
Introducción jsIntroducción js
Introducción js
 
The Hitchhiker's Guide to Building a Progressive Web App
The Hitchhiker's Guide to Building a Progressive Web AppThe Hitchhiker's Guide to Building a Progressive Web App
The Hitchhiker's Guide to Building a Progressive Web App
 
03. Introduccion a JavaScript y JQuery
03. Introduccion a JavaScript y JQuery03. Introduccion a JavaScript y JQuery
03. Introduccion a JavaScript y JQuery
 
Demystifying progressive web apps
Demystifying progressive web appsDemystifying progressive web apps
Demystifying progressive web apps
 
Clase2
Clase2Clase2
Clase2
 
Progressive web apps
Progressive web appsProgressive web apps
Progressive web apps
 
Chris Wilson: Progressive Web Apps
Chris Wilson: Progressive Web AppsChris Wilson: Progressive Web Apps
Chris Wilson: Progressive Web Apps
 
PWA 101
PWA 101PWA 101
PWA 101
 
Progressive web apps
Progressive web appsProgressive web apps
Progressive web apps
 
Progressive web apps - prepare your web for 2017 (Devfest Ukraine 2016)
Progressive web apps - prepare your web for 2017 (Devfest Ukraine 2016)Progressive web apps - prepare your web for 2017 (Devfest Ukraine 2016)
Progressive web apps - prepare your web for 2017 (Devfest Ukraine 2016)
 
Offline-First Progressive Web Apps
Offline-First Progressive Web AppsOffline-First Progressive Web Apps
Offline-First Progressive Web Apps
 
Progressive Web Apps
Progressive Web AppsProgressive Web Apps
Progressive Web Apps
 
Turku <3 Frontend - Progressive Web Apps, Web and Apps
Turku <3 Frontend - Progressive Web Apps, Web and AppsTurku <3 Frontend - Progressive Web Apps, Web and Apps
Turku <3 Frontend - Progressive Web Apps, Web and Apps
 
Progressive Web Apps
Progressive Web AppsProgressive Web Apps
Progressive Web Apps
 
Progressive Web Apps - Porque nativo no es significa mejor
Progressive Web Apps - Porque nativo no es significa mejorProgressive Web Apps - Porque nativo no es significa mejor
Progressive Web Apps - Porque nativo no es significa mejor
 
Building Progressive Web Apps (Kyle Buchanan)
Building Progressive Web Apps (Kyle Buchanan)Building Progressive Web Apps (Kyle Buchanan)
Building Progressive Web Apps (Kyle Buchanan)
 

Semelhante a Introducción a las Progressive web apps

"Los Imprescindibles de .NetCore"
"Los Imprescindibles de .NetCore""Los Imprescindibles de .NetCore"
"Los Imprescindibles de .NetCore"www.encamina.com
 
Tecnologías para microservicios
Tecnologías para microserviciosTecnologías para microservicios
Tecnologías para microserviciosPedro J. Molina
 
Introducción a PWA
Introducción a PWAIntroducción a PWA
Introducción a PWAJose Leiva
 
Congreso visión 2012 - taller introducción app engine
Congreso visión 2012 - taller introducción app engineCongreso visión 2012 - taller introducción app engine
Congreso visión 2012 - taller introducción app engineNigeŗ Arce
 
LabAndroid: Taller "Mi Primera Aplicación Android"
LabAndroid: Taller "Mi Primera Aplicación Android"LabAndroid: Taller "Mi Primera Aplicación Android"
LabAndroid: Taller "Mi Primera Aplicación Android"Alberto Ruibal
 
Magallanes, Herramienta de despliegue PHP sencilla y poderosa
Magallanes, Herramienta de despliegue PHP sencilla y poderosa�Magallanes, Herramienta de despliegue PHP sencilla y poderosa�
Magallanes, Herramienta de despliegue PHP sencilla y poderosaFco Javier Núñez Berrocoso
 
Creando controles para Xamarin.Forms
Creando controles para Xamarin.FormsCreando controles para Xamarin.Forms
Creando controles para Xamarin.FormsJavier Suárez Ruiz
 
PWA (Progressive Web App): Nueva generación web
PWA (Progressive Web App): Nueva generación webPWA (Progressive Web App): Nueva generación web
PWA (Progressive Web App): Nueva generación webCarlosDarko1
 
Wampserver definicion e instalacion y configuarcion
Wampserver definicion e instalacion y configuarcionWampserver definicion e instalacion y configuarcion
Wampserver definicion e instalacion y configuarcionClarita cesy Segovia jaco
 
Progressive web apps
Progressive web apps Progressive web apps
Progressive web apps Biko
 
Cloudevel - Microsoft Azure - 101
Cloudevel - Microsoft Azure - 101Cloudevel - Microsoft Azure - 101
Cloudevel - Microsoft Azure - 101Mauro Parra-Miranda
 
Node.js - un poco de informacion.
Node.js - un poco de informacion.Node.js - un poco de informacion.
Node.js - un poco de informacion.Luis Toscano
 
Desarrollo de aplicaciones multiplataforma 2/2
Desarrollo de aplicaciones multiplataforma 2/2Desarrollo de aplicaciones multiplataforma 2/2
Desarrollo de aplicaciones multiplataforma 2/2Ignacio Muñoz Vicente
 
SPS Madrid 2019 - Eleva tu aplicaciones de PowerApps a otro nivel
SPS Madrid 2019 - Eleva tu aplicaciones de PowerApps a otro nivelSPS Madrid 2019 - Eleva tu aplicaciones de PowerApps a otro nivel
SPS Madrid 2019 - Eleva tu aplicaciones de PowerApps a otro nivelImanol Iza Martin
 

Semelhante a Introducción a las Progressive web apps (20)

Progressive Web Apps
Progressive Web AppsProgressive Web Apps
Progressive Web Apps
 
"Los Imprescindibles de .NetCore"
"Los Imprescindibles de .NetCore""Los Imprescindibles de .NetCore"
"Los Imprescindibles de .NetCore"
 
Web workers
Web workersWeb workers
Web workers
 
Tecnologías para microservicios
Tecnologías para microserviciosTecnologías para microservicios
Tecnologías para microservicios
 
Introducción a PWA
Introducción a PWAIntroducción a PWA
Introducción a PWA
 
Congreso visión 2012 - taller introducción app engine
Congreso visión 2012 - taller introducción app engineCongreso visión 2012 - taller introducción app engine
Congreso visión 2012 - taller introducción app engine
 
LabAndroid: Taller "Mi Primera Aplicación Android"
LabAndroid: Taller "Mi Primera Aplicación Android"LabAndroid: Taller "Mi Primera Aplicación Android"
LabAndroid: Taller "Mi Primera Aplicación Android"
 
Magallanes, Herramienta de despliegue PHP sencilla y poderosa
Magallanes, Herramienta de despliegue PHP sencilla y poderosa�Magallanes, Herramienta de despliegue PHP sencilla y poderosa�
Magallanes, Herramienta de despliegue PHP sencilla y poderosa
 
Creando controles para Xamarin.Forms
Creando controles para Xamarin.FormsCreando controles para Xamarin.Forms
Creando controles para Xamarin.Forms
 
PWA (Progressive Web App): Nueva generación web
PWA (Progressive Web App): Nueva generación webPWA (Progressive Web App): Nueva generación web
PWA (Progressive Web App): Nueva generación web
 
Wampserver definicion e instalacion y configuarcion
Wampserver definicion e instalacion y configuarcionWampserver definicion e instalacion y configuarcion
Wampserver definicion e instalacion y configuarcion
 
Progressive Web Apps - .NET Conf CO 2017
Progressive Web Apps - .NET Conf CO 2017Progressive Web Apps - .NET Conf CO 2017
Progressive Web Apps - .NET Conf CO 2017
 
Progressive web apps
Progressive web apps Progressive web apps
Progressive web apps
 
Cloudevel - Microsoft Azure - 101
Cloudevel - Microsoft Azure - 101Cloudevel - Microsoft Azure - 101
Cloudevel - Microsoft Azure - 101
 
Kit para crear un Sitio Web Móvil asombroso!
Kit para crear un Sitio Web Móvil asombroso!Kit para crear un Sitio Web Móvil asombroso!
Kit para crear un Sitio Web Móvil asombroso!
 
Node.js - un poco de informacion.
Node.js - un poco de informacion.Node.js - un poco de informacion.
Node.js - un poco de informacion.
 
Cv dennys-jose-marquez-reyes-desarrollador-web
Cv dennys-jose-marquez-reyes-desarrollador-webCv dennys-jose-marquez-reyes-desarrollador-web
Cv dennys-jose-marquez-reyes-desarrollador-web
 
WordPress y JavaScript
WordPress y JavaScriptWordPress y JavaScript
WordPress y JavaScript
 
Desarrollo de aplicaciones multiplataforma 2/2
Desarrollo de aplicaciones multiplataforma 2/2Desarrollo de aplicaciones multiplataforma 2/2
Desarrollo de aplicaciones multiplataforma 2/2
 
SPS Madrid 2019 - Eleva tu aplicaciones de PowerApps a otro nivel
SPS Madrid 2019 - Eleva tu aplicaciones de PowerApps a otro nivelSPS Madrid 2019 - Eleva tu aplicaciones de PowerApps a otro nivel
SPS Madrid 2019 - Eleva tu aplicaciones de PowerApps a otro nivel
 

Introducción a las Progressive web apps

  • 4.
  • 5. PROGRESSIVE WEB APPS DEFINICIÓN ▸ Progressive Web Apps son aplicaciones web que son: ▸ Fehacientes - Cargan instantáneamente, incluso con malas condiciones de conexión. ▸ Rápidas - Responden rápido a la interacción con el usuario con animaciones suaves. ▸ Atractivas - Parecen aplicaciones nativas, con una inmersiva experiencia de usuario.
  • 6. PROGRESSIVE WEB APPS FEHACIENTES: SERVICE WORKERS I ▸ Cuando lanzamos la aplicación, el service worker permite a la PWA cargar inmediatamente, sin importar el estado de la conexión. ▸ Un service worker es como un proxy escrito en JavaScript que te permite controlar la caché y cómo responder a peticiones de recursos. ▸ Pre-cacheando recursos podemos eliminar la dependencia de conexión.
  • 8. PROGRESSIVE WEB APPS RÁPIDAS: RENDERIZACIÓN OPTIMIZADA - HTML IMPORTS - HTTP/2 ▸ Transiciones CSS3 (alcanzando 60fps con propiedades como will-change) ▸ Html imports ▸ HTTP/2 permite enviar varias respuestas para una sola petición. El servidor puede enviar recursos adicionales al cliente, sin que el cliente los haya pedido explícitamente.
  • 9. PROGRESSIVE WEB APPS ATRACTIVAS I ▸ Conseguiremos que nuestras aplicaciones sean más atractivas y capten mejor la atención de los usuarios. ▸ Podremos tener aplicaciones web que funcionan a pantalla completa, instalables y que reciben notificaciones push aún cuando no esté en primer plano.
  • 13. PROGRESSIVE WEB APPS QUE ES UN APPLICATION SHELL? ▸ Un application shell es el HTML, CSS y JavaScript mínimo necesario para crear una interfaz de usuario. ▸ Debe ▸ Cargar rápido ▸ Ser cacheado ▸ Mostrar contenido dinámico
  • 14. PROGRESSIVE WEB APPS WEB APP MANIFEST FILE ▸ En las pwa podemos definir un manifest.json en el cual podemos incluir el nombre de nuestra aplicación, iconos, si queremos que la aplicación se vea en pantalla completa cuando la instalemos. { name: "MurciaFrontend WPA", gcm_sender_id: "156559432692", permissions: [ "gcm" ], icons: [ { src: "assets/icons/96.png", sizes: "96x96", type: "image/png" }, { src: "assets/icons/144.png", sizes: "144x144", type: "image/png" }, { src: "assets/icons/192.png", sizes: "192x192", type: "image/png" } ], start_url: "/", display: "standalone", theme_color: "#9A1319" }
  • 16. PROGRESSIVE WEB APPS REGISTRANDO UN SERVICE WORKER if('serviceWorker' in navigator) { navigator.serviceWorker .register('./service-worker.js', {scope: ‘/app'}) .then(function(register){ console.log('Service Worker Registered'); }); } - Los service workers se definen en un archivo diferente al de nuestra aplicación. - Importante!: El sw debe ser servido desde https - Al registrar el sw podemos indicar un scope para especificar un subconjunto de los contenidos sobre los que queramos que el sw tenga control. Fuera de ese ámbito, el sw no tendrá efecto.
  • 17. PROGRESSIVE WEB APPS SERVICE WORKERS: EVENTOS ‣ Los service workers responden a eventos ‣ Eventos de ciclo de vida ‣ install ‣ activate ‣ message: Envío de mensajes al service worker ‣ navigator.serviceWorker.controller.postMessage(message); ‣ Eventos funcionales ‣ fetch: Petición http ‣ sync: Sincronización en segundo plano ‣ push: Notificación push
  • 18. PROGRESSIVE WEB APPS CICLO DE UN SERVICE WORKER ▸ Instalación: La primera vez que se ejecuta un sw cacheamos la app shell. ▸ Activación: Si la fase de instalación se completa con éxito, activamos el sw cacheando nuevos recursos y borrando la caché obsoleta. ▸ En espera: Esperamos que ocurran eventos (fetch, push, sync…) var log = console.log.bind(console); var err = console.error.bind(console); self.addEventListener('install', (e)=>{ log('Service Worker: Installed'); }); self.addEventListener('activate',(e)=>{ log('Service Worker: Active'); }); self.addEventListener('fetch', (e)=>{ log('Service Worker: Fetch'); });
  • 20. PROGRESSIVE WEB APPS CACHEANDO EL APPLICATION SHEL const CACHE_VERSION = 'v1'; self.addEventListener('install', (event) => { console.log('Service worker installing...'); event.waitUntil( caches.open(CACHE_VERSION) .then(cache => cache.addAll([ '/', 'index.html', 'main.js', 'css/style.css', ])) ); }); En el momento en el que instalamos un service worker podemos cachear el application shell, puesto que será la base de nuestra aplicación y siempre necesitaremos que esté disponible. Si nuestra aplicación tiene muchos archivos, podemos usar plugins para grunt, gulp o wepback para que nos cachee los ficheros estáticos eel application shell.
  • 21. PROGRESSIVE WEB APPS ELIMINANDO CACHES ANTIGUAS self.addEventListener('activate', (event) => { console.log('Service worker activating...'); console.log('Clearing old caches'); caches.keys() .then(cacheNames => cacheNames .filter(cacheName => cacheName !== CACHE_VERSION) .forEach(cacheName => caches.delete(cacheName))); }); El evento activate ocurre cuando se instala satisfactoriamente un service worker. Si los recursos de nuestra aplicación han cambiado, y por eso estamos cargando un nuevo service worker, éste es el momento para borrar los viejos recursos.
  • 22. PROGRESSIVE WEB APPS CACHEANDO RECURSOS I self.addEventListener('fetch', (event) => { console.log('Fetching: ', event.request.url); if (event.request.method !== 'GET') return fetch(event.request); event.respondWith( caches.match(event.request) .then( response => response || fetch(event.request) .then(response => caches.open(CACHE_VERSION) .then(cache => { console.log('caching: ', event.request); cache.put(event.request, response.clone()); return response; }) ) .catch(err => cache.match('/fallback.html')) ) ); });
  • 23. PROGRESSIVE WEB APPS CACHEANDO RECURSOS II self.addEventListener('fetch', (event) => { console.log('Fetching: ', event.request.url); if (event.request.method !== 'GET') return fetch(event.request); event.respondWith( fetch(event.request) .then(response => caches.open(CACHE_VERSION) .then(cache => { console.log('caching: ', event.request); cache.put(event.request, response.clone()); return response; }) ) .catch(err => cache.match(event.request) .catch(() => cache.match('/fallback.html')) ) ) ); });
  • 24. PROGRESSIVE WEB APPS CACHEANDO RECURSOS III ▸ Condición de carrera? ▸ Promise.race(fetch(…), caches.match(…)) ? ▸ Gestión más compleja ▸ Google SW-Toolbox // Match URLs that end in index.html toolbox.router.get(/index.html$/, function(request) { return new Response('Handled a request for ' + request.url); }); // Match URLs that begin with https://api.example.com toolbox.router.post(/^https://api.example.com//, apiHandler);
  • 26. PROGRESSIVE WEB APPS NOTIFICACIONES PUSH I navigator.serviceWorker .register('/sw.js') .then(function(registration){ registration.pushManager .subscribe({ userVisibleOnly: true, applicationServerKey: publicKey, }) .then(function(subscription){ // send subscription object to server fetch('/subscription', { headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', }, method: 'POST', body: JSON.stringify({ subscription: subscription }), }); }) })
  • 27. PROGRESSIVE WEB APPS NOTIFICACIONES PUSH I self.addEventListener('push', (event) => { const json = JSON.parse(event.data.text()); event.waitUntil( self.registration.showNotification(json.title, { body: json.body, }) ); });
  • 28. DEMO
  • 29. PROGRESSIVE WEB APPS DEMO ▸ código: github.com/gabrielperales/MurciaFrontendPWA ▸ website: https://murciafrontendpwa.now.sh
  • 31. PROGRESSIVE WEB APPS EJEMPLOS DE PWA ▸ mobile.twitter.com ▸ flipkart.com ▸ pokedex.org ▸ m.aliexpress.com ▸ washingtonpost.com/pwa ▸ wiki-offline.jakearchibald.com ▸ voice-memos.appspot.com ▸ pwa.rocks/
  • 33. PROGRESSIVE WEB APPS RECURSOS ▸ Chrome Lighthouse extension ▸ SW Toolbox ▸ PouchDB ▸ whatwebcando.today ▸ PRPL Pattern ▸ sw-precache-webpack-plugin ▸ github.com/GoogleChrome/sw-precache
  • 37. PROGRESSIVE WEB APPS ARTÍCULOS ▸ https://www.fastly.com/blog/service-workers-pwas-and- whats-next-for-mobile ▸ https://www.polymer-project.org/1.0/toolbox/server ▸ https://medium.com/@addyosmani/progressive-web- apps-with-react-js-part-i-introduction-50679aef2b12