SlideShare uma empresa Scribd logo
OFFLINE WEB COM 
SERVICE WORKERS
sergiolopes.org 
@sergio_caelum
WEB. OFFLINE?
os primórdios do HTML5 offline 
Application Cache API
Minha página offline… 
<html manifest="demo.appcache">
O manifesto… 
CACHE MANIFEST 
/index.html 
/imagens/logo.png 
/javascript/script.js 
/css/estilo.css
O manifesto… 
CACHE MANIFEST 
/index.html 
/imagens/logo.png 
/javascript/script.js 
/css/estilo.css 
NETWORK: 
http://www.google-analytics.com/ga.js
O manifesto… 
CACHE MANIFEST 
/index.html 
/imagens/logo.png 
/javascript/script.js 
/css/estilo.css 
NETWORK: 
http://www.google-analytics.com/ga.js 
FALLBACK: 
/img/avatares/ /img/avatar-generico.png
Pronto! 
O maravilhoso AppCache entra em ação.
Offline Web com Service Workers - Sérgio Lopes
Tem que acertar o mime-type no servidor.
Tem que acertar o mime-type no servidor. 
Não posso esquecer nenhuma URL.
Tem que acertar o mime-type no servidor. 
Não posso esquecer nenhuma URL. 
Sempre cacheia a página.
Tem que acertar o mime-type no servidor. 
Não posso esquecer nenhuma URL. 
Sempre cacheia a página. 
Nada pode dar erro 404 ou 500.
Tem que acertar o mime-type no servidor. 
Não posso esquecer nenhuma URL. 
Sempre cacheia a página. 
Nada pode dar erro 404 ou 500. 
Cuidado pra não cachear o manifesto.
Tem que acertar o mime-type no servidor. 
Não posso esquecer nenhuma URL. 
Sempre cacheia a página. 
Nada pode dar erro 404 ou 500. 
Cuidado pra não cachear o manifesto. 
Usuário não pode controlar nada.
Tem que acertar o mime-type no servidor. 
Não posso esquecer nenhuma URL. 
Sempre cacheia a página. 
Nada pode dar erro 404 ou 500. 
Cuidado pra não cachear o manifesto. 
Usuário não pode controlar nada. 
Impossível escolher o que cachear.
Tem que acertar o mime-type no servidor. 
Não posso esquecer nenhuma URL. 
Sempre cacheia a página. 
Nada pode dar erro 404 ou 500. 
Cuidado pra não cachear o manifesto. 
Usuário não pode controlar nada. 
Impossível escolher o que cachear. 
Potencial para detonar o 3G do usuário.
Tem que acertar o mime-type no servidor. 
Não posso esquecer nenhuma URL. 
Sempre cacheia a página. 
Nada pode dar erro 404 ou 500. 
Cuidado pra não cachear o manifesto. 
Usuário não pode controlar nada. 
Impossível escolher o que cachear. 
Potencial para detonar o 3G do usuário. 
Remover o cache é um parto.
Tem que acertar o mime-type no servidor. 
Não posso esquecer nenhuma URL. 
Sempre cacheia a página. 
Nada pode dar erro 404 ou 500. 
Cuidado pra não cachear o manifesto. 
Usuário não pode controlar nada. 
Impossível escolher o que cachear. 
Potencial para detonar o 3G do usuário. 
Remover o cache é um parto. 
Não posso impedir update automático.
Tem que acertar o mime-type no servidor. 
Não posso esquecer nenhuma URL. 
Sempre cacheia a página. 
Nada pode dar erro 404 ou 500. 
Cuidado pra não cachear o manifesto. 
Usuário não pode controlar nada. 
Impossível escolher o que cachear. 
Potencial para detonar o 3G do usuário. 
Remover o cache é um parto. 
Não posso impedir update automático. 
Terrível pra desenvolver e debugar.
Tem que acertar o mime-type no servidor. 
Não posso esquecer nenhuma URL. 
Sempre cacheia a página. 
Nada pode dar erro 404 ou 500. 
Cuidado pra não cachear o manifesto. 
Usuário não pode controlar nada. 
Impossível escolher o que cachear. 
Potencial para detonar o 3G do usuário. 
Remover o cache é um parto. 
Não posso impedir update automático. 
Terrível pra desenvolver e debugar. …
Tem que acertar o mime-type no servidor. 
Não posso esquecer nenhuma URL. 
Sempre cacheia AppCache a página. 
é 
Nada pode dar erro limitado 404 ou 500. 
e 
Cuidado pra não cachear o manifesto. 
Usuário não pode controlar nada. 
Impossível chato, escolher complicado. 
o que cachear. 
Potencial para detonar o 3G do usuário. 
Remover o cache é um parto. 
Não posso impedir update automático. 
Terrível pra desenvolver e debugar. …
http://sergiolopes.org/palestra-appcache-html5-offline/
Declarativo e Mágico.
SERVICE 
WORKERS
<!DOCTYPE html> 
<html> 
<head> 
</head> 
<body> 
<h1>Página offline</h1> 
</body> 
</html>
<!DOCTYPE html> 
<html> 
<head> 
<script> 
navigator.serviceWorker.register('o-futuro.js'); 
</script> 
</head> 
<body> 
<h1>Página offline</h1> 
</body> 
</html>
this.onfetch = function(event) { 
console.log(event.request.url); 
};
this.onfetch = function(event) { 
event.respondWith( 
new Response("<h1>Página offline!</h1>") 
); 
};
SERVICE 
WORKER 
É um Worker orientado a eventos, que controla as 
páginas em background. Lá, tudo é assíncrono, e 
ele pode interceptar chamadas de rede e usar um 
cache de recursos.
JAVASCRIPT COMUM 
<script src="script.js" async></script>
JAVASCRIPT COMUM 
<script src="script.js" async></script> 
DOM 
CSSOM 
LAYOUT 
EVENTOS 
SCROLL
JAVASCRIPT COMUM 
<script src="script.js" async></script> 
DOM 
script 
CSSOM 
script 
LAYOUT 
script 
EVENTOS 
script 
SCROLL
WEB WORKERS 
<script> new Worker('worker.js'); </script>
WEB WORKERS 
<script> new Worker('worker.js'); </script> 
DOM 
CSSOM 
LAYOUT 
EVENTOS 
SCROLL
WEB WORKERS 
<script> new Worker('worker.js'); </script> 
script 
script 
script 
script 
DOM 
CSSOM 
LAYOUT 
EVENTOS 
SCROLL
WEB WORKERS 
PÁGINA 
#1
PÁGINA 
#1 
web worker A 
WEB WORKERS
PÁGINA 
#1 
web worker A 
WEB WORKERS 
web worker B
PÁGINA 
#1 
web worker A 
WEB WORKERS 
web worker B 
PÁGINA 
#2 
web worker A 
web worker B
WEB WORKERS 
PÁGINA 
#2 
web worker A 
web worker B
WEB WORKERS
<script>navigator.serviceWorker.register('sw.js');</PÁGINA 
#1 
Service Worker 
PÁGINA 
#2 
PÁGINA 
#3 
SERVICE WORKER
SERVICE WORKER 
<script>navigator.serviceWorker.register('sw.js');</PÁGINA 
#1 
Service Worker 
PÁGINA 
#2
SERVICE WORKER 
<script>navigator.serviceWorker.register('sw.js');</PÁGINA 
#1 
Service Worker
SERVICE WORKER 
<script>navigator.serviceWorker.register('sw.js');</Service Worker
SERVICE 
WORKER 
É um Worker orientado a eventos, que controla as 
páginas em background. Lá, tudo é assíncrono, e 
ele pode interceptar chamadas de rede e usar um 
cache de recursos.
PROMISES 
navigator.serviceWorker.register('sw.js').then(function(){ 
console.log('Registrado!'); 
}, function(erro) { 
console.log('Problemas', erro); 
});
EVENTOS 
this.oninstall = function(event) { 
console.log('instalou'); 
}; 
this.onactivate = function(event) { 
console.log('ativou'); 
}; 
this.onfetch = function(event) { 
event.respondWith( 
new Response("<h1>Página offline!</h1>”) 
); 
};
CACHE API
caches.open('aplicacao');
caches.open('aplicacao').then(function(cache) { 
});
caches.open('aplicacao').then(function(cache) { 
cache.add('pg.html'); 
});
caches.open('aplicacao').then(function(cache) { 
cache.put('pg.html', new Response("Página offline")); 
});
caches.open('aplicacao').then(function(cache) { 
cache.add('pg.html'); 
cache.add('style.css'); 
});
caches.open('aplicacao').then(function(cache) { 
cache.addAll([ 
'/index.html', 
'/style.css', 
'/logo.png', 
'/contato.html', 
'http://code.jquery.com/jquery-2.1.1.min.js' 
]); 
})
caches.open('aplicacao').then(function(cache) { 
return cache.addAll([ 
'/index.html', 
'/style.css', 
'/logo.png', 
'/contato.html', 
'http://code.jquery.com/jquery-2.1.1.min.js' 
]); 
})
this.oninstall = function(event) { 
caches.open('aplicacao').then(function(cache) { 
return cache.addAll([ 
'/index.html', 
'/style.css', 
'/logo.png', 
'/contato.html', 
'http://code.jquery.com/jquery-2.1.1.min.js' 
]); 
}) 
};
this.oninstall = function(event) { 
event.waitUntil( 
caches.open('aplicacao').then(function(cache) { 
return cache.addAll([ 
'/index.html', 
'/style.css', 
'/logo.png', 
'/contato.html', 
'http://code.jquery.com/jquery-2.1.1.min.js' 
]); 
}) 
); 
};
CACHE 
programático & controlável
CACHE 
programático & controlável 
Cacheio URLs como quero.
CACHE 
programático & controlável 
Cacheio URLs como quero. 
Gero endereços num for com certa regra.
CACHE 
programático & controlável 
Cacheio URLs como quero. 
Gero endereços num for com certa regra. 
Recursos diferentes dependendo do browser.
CACHE 
programático & controlável 
Cacheio URLs como quero. 
Gero endereços num for com certa regra. 
Recursos diferentes dependendo do browser. 
Levo em conta alguma preferência do usuário.
CACHE 
programático & controlável 
Cacheio URLs como quero. 
Gero endereços num for com certa regra. 
Recursos diferentes dependendo do browser. 
Levo em conta alguma preferência do usuário. 
Mudo de acordo com hardware e contexto.
RESPOSTA OFFLINE
this.onfetch = function(event) { 
console.log(event.request.url); 
};
this.onfetch = function(event) { 
event.respondWith( 
new Response(‘conteúdo!') 
); 
};
this.onfetch = function(event) { 
event.respondWith( 
caches.match(event.request) 
); 
};
Offline Web com Service Workers - Sérgio Lopes
RESPOSTA DO CACHE
RESPOSTA DO CACHE 
E se não existir?
this.onfetch = function(event) { 
event.respondWith( 
caches.match(event.request).then(function(response){ 
}) 
); 
};
this.onfetch = function(event) { 
event.respondWith( 
caches.match(event.request).then(function(response){ 
return response || event.default(); 
}) 
); 
};
Offline Web com Service Workers - Sérgio Lopes
BAIXA NA REDE
BAIXA NA REDE 
E se estiver offline?
this.onfetch = function(event) { 
event.respondWith( 
caches.match(event.request).then(function(response){ 
return response || event.default(); 
}).catch(function() { 
return caches.match('/contato.html'); 
}) 
); 
};
FALLBACK DE URLs
RESPOSTA 
programática & controlável
RESPOSTA 
programática & controlável 
Busco no cache.
RESPOSTA 
programática & controlável 
Busco no cache. 
Busco na rede.
RESPOSTA 
programática & controlável 
Busco no cache. 
Busco na rede. 
Devolvo fallback.
RESPOSTA 
programática & controlável 
Busco no cache. 
Busco na rede. 
Devolvo fallback. 
Construo resposta na mão.
RESPOSTA 
programática & controlável 
Busco no cache. 
Busco na rede. 
Devolvo fallback. 
Construo resposta na mão. 
Tudo com a lógica e a sequência que eu quiser.
ATUALIZAÇÕES
Offline Web com Service Workers - Sérgio Lopes
Mudo o worker.js
Mudo o worker.js 
Detecta na próxima navegação.
Mudo o worker.js 
Detecta na próxima navegação. 
Dispara instalação (oninstall) em background.
Mudo o worker.js 
Detecta na próxima navegação. 
Dispara instalação (oninstall) em background. 
(worker original ainda comanda a página)
Mudo o worker.js 
Detecta na próxima navegação. 
Dispara instalação (oninstall) em background. 
(worker original ainda comanda a página) 
Fecho a página.
Mudo o worker.js 
Detecta na próxima navegação. 
Dispara instalação (oninstall) em background. 
(worker original ainda comanda a página) 
Fecho a página. 
Worker velho é desativado.
Mudo o worker.js 
Detecta na próxima navegação. 
Dispara instalação (oninstall) em background. 
(worker original ainda comanda a página) 
Fecho a página. 
Worker velho é desativado. 
Novo worker é ativado (onactivate).
Mudo o worker.js 
Detecta na próxima navegação. 
Dispara instalação (oninstall) em background. 
(worker original ainda comanda a página) 
Fecho a página. 
Worker velho é desativado. 
Novo worker é ativado (onactivate). 
(novo worker em ação)
Mudo o worker.js 
Detecta na próxima navegação. 
Dispara instalação (oninstall) em background. 
(worker original ainda comanda a página) 
Fecho a página. 
Worker velho é desativado. 
Novo worker é ativado (onactivate). 
(novo worker em ação) 
Abro a página de novo.
this.oninstall = function(event) { 
event.waitUntil( 
caches.open('aplicacao-v2').then(function(cache) return cache.addAll([ 
'/index.html', 
'/style.css', 
'/logo.png', 
'/contato.html', 
'http://code.jquery.com/jquery-2.1.1.min.js' 
]); 
}) 
); 
};
this.onactivate = function(event) { 
event.waitUntil( 
caches.delete('aplicacao-v1') 
); 
};
ATUALIZAÇÃO
ATUALIZAÇÃO 
Totalmente em background.
ATUALIZAÇÃO 
Totalmente em background. 
Não incomoda o usuário.
ATUALIZAÇÃO 
Totalmente em background. 
Não incomoda o usuário. 
Só troca no próximo acesso.
ATUALIZAÇÃO 
Totalmente em background. 
Não incomoda o usuário. 
Só troca no próximo acesso. 
Chrome-like.
detalhes dos 
SERVICE 
WORKERS
controle de escopo
navigator.serviceWorker.register('worker.js');
navigator.serviceWorker.register('worker.js', { 
scope: '/blog/' 
});
HTTPS only
tudo assíncrono
pode ser morto a 
qualquer momento
muito mais poderoso 
muito mais complicado
ainda não existe 
em nenhum browser
FUTURO FANTÁSTICO
BACKGROUND 
SYNC
postaTweet(texto);
try { 
postaTweet(texto); 
} catch (err) { 
}
try { 
postaTweet(texto); 
} catch (err) { 
salvaTweet(texto); 
registration.sync.register('envia-tweet'); 
}
postaTweet(texto).catch(function(){ 
});
postaTweet(texto).catch(function(){ 
salvaTweet(texto).then(function(){ 
}).then(function(){ 
}); 
});
postaTweet(texto).catch(function(){ 
return salvaTweet(texto).then(function(){ 
return navigator.serviceWorker.ready; 
}).then(function(registration){ 
return registration.sync.register('envia-tweet'); 
}); 
});
this.onsync = function (event) { 
if (event.id === 'envia-tweet') { 
} 
};
this.onsync = function (event) { 
if (event.id === 'envia-tweet') { 
event.waitUntil( 
carregaTweet().then(function(texto){ 
postaTweet(texto); 
}) 
); 
} 
};
registration.sync.register('atualiza-inbox', { 
minInterval: 60 * 60 * 1000 
});
PUSH 
NOTIFICATION
registration.pushRegistrationManager.register()
registration.pushRegistrationManager.register() 
.then(function(detalhes) { 
});
registration.pushRegistrationManager.register() 
.then(function(detalhes) { 
return avisaServidor(detalhes); 
});
this.onpush = function(event) { 
if (event.message.data == 'nova-mensagem') { 
} 
};
this.onpush = function(event) { 
if (event.message.data == 'nova-mensagem') { 
event.waitUntil( 
atualizaMensagens().then(function(){ 
}) 
); 
} 
};
this.onpush = function(event) { 
if (event.message.data == 'nova-mensagem') { 
event.waitUntil( 
atualizaMensagens().then(function(){ 
new Notification("Chegou mensagem!"); 
}) 
); 
} 
};
this.onnotificationclick = function(event) { 
};
this.onnotificationclick = function(event) { 
new ServiceWorkerClient('/mensagens.html'); 
};
GEOFENCING
ALARMES 
TEMPORAIS
SERVICE 
WORKERS 
hoje, depois do evento
estude Service Workers 
hoje. esse é o futuro.
brinque no Chrome 
Chrome Canary - chrome://flags 
#enable-experimental-web-platform-features
Offline Web com Service Workers - Sérgio Lopes
vote no 
status.modern.ie
use AppCache 
como fallback
offline como 
progressive enhancement 
if ('serviceWorker' in navigator) { 
}
pense offline first
OFFLINE WEB COM 
SERVICE WORKERS
OBRIGADO! 
sergiolopes.org 
@sergio_caelum

Mais conteúdo relacionado

PDF
Otimizações de Performance Web: Desafios do Mundo Mobile
Caelum
 
PDF
Progressive Web Apps
Toninho Sousa
 
PDF
Ionic Reativo com RxJS e ngRx
Loiane Groner
 
PDF
Armazenamentos offline-ap is-para-pwa
Eduardo Matos
 
PDF
Segredos não ditos de PWA - muito além do Web App Manifest
Eduardo Matos
 
PDF
Otimizacao Front-End para WordPress - OlhoSEO 2013
Guga Alves
 
PPTX
Vue.js
Luís Felipe Souza
 
PDF
Guia prático de desenvolvimento front-end para django devs
Davidson Fellipe
 
Otimizações de Performance Web: Desafios do Mundo Mobile
Caelum
 
Progressive Web Apps
Toninho Sousa
 
Ionic Reativo com RxJS e ngRx
Loiane Groner
 
Armazenamentos offline-ap is-para-pwa
Eduardo Matos
 
Segredos não ditos de PWA - muito além do Web App Manifest
Eduardo Matos
 
Otimizacao Front-End para WordPress - OlhoSEO 2013
Guga Alves
 
Guia prático de desenvolvimento front-end para django devs
Davidson Fellipe
 

Mais procurados (20)

PDF
O melhor da monitoração de web performance
Davidson Fellipe
 
PPTX
A evolução do AngularJS
Rodrigo Branas
 
PPTX
Introdução ao AngularJS
Rodrigo Branas
 
PDF
React + Flux (Alt)
Cezar Luiz
 
PPTX
VueJS - Uma alternativa elegante
Jonathan Bijos
 
PDF
Vue.js - o framework progressivo
Vinicius Reis
 
PPS
Jdk
bielgott
 
PDF
Curso AngularJS - Parte 2
Alvaro Viebrantz
 
PDF
Desenvolvendo aplicacoes mobile_com_html_css_
Rodrigo Urubatan
 
PPT
Performance e boas_praticas_de_web
Thiago Verly
 
PDF
ASP.NET MVC
Tiago Sciencia
 
PDF
[Curso Phonegap / Cordova] Aula 01: Introdução ao Phonegap
Loiane Groner
 
PDF
React - Introdução
Jefferson Mariano de Souza
 
ODP
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
Juliano Martins
 
PDF
Mini curso: Ionic Framework
Loiane Groner
 
PDF
Performance - Acelere seu site! Na web tempo é mais que dinheiro.
Gustavo Corrêa Alves
 
PDF
Curso AngularJS - Parte 1
Alvaro Viebrantz
 
PDF
Desenvolvimento Front end (AngularJS e Bootstrap)
Julian Cesar
 
PDF
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
Vinicius Reis
 
PPTX
Master App - Porque menos é mais!
Rodrigo Serradura
 
O melhor da monitoração de web performance
Davidson Fellipe
 
A evolução do AngularJS
Rodrigo Branas
 
Introdução ao AngularJS
Rodrigo Branas
 
React + Flux (Alt)
Cezar Luiz
 
VueJS - Uma alternativa elegante
Jonathan Bijos
 
Vue.js - o framework progressivo
Vinicius Reis
 
Curso AngularJS - Parte 2
Alvaro Viebrantz
 
Desenvolvendo aplicacoes mobile_com_html_css_
Rodrigo Urubatan
 
Performance e boas_praticas_de_web
Thiago Verly
 
ASP.NET MVC
Tiago Sciencia
 
[Curso Phonegap / Cordova] Aula 01: Introdução ao Phonegap
Loiane Groner
 
React - Introdução
Jefferson Mariano de Souza
 
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
Juliano Martins
 
Mini curso: Ionic Framework
Loiane Groner
 
Performance - Acelere seu site! Na web tempo é mais que dinheiro.
Gustavo Corrêa Alves
 
Curso AngularJS - Parte 1
Alvaro Viebrantz
 
Desenvolvimento Front end (AngularJS e Bootstrap)
Julian Cesar
 
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
Vinicius Reis
 
Master App - Porque menos é mais!
Rodrigo Serradura
 
Anúncio

Destaque (16)

PDF
Progressive Web Apps: o melhor da Web appficada
Caelum
 
PDF
Monografia - Mobile Web Apps vs Native Apps
Luiz Oliveira
 
PDF
Service worker - Offline Web
Bruno Oliveira
 
PDF
Boas práticas de API Design
Caio Ribeiro Pereira
 
PPT
Event Driven Architecture &amp; Complex Event Processing
logus2k
 
PDF
A Validation Model of Data Input for Web Services
Rafael Brinhosa
 
PPTX
React Redux
Patrick Santos
 
PDF
Developing event-driven microservices with event sourcing and CQRS (phillyete)
Chris Richardson
 
PDF
Material design para web
Augusto Sandim
 
PPTX
Progressive Web Apps e o futuro do desenvolvimento Web na Plataforma .NET
Andre Baltieri
 
PPTX
ASP .NET CORE, Angular 2, e Typescript com Scaffolding Yeoman | Seminário
Osmar Petry
 
PDF
Microservice Architecture with CQRS and Event Sourcing
Ben Wilcock
 
PDF
Introduction to Nodejs
Gabriele Lana
 
PDF
Mobile First Responsive Web Design
UIEpreviews
 
PDF
Developing event-driven microservices with event sourcing and CQRS (svcc, sv...
Chris Richardson
 
PDF
reveal.js 3.0.0
Hakim El Hattab
 
Progressive Web Apps: o melhor da Web appficada
Caelum
 
Monografia - Mobile Web Apps vs Native Apps
Luiz Oliveira
 
Service worker - Offline Web
Bruno Oliveira
 
Boas práticas de API Design
Caio Ribeiro Pereira
 
Event Driven Architecture &amp; Complex Event Processing
logus2k
 
A Validation Model of Data Input for Web Services
Rafael Brinhosa
 
React Redux
Patrick Santos
 
Developing event-driven microservices with event sourcing and CQRS (phillyete)
Chris Richardson
 
Material design para web
Augusto Sandim
 
Progressive Web Apps e o futuro do desenvolvimento Web na Plataforma .NET
Andre Baltieri
 
ASP .NET CORE, Angular 2, e Typescript com Scaffolding Yeoman | Seminário
Osmar Petry
 
Microservice Architecture with CQRS and Event Sourcing
Ben Wilcock
 
Introduction to Nodejs
Gabriele Lana
 
Mobile First Responsive Web Design
UIEpreviews
 
Developing event-driven microservices with event sourcing and CQRS (svcc, sv...
Chris Richardson
 
reveal.js 3.0.0
Hakim El Hattab
 
Anúncio

Semelhante a Offline Web com Service Workers - Sérgio Lopes (20)

PDF
RubyConfBr 2015 - Rails & Javascript: faça isso direito
Cezinha Anjos
 
PDF
Como Perder Peso (no browser)
Zeno Rocha
 
PDF
Spring MVC Framework
elliando dias
 
PDF
Web Offline
Bruno Catão
 
PDF
Introdução ao framework CakePHP
igorpimentel
 
PDF
Hibernate efetivo (IA-2014 / Disturbing the Mind)
Rafael Ponte
 
PDF
Os 10 maus hábitos dos desenvolvedores JSF
Rafael Ponte
 
PPT
Desempenho web
Shakti Comunicação Digital
 
PDF
Workshop Ruby on Rails dia 2 ruby-pt
Pedro Sousa
 
PDF
DevDay - O elo perdido: sincronizando webapps
Suissa
 
PDF
Web Performance Client Side
Levy Carneiro Jr.
 
PDF
Ruby On Rails Regis
elliando dias
 
PDF
JS Experience 2017 - Armazenamentos offline. APIs para PWA (Progressive Web A...
iMasters
 
PDF
Pense no futuro: PHP com Zend Framework
Flávio Lisboa
 
PDF
Desenvolvendo com Dojo Toolkit
Flávio Lisboa
 
PDF
Utilizando cache com WordPress: tenha o seu website decolando sem sair do lugar
meetupwordpressfln
 
PDF
InterCon 2017 - Segredos não ditos de PWA - muito além do Web App Manifest - ...
iMasters
 
PPTX
Google Analytics Reporting API: Bebendo água direto da fonte
Johann Vivot
 
PDF
JasperReports Tecnicas de geracao_de_relatorios1
Sliedesharessbarbosa
 
PPTX
Edição de conteúdo web usando Javascript de ponta a ponta
Jorge Walendowsky
 
RubyConfBr 2015 - Rails & Javascript: faça isso direito
Cezinha Anjos
 
Como Perder Peso (no browser)
Zeno Rocha
 
Spring MVC Framework
elliando dias
 
Web Offline
Bruno Catão
 
Introdução ao framework CakePHP
igorpimentel
 
Hibernate efetivo (IA-2014 / Disturbing the Mind)
Rafael Ponte
 
Os 10 maus hábitos dos desenvolvedores JSF
Rafael Ponte
 
Workshop Ruby on Rails dia 2 ruby-pt
Pedro Sousa
 
DevDay - O elo perdido: sincronizando webapps
Suissa
 
Web Performance Client Side
Levy Carneiro Jr.
 
Ruby On Rails Regis
elliando dias
 
JS Experience 2017 - Armazenamentos offline. APIs para PWA (Progressive Web A...
iMasters
 
Pense no futuro: PHP com Zend Framework
Flávio Lisboa
 
Desenvolvendo com Dojo Toolkit
Flávio Lisboa
 
Utilizando cache com WordPress: tenha o seu website decolando sem sair do lugar
meetupwordpressfln
 
InterCon 2017 - Segredos não ditos de PWA - muito além do Web App Manifest - ...
iMasters
 
Google Analytics Reporting API: Bebendo água direto da fonte
Johann Vivot
 
JasperReports Tecnicas de geracao_de_relatorios1
Sliedesharessbarbosa
 
Edição de conteúdo web usando Javascript de ponta a ponta
Jorge Walendowsky
 

Mais de Caelum (20)

PDF
Performance Web além do carregamento
Caelum
 
PDF
Desafios de Performance Web - BrazilJS
Caelum
 
PDF
Performance na web: o modelo RAIL e outras novidades
Caelum
 
PDF
Tudo que você precisa saber sobre picture e srcset
Caelum
 
PDF
Como o HTTP/2 vai mudar sua vida
Caelum
 
PPTX
Métricas e a automatização do controle de qualidade
Caelum
 
PDF
HTTP/2, SPDY e Otimizações Web - Front In Maceió 2014 - Sérgio Lopes
Caelum
 
PDF
Design Responsivo - MobCamp 2014
Caelum
 
PDF
Além do responsive design: a mudança de paradigma do design adaptativo e os m...
Caelum
 
PPT
Por trás dos frameworks e além do reflection
Caelum
 
PPT
Introducao a inteligencia artificial na educacao
Caelum
 
PPT
Otimizando o time to market - do zero a produção em poucas iterações
Caelum
 
PDF
All you need to know about JavaScript loading and execution in the browser - ...
Caelum
 
PDF
Wsrest 2013
Caelum
 
PDF
Design Responsivo por uma Web única
Caelum
 
PDF
Os Caminhos de uma Estratégia Mobile
Caelum
 
PDF
Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...
Caelum
 
PDF
[FrontInBH 2012] Por uma web mais rápida: técnicas de otimizações de sites - ...
Caelum
 
KEY
Plataforma java: detalhes da JVM
Caelum
 
KEY
CDI e as ideias pro futuro do VRaptor
Caelum
 
Performance Web além do carregamento
Caelum
 
Desafios de Performance Web - BrazilJS
Caelum
 
Performance na web: o modelo RAIL e outras novidades
Caelum
 
Tudo que você precisa saber sobre picture e srcset
Caelum
 
Como o HTTP/2 vai mudar sua vida
Caelum
 
Métricas e a automatização do controle de qualidade
Caelum
 
HTTP/2, SPDY e Otimizações Web - Front In Maceió 2014 - Sérgio Lopes
Caelum
 
Design Responsivo - MobCamp 2014
Caelum
 
Além do responsive design: a mudança de paradigma do design adaptativo e os m...
Caelum
 
Por trás dos frameworks e além do reflection
Caelum
 
Introducao a inteligencia artificial na educacao
Caelum
 
Otimizando o time to market - do zero a produção em poucas iterações
Caelum
 
All you need to know about JavaScript loading and execution in the browser - ...
Caelum
 
Wsrest 2013
Caelum
 
Design Responsivo por uma Web única
Caelum
 
Os Caminhos de uma Estratégia Mobile
Caelum
 
Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...
Caelum
 
[FrontInBH 2012] Por uma web mais rápida: técnicas de otimizações de sites - ...
Caelum
 
Plataforma java: detalhes da JVM
Caelum
 
CDI e as ideias pro futuro do VRaptor
Caelum
 

Último (7)

PDF
Explorando o Futuro do Corpo: Implantes Neurais e o Biohacking dos Sentidos
cooperliora
 
PPTX
aplicativopenseira.pptx Aplicativo que organiza Pensamentos - Peça Publicitária
StelaNorie1
 
PPTX
Computacao-e-Tecnologias-Digitais-Por-Que-Aprender.pptx
RobertaOliveiradaFon1
 
PPTX
Gestão de Mudanças - Fases do processo de mudança organizacional
Gateware Group
 
PPTX
Gestão de Mudanças - Os maiores desafios da Gestão de Mudanças e Gestão de Pr...
Gateware Group
 
PDF
Certificado em Redes Neurais Artificiais em Python
CaioSilva506151
 
PPTX
Desenvolvimento-de-Produtos-Inovadores.pptx
ssuser1d7565
 
Explorando o Futuro do Corpo: Implantes Neurais e o Biohacking dos Sentidos
cooperliora
 
aplicativopenseira.pptx Aplicativo que organiza Pensamentos - Peça Publicitária
StelaNorie1
 
Computacao-e-Tecnologias-Digitais-Por-Que-Aprender.pptx
RobertaOliveiradaFon1
 
Gestão de Mudanças - Fases do processo de mudança organizacional
Gateware Group
 
Gestão de Mudanças - Os maiores desafios da Gestão de Mudanças e Gestão de Pr...
Gateware Group
 
Certificado em Redes Neurais Artificiais em Python
CaioSilva506151
 
Desenvolvimento-de-Produtos-Inovadores.pptx
ssuser1d7565
 

Offline Web com Service Workers - Sérgio Lopes