Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Web to PWA!
Search
Gefy Marcos
November 17, 2018
Technology
0
73
Web to PWA!
Como transformar um site em uma PWA nota 100 no lighthouse!
Gefy Marcos
November 17, 2018
Tweet
Share
More Decks by Gefy Marcos
See All by Gefy Marcos
Desbravando a Carreira em Desenvolvimento: Dicas e Estratégias para iniciantes
gefymarcos
0
30
Zod: Levando a validação de dados a um novo nível.
gefymarcos
0
1.5k
ReactJS Starter
gefymarcos
0
38
Clean Code: Boas práticas e design de código
gefymarcos
0
160
React Native por onde começar
gefymarcos
0
150
Other Decks in Technology
See All in Technology
インフラエンジニア必見!Kubernetesを用いたクラウドネイティブ設計ポイント大全
daitak
1
370
生成AIを活用した音声文字起こしシステムの2つの構築パターンについて
miu_crescent
PRO
2
210
We Built for Predictability; The Workloads Didn’t Care
stahnma
0
140
広告の効果検証を題材にした因果推論の精度検証について
zozotech
PRO
0
190
顧客の言葉を、そのまま信じない勇気
yamatai1212
1
360
SREチームをどう作り、どう育てるか ― Findy横断SREのマネジメント
rvirus0817
0
290
レガシー共有バッチ基盤への挑戦 - SREドリブンなリアーキテクチャリングの取り組み
tatsukoni
0
220
AWS Network Firewall Proxyを触ってみた
nagisa53
1
240
Webhook best practices for rock solid and resilient deployments
glaforge
1
290
外部キー制約の知っておいて欲しいこと - RDBMSを正しく使うために必要なこと / FOREIGN KEY Night
soudai
PRO
12
5.5k
コミュニティが変えるキャリアの地平線:コロナ禍新卒入社のエンジニアがAWSコミュニティで見つけた成長の羅針盤
kentosuzuki
0
120
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
3k
Featured
See All Featured
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
7.9k
Producing Creativity
orderedlist
PRO
348
40k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.7k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
0
180
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
YesSQL, Process and Tooling at Scale
rocio
174
15k
エンジニアに許された特別な時間の終わり
watany
106
230k
Reality Check: Gamification 10 Years Later
codingconduct
0
2k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
290
Mobile First: as difficult as doing things right
swwweet
225
10k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
170
Transcript
Web to
None
None
None
Site estático Site dinâmico Ajax Site Responsivo PWA 1991 2005
1997 2012 2015
Quem está usando?
O que é PWA?
"Progressive Web Apps são experiências que combinam o melhor da
web e o melhor dos aplicativos.” Fonte: Developers Google
Pré-requisitos
Progressivo
Responsivo
Independente de conectividade
Semelhante a aplicativos
Atual
Seguro
Descobrível
Reenvolvente
Instalável
None
Linkável
Lighthouse
https, sempre HTTPS 1
O que fazer? • Habilitar HTTPS no servidor, isso é
obrigatório. • Redirecionar o status 301 também para HTTPS.
Como fazer?
responsivo e rápido 2
Como fazer? • Media queries. • Sempre se preocupar com
performance e boas práticas. • Lighthouse.
Como fazer? <meta name="viewport" content="width=device-width, initial-scale=1” > • Sempre definir
corretamente o viewport no browser.
Cor tema do site 3
None
Como fazer? <meta name="theme-color" content="#000000"> • Escolher uma cor e
buscar o código hexadecimal.
Manifesto 4
O que fazer? • Criar o manifest.json. • App Manifesto
ou PWA Builder.
{ "name": "Gefy Marcos", "short_name": "Gefy", "theme_color": "#333333", "background_color": "#000000",
"display": “standalone", "//fullscreen, browser “start_url": "https:"//gefy.com.br/index.html", "orientation": “portrait", "//any, landscape "icons": [{ "src": "/img/logo-512x512.png", "sizes": "512x512", "type": "image/png" }] }
Importante "short_name": "Gefy", • O short_name não pode ter mais
que 12 letras. • Nome que aparece com o ícone no celular.
Importante • O background_color é obrigatório. "background_color": "#000000",
Importante • É obrigatório ao menos um ícone 512x512. •
Icone somente PNG. "icons": [{ "src": "/img/logo-512x512.png", "sizes": "512x512", "type": "image/png" }]
Importante <link rel="manifest" href="/manifest.json"> • Adicionar no head.
Service Worker 5
Fonte: https://caniuse.com/#feat=serviceworkers Suporte
É um script executado em segundo plano pelo navegador.
Executado separado da página web.
Possibilita utilizar push notifications, sincronização em segundo plano, etc…
Capacidade de interceptar e tratar solicitações de rede.
O service worker funciona numa thread separada do browser, ele
não tem acesso ao DOM. Importante
Sempre deve ter o mesmo nome e ficar no mesmo
local para não gerar duplicação. Importante
Lembre-se de deletar o cache antigo quando o site for
atualizado. Importante
Como fazer? • Registrar o service worker no nosso head.
Como fazer? if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/sw.js') .then(function(registration) {
console.log('Registration successful’); }).catch(function(err) { console.log('Registration failed: '); }); }
Ciclo de vida
Install É ativado só uma vez, ao registrar o sw.js.
var filesToAdd = ['/'] self.addEventListener('install', function(event) { event.waitUntil( caches.open('gefy-pwa') .then(function(cache)
{ return cache.addAll(filesToAdd); }) ); });
É ativado uma vez, após o “install”, após o service
worker assumir o controle dos caches. Activate
self.addEventListener('activate', function(event) { var cacheWhitelist = ['gefy-pwa']; event.waitUntil( caches.keys().then(function(cacheNames) {
return Promise.all( cacheNames.map(function(cacheName) { if (cacheWhitelist .indexOf(cacheName) ""=== -1) { return caches.delete(cacheName); } }) ); }) ); });
É ativado toda vez que uma página é requisitada. Fetch
self.addEventListener('fetch', function(event) { event.respondWith( checkResponse(event.request) .catch(function() { return returnFromCache(event.request)} ));
event.waitUntil(addToCache(event.request)); });
var checkResponse = function(request) { return new Promise(function(fulfill, reject) {
fetch(request) .then(function(response) { if(response.status ""!== 404) { fulfill(response) } else { reject() } }, reject) }); };
var returnFromCache = function(request) { return caches.open('gefy-pwa') .then(function (cache) {
return cache.match(request) .then(function (matching) { if(!matching "|| matching.status "== 404) { return cache.match(‘/404.html') } else { return matching } }); }); };
var addToCache = function(request) { return caches.open('gefy-pwa') .then(function (cache) {
return fetch(request) .then(function (response) { return cache.put(request, response); }); }); };
Agora temos nosso primeiro PWA! YES…
• Online first • Offline first Abordagens
self.addEventListener('fetch', function(event) { event.respondWith( returnFromCache(event.request) .catch(function() { return checkResponse(event.request)} ));
event.waitUntil(addToCache(event.request)); });
Testando
• O que é e como funciona um PWA. •
Princípios básicos. • Como testar um PWA. • Cor de tema. • Manifesto. • Service worker. • Cache e redirecionamento. Conclusão
Obrigado! @gefymarcos gefy.com.br/talks