SlideShare uma empresa Scribd logo
1 de 66
Baixar para ler offline
Progressive Web
Apps
What, why and how
rizafahmi.com
Progressive Web
Apps
What is
We already Did it!
Believe it or not
Responsive, mobile first layout Cache, Localstorage, etc.
HTML5 is a new hotness
2009
HTML5
HTML5
2009 2012
Facebook
Hybrid App
HTML5 is a new hotness
HTML5 is a new Notness
HTML5 is a new Notness
"The biggest mistake we made as a
company was be!ng too much on HTML5
as opposed to na"ve.”
This guy
From Facebook
Native Apps Rules
HTML5
20122009
Facebook
Hybrid App
Mobile apps rules!
Native
Advantages
✓ Great performance
✓ Smooth anima!ons & interac!ons
✓ Instant loading & offline support
✓ Easy access through home screen
x Distribu=on problems
x Upda=ng is a pain
x Extra care with low memory phone
x Applica=on size
Native
disadvantages
Web StrikeS Back!
HTML5
20122009
Facebook
Hybrid App
Mobile apps rules!
2016
Web strikes back
Best of Both Worlds
Progressive Web Apps
What Progressive Web Apps Is
Engaging
App-like Linkable
Reliable Fast
Secure
Case Studies
63% 

users on 2G
70% 

increase on conversion
Case Studies
75% 

increase in Tweet Sent
65% 

increase in pages per session
20% 

decrease in bounce rate
Case Studies
104% 

higher conversion rate
2x

page visit
74% 
increase "me spent
Tech BehindProgressive Web Apps
Service Woker App Manifest
How ToProgressive Web Apps
Our Project✓ Single page app for local meetup videos
✓ Offline support via browser caches
✓ Modern, ES6 JavaScript syntax, no framework
✓ Mul"pla$orm, Android and iOS
✓ Na"ve app look & feel
✓ Fullscreen app
✓ Splash screen
✓ Home screen icon
Engineers.id
Our Plan✓ Design App Shell
✓ Ge!ng The Data from API
✓ Using Service Worker:
✓ Caching App Shell
✓ Caching Data
Engineers.id
✓ Na"ve-like apps:
✓ Standalone app
✓ Adding App Icons
✓ Adding Splas Screen
✓ Deploy and securing our
app
Tools
Chrome DevTools - Device Mode
✓Simulate device web experiences
✓Responsive breakpoint visualiza"on
✓First meaningful paint, metrics, etc
✓Service worker, manifest, etc
Tools
iOS Simulator
✓localhost is your machine
✓Cri"cal for tes"ng apple-specific features
✓Connect to desktop’s safari for debugging
Tools
Android Emulator
✓10.0.2.2 is your machine
✓Connect to desktop’s chrome for debugging
Tools
Lighthouse
✓Chrome extension or CLI
✓Checklist for our progressive enhancements
✓Performance sugges"ons
Designing The App Shell
Content
Applica"on Shell
Step 1
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="x-ua-compatible" content="ie-edge">
<meta name="description" content="Best video resources for learn programming">
<link rel="stylesheet" href=“styles/main.css" type="text/css" media="screen"
charset="utf-8">
<link rel="stylesheet" href="styles/spinner.css" type="text/css" media="screen"
charset="utf-8">
<title>Engieers.id
</title>

</head>
<body>
<nav>
<div class="left">
<a href="/">
<h1>Engineers.id
</h1>

</a>

</div>
<div class="right">
<button onclick="location.reload()" class="btn card__btn">Refresh
</button>

</div>

</nav>
<div class=“spinner”>

...
</div>
<ul class="cards">

</ul>
<script id="card" type="text/template">
<li class="cards__item">

</li>

</script>

</body>
Test it out!
Get The Data
Step 2

// scripts/app.js
const url = 'https:
//engineers-id-backend-
ybbwzovhnl.now.sh/api/videos'
fetch(url)
.then(response 
=> response.json())
.then(json 
=> {
appendData(json)
})
Test it out!
fetch Polyfill



<!-- index.html 

-->
<html>
<head>

...
</head>
<body>



<!-- 

... 

-->
<script src="scripts/vendors/fetch.js">
</script>
<script src="scripts/app.js">
</script>

</body>

</html>
Test it out!
Zoom it out!
Naviga"on begins

(17ms)
First conten$ul paint
(600ms)
First meaningful paint
(1.58s)
Time to interac"ve
(1.8s)
Service Worker
Not really a new
technology
Parallel, not just
concurrent
Independent script
Sends message to
origin
Register Service Worker
Step 3

// scripts/app.js
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('./service-
worker.js').then(function () {
console.log('Service Worker Registered')
})
}
Test it out!
Test it out!
Cache The App Shell
Step 4

// service-worker.js
var cacheName = ‘engineers-id’
var filesToCache = [
'/',
'/index.html',
'/scripts/app.js',
‘/styles/main.css',
'/styles/spinner.css',
‘/images/logo.svg',

// 

...
]
self.addEventListener('install', function (e) {
e.waitUntil(
caches.open(cacheName).then(function (cache) {
return cache.addAll(filesToCache)
})
)
})
Cache The App Shell
Step 4
Wait, How Service Worker actually work?!
Service worker
Installing Ac"vated
Error
Idle Push
Fetch
Terminated
Web page
Caching
App Shell
Cache The Content
Step 5
Caching Strategy - Cache Only

//service-worker.js
self.addEventListener('fetch', function (event) {

// If a match isn't found in the cache, the response

// will look like a connection error
event.respondWith(caches.match(event.request))
})
Caching Strategy - Network Only
self.addEventListener('fetch', function (event) {
event.respondWith(fetch(event.request))

// or simply don't call event.respondWith, which

// will result in default browser behaviour
})
Caching Strategy - Cache, failing back to network

//service-worker.js
self.addEventListener('fetch', function (event) {
event.respondWith(
caches.match(event.request).then(function (response) {
return response 
|| fetch(event.request)
})
)
})
Caching Strategy - Cache, NetworK Race

// service-worker.js
function promiseAny (promises) {
return new Promise((resolve, reject) 
=> {
promises = promises.map(p 
=> Promise.resolve(p))
promises.forEach(p 
=> p.then(resolve))
promises
.reduce((a, b) 
=> a.catch(() 
=> b))
.catch(() 
=> reject(Error('All failed')))
})
}
self.addEventListener('fetch', function (event) {
event.respondWith(
promiseAny([caches.match(event.request), fetch(event.request)])
)
})
Caching Strategy - Cache Then Network

// service-worker.js
self.addEventListener('fetch', function (event) {
event.respondWith(
caches.open('mysite-dynamic').then(function (cache) {
return fetch(event.request).then(function (response) {
cache.put(event.request, response.clone())
return response
})
})
)
})
Caching Strategy - Network Falling Back To Cache
self.addEventListener('fetch', function (event) {
event.respondWith(
fetch(event.request).catch(function () {
return caches.match(event.request)
})
)
})
Cache The Content
Step 5

// service-worker.js
self.addEventListener('fetch', e 
=> {
e.respondWith(
caches.open(dataCacheName).then(cache 
=> {
return fetch(e.request)
.then(networkResponse 
=> {
cache.put(e.request, networkResponse.clone())
return networkResponse
})
.catch(() 
=> {
return caches.match(e.request)
})
})
)
})
When Our Users Going Rogue...
Recap
App Manifest
App Manifest
// manifest.json
{
"name": "Engineers.id",
"short_name": "eng.id",
"lang": "en-US",
"start_url": "/index.html",
"display": "standalone",
"theme_color": "#fff",
"icons": [
{
"src": "images/icons/icon-128x128.png",
"sizes": "128x128",
"type": "image/png"
},


...
],
"background_color": “#fff”,
“orientation”: “portrait”
}
App Manifest - Display Mode
‘fullscreen’
‘standalone’
‘minimal-ui’
‘browser’
App Manifest - Icons
144px by 144px
128px by 128px
192px by 192px
256px by 256px
512px by 512px
App Manifest - Home Screen Icons
48 dp icons for
home screen and task switcher
144px by 144px
192px by 192px
48px by 48px
96px by96px
App Manifest - Splash Screen Icons
128 dp icons for
splash screen
128px by 128px
256px by 256px
512px by 512px
{
"name": "Engineers.id",
"short_name": "eng.id",
"lang": "en-US",
"start_url": "/index.html",
"display": "standalone",
"theme_color": "#fff",
"icons": 
[],
"background_color": “#fff”,
“orientation”: “portrait”
}
App Manifest



<!-- index.html 

-->
<link rel="manifest" href="manifest.json">
Install Banners
{
"name": "Engineers.id",
"short_name": "eng.id",
"lang": "en-US",
"start_url": "/index.html",
"display": "standalone",
"theme_color": "#fff",
"icons": [


...
{
"src": "images/icons/icon-144x144.png",
"sizes": "144x144",
"type": "image/png"
},
],
"background_color": “#fff”,
“orientation”: “portrait”
}
Test It Out!
61
Test It Out!
62
One last thing: Deploy h%ps://zeit.co/now
Recap!
More.. More..
PaymentPush No"fica"on Connect to Hardware
THOUGHTS??!
facebook.com/rizafahmi
twi%er.com/rizafahmi22 linkedin.com/in/rizafahmi
github.com/rizafahmi
slideshare.com/rizafahmi
hack"v8.comrizafahmi.com

Mais conteúdo relacionado

Mais procurados

Architecture & Workflow of Modern Web Apps
Architecture & Workflow of Modern Web AppsArchitecture & Workflow of Modern Web Apps
Architecture & Workflow of Modern Web Apps
Rasheed Waraich
 
Java script202
Java script202Java script202
Java script202
Wasiq Zia
 
W3C Web Performance - A detailed overview
W3C Web Performance - A detailed overviewW3C Web Performance - A detailed overview
W3C Web Performance - A detailed overview
Alois Reitbauer
 

Mais procurados (20)

Blazor Full-Stack
Blazor Full-StackBlazor Full-Stack
Blazor Full-Stack
 
Architecture & Workflow of Modern Web Apps
Architecture & Workflow of Modern Web AppsArchitecture & Workflow of Modern Web Apps
Architecture & Workflow of Modern Web Apps
 
Blazor - An Introduction
Blazor - An IntroductionBlazor - An Introduction
Blazor - An Introduction
 
Jaggery Introductory Webinar
Jaggery Introductory WebinarJaggery Introductory Webinar
Jaggery Introductory Webinar
 
Visual resume
Visual resumeVisual resume
Visual resume
 
Unobtrusive js
Unobtrusive jsUnobtrusive js
Unobtrusive js
 
Single page application
Single page applicationSingle page application
Single page application
 
Java script202
Java script202Java script202
Java script202
 
Blazor
BlazorBlazor
Blazor
 
Interoperability of components built with different frameworks
Interoperability of components built with different frameworksInteroperability of components built with different frameworks
Interoperability of components built with different frameworks
 
Intro to Node.js
Intro to Node.jsIntro to Node.js
Intro to Node.js
 
Edge 2016 what slows you down - your network or your device
Edge 2016 what slows you down - your network or your deviceEdge 2016 what slows you down - your network or your device
Edge 2016 what slows you down - your network or your device
 
Serverless computing con Azure Functions
Serverless computing con Azure FunctionsServerless computing con Azure Functions
Serverless computing con Azure Functions
 
Isomorphic javascript - Uppsala.js #8
Isomorphic javascript - Uppsala.js #8Isomorphic javascript - Uppsala.js #8
Isomorphic javascript - Uppsala.js #8
 
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)
 
AngularJS + NancyFx + MongoDB = The best trio for ultimate SPA by Bojan Velja...
AngularJS + NancyFx + MongoDB = The best trio for ultimate SPA by Bojan Velja...AngularJS + NancyFx + MongoDB = The best trio for ultimate SPA by Bojan Velja...
AngularJS + NancyFx + MongoDB = The best trio for ultimate SPA by Bojan Velja...
 
W3C Web Performance - A detailed overview
W3C Web Performance - A detailed overviewW3C Web Performance - A detailed overview
W3C Web Performance - A detailed overview
 
WordPress on the Jamstack by rtCamper Muhammad Muhsin @ WordPress Colombo Meetup
WordPress on the Jamstack by rtCamper Muhammad Muhsin @ WordPress Colombo MeetupWordPress on the Jamstack by rtCamper Muhammad Muhsin @ WordPress Colombo Meetup
WordPress on the Jamstack by rtCamper Muhammad Muhsin @ WordPress Colombo Meetup
 
How i acheived a pretty good google page speed insights score
How i acheived a pretty good google page speed insights scoreHow i acheived a pretty good google page speed insights score
How i acheived a pretty good google page speed insights score
 
Demand driven applications with om.next and react native
Demand driven applications with om.next and react nativeDemand driven applications with om.next and react native
Demand driven applications with om.next and react native
 

Semelhante a Progressive Web Apps. What, why and how

Web app and more
Web app and moreWeb app and more
Web app and more
faming su
 
App engine devfest_mexico_10
App engine devfest_mexico_10App engine devfest_mexico_10
App engine devfest_mexico_10
Chris Schalk
 
[convergese] Adaptive Images in Responsive Web Design
[convergese] Adaptive Images in Responsive Web Design[convergese] Adaptive Images in Responsive Web Design
[convergese] Adaptive Images in Responsive Web Design
Christopher Schmitt
 
Usability in the GeoWeb
Usability in the GeoWebUsability in the GeoWeb
Usability in the GeoWeb
Dave Bouwman
 

Semelhante a Progressive Web Apps. What, why and how (20)

An Introduction to Web Components
An Introduction to Web ComponentsAn Introduction to Web Components
An Introduction to Web Components
 
Web Apps and more
Web Apps and moreWeb Apps and more
Web Apps and more
 
Web app and more
Web app and moreWeb app and more
Web app and more
 
Dave Orchard - Offline Web Apps with HTML5
Dave Orchard - Offline Web Apps with HTML5Dave Orchard - Offline Web Apps with HTML5
Dave Orchard - Offline Web Apps with HTML5
 
HTML5 on Mobile
HTML5 on MobileHTML5 on Mobile
HTML5 on Mobile
 
Web Development for UX Designers
Web Development for UX DesignersWeb Development for UX Designers
Web Development for UX Designers
 
Mobile Apps with PhoneGap and jQuery Mobile
Mobile Apps with PhoneGap and jQuery MobileMobile Apps with PhoneGap and jQuery Mobile
Mobile Apps with PhoneGap and jQuery Mobile
 
App engine devfest_mexico_10
App engine devfest_mexico_10App engine devfest_mexico_10
App engine devfest_mexico_10
 
Everything is Awesome - Cutting the Corners off the Web
Everything is Awesome - Cutting the Corners off the WebEverything is Awesome - Cutting the Corners off the Web
Everything is Awesome - Cutting the Corners off the Web
 
Ruby on Rails Performance Tuning. Make it faster, make it better (WindyCityRa...
Ruby on Rails Performance Tuning. Make it faster, make it better (WindyCityRa...Ruby on Rails Performance Tuning. Make it faster, make it better (WindyCityRa...
Ruby on Rails Performance Tuning. Make it faster, make it better (WindyCityRa...
 
Windy cityrails performance_tuning
Windy cityrails performance_tuningWindy cityrails performance_tuning
Windy cityrails performance_tuning
 
IPhone Web Development With Grails from CodeMash 2009
IPhone Web Development With Grails from CodeMash 2009IPhone Web Development With Grails from CodeMash 2009
IPhone Web Development With Grails from CodeMash 2009
 
Introduction to Client Side Dev in SharePoint Workshop
Introduction to Client Side Dev in SharePoint WorkshopIntroduction to Client Side Dev in SharePoint Workshop
Introduction to Client Side Dev in SharePoint Workshop
 
GDD Japan 2009 - Designing OpenSocial Apps For Speed and Scale
GDD Japan 2009 - Designing OpenSocial Apps For Speed and ScaleGDD Japan 2009 - Designing OpenSocial Apps For Speed and Scale
GDD Japan 2009 - Designing OpenSocial Apps For Speed and Scale
 
[convergese] Adaptive Images in Responsive Web Design
[convergese] Adaptive Images in Responsive Web Design[convergese] Adaptive Images in Responsive Web Design
[convergese] Adaptive Images in Responsive Web Design
 
Usability in the GeoWeb
Usability in the GeoWebUsability in the GeoWeb
Usability in the GeoWeb
 
Hybrid application development
Hybrid application developmentHybrid application development
Hybrid application development
 
Web assembly with PWA
Web assembly with PWA Web assembly with PWA
Web assembly with PWA
 
Google Gears
Google GearsGoogle Gears
Google Gears
 
Fake it 'til you make it
Fake it 'til you make itFake it 'til you make it
Fake it 'til you make it
 

Mais de Riza Fahmi

Mais de Riza Fahmi (20)

Membangun Aplikasi Web dengan Elixir dan Phoenix
Membangun Aplikasi Web dengan Elixir dan PhoenixMembangun Aplikasi Web dengan Elixir dan Phoenix
Membangun Aplikasi Web dengan Elixir dan Phoenix
 
Berbagai Pilihan Karir Developer
Berbagai Pilihan Karir DeveloperBerbagai Pilihan Karir Developer
Berbagai Pilihan Karir Developer
 
Web dan Progressive Web Apps di 2020
Web dan Progressive Web Apps di 2020Web dan Progressive Web Apps di 2020
Web dan Progressive Web Apps di 2020
 
Remote Working/Learning
Remote Working/LearningRemote Working/Learning
Remote Working/Learning
 
How to learn programming
How to learn programmingHow to learn programming
How to learn programming
 
Rapid App Development with AWS Amplify
Rapid App Development with AWS AmplifyRapid App Development with AWS Amplify
Rapid App Development with AWS Amplify
 
Menguak Misteri Module Bundler
Menguak Misteri Module BundlerMenguak Misteri Module Bundler
Menguak Misteri Module Bundler
 
Beberapa Web API Menarik
Beberapa Web API MenarikBeberapa Web API Menarik
Beberapa Web API Menarik
 
MVP development from software developer perspective
MVP development from software developer perspectiveMVP development from software developer perspective
MVP development from software developer perspective
 
Ekosistem JavaScript di Indonesia
Ekosistem JavaScript di IndonesiaEkosistem JavaScript di Indonesia
Ekosistem JavaScript di Indonesia
 
Perkenalan ReasonML
Perkenalan ReasonMLPerkenalan ReasonML
Perkenalan ReasonML
 
How I Generate Idea
How I Generate IdeaHow I Generate Idea
How I Generate Idea
 
Strategi Presentasi Untuk Developer Workshop Slide
Strategi Presentasi Untuk Developer Workshop SlideStrategi Presentasi Untuk Developer Workshop Slide
Strategi Presentasi Untuk Developer Workshop Slide
 
Lesson Learned from Prolific Developers
Lesson Learned from Prolific DevelopersLesson Learned from Prolific Developers
Lesson Learned from Prolific Developers
 
Clean Code JavaScript
Clean Code JavaScriptClean Code JavaScript
Clean Code JavaScript
 
The Future of AI
The Future of AIThe Future of AI
The Future of AI
 
Chrome Dev Summit 2018 - Personal Take Aways
Chrome Dev Summit 2018 - Personal Take AwaysChrome Dev Summit 2018 - Personal Take Aways
Chrome Dev Summit 2018 - Personal Take Aways
 
Essentials and Impactful Features of ES6
Essentials and Impactful Features of ES6Essentials and Impactful Features of ES6
Essentials and Impactful Features of ES6
 
Modern Static Site with GatsbyJS
Modern Static Site with GatsbyJSModern Static Site with GatsbyJS
Modern Static Site with GatsbyJS
 
Introduction to ReasonML
Introduction to ReasonMLIntroduction to ReasonML
Introduction to ReasonML
 

Último

Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
 

Último (20)

Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 

Progressive Web Apps. What, why and how

  • 1. Progressive Web Apps What, why and how rizafahmi.com
  • 3. We already Did it! Believe it or not Responsive, mobile first layout Cache, Localstorage, etc.
  • 4.
  • 5. HTML5 is a new hotness 2009 HTML5
  • 7. HTML5 is a new Notness
  • 8. HTML5 is a new Notness "The biggest mistake we made as a company was be!ng too much on HTML5 as opposed to na"ve.” This guy From Facebook
  • 10. Native Advantages ✓ Great performance ✓ Smooth anima!ons & interac!ons ✓ Instant loading & offline support ✓ Easy access through home screen
  • 11. x Distribu=on problems x Upda=ng is a pain x Extra care with low memory phone x Applica=on size Native disadvantages
  • 12. Web StrikeS Back! HTML5 20122009 Facebook Hybrid App Mobile apps rules! 2016 Web strikes back
  • 13. Best of Both Worlds Progressive Web Apps
  • 14. What Progressive Web Apps Is Engaging App-like Linkable Reliable Fast Secure
  • 15. Case Studies 63% 
 users on 2G 70% 
 increase on conversion
  • 16. Case Studies 75% 
 increase in Tweet Sent 65% 
 increase in pages per session 20% 
 decrease in bounce rate
  • 17. Case Studies 104% 
 higher conversion rate 2x
 page visit 74% 
increase "me spent
  • 19. Service Woker App Manifest
  • 21. Our Project✓ Single page app for local meetup videos ✓ Offline support via browser caches ✓ Modern, ES6 JavaScript syntax, no framework ✓ Mul"pla$orm, Android and iOS ✓ Na"ve app look & feel ✓ Fullscreen app ✓ Splash screen ✓ Home screen icon Engineers.id
  • 22. Our Plan✓ Design App Shell ✓ Ge!ng The Data from API ✓ Using Service Worker: ✓ Caching App Shell ✓ Caching Data Engineers.id ✓ Na"ve-like apps: ✓ Standalone app ✓ Adding App Icons ✓ Adding Splas Screen ✓ Deploy and securing our app
  • 23. Tools Chrome DevTools - Device Mode ✓Simulate device web experiences ✓Responsive breakpoint visualiza"on ✓First meaningful paint, metrics, etc ✓Service worker, manifest, etc
  • 24. Tools iOS Simulator ✓localhost is your machine ✓Cri"cal for tes"ng apple-specific features ✓Connect to desktop’s safari for debugging
  • 25. Tools Android Emulator ✓10.0.2.2 is your machine ✓Connect to desktop’s chrome for debugging
  • 26. Tools Lighthouse ✓Chrome extension or CLI ✓Checklist for our progressive enhancements ✓Performance sugges"ons
  • 27. Designing The App Shell Content Applica"on Shell Step 1
  • 28. <!DOCTYPE html> <html> <head> <meta charset=utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta http-equiv="x-ua-compatible" content="ie-edge"> <meta name="description" content="Best video resources for learn programming"> <link rel="stylesheet" href=“styles/main.css" type="text/css" media="screen" charset="utf-8"> <link rel="stylesheet" href="styles/spinner.css" type="text/css" media="screen" charset="utf-8"> <title>Engieers.id </title> </head>
  • 29. <body> <nav> <div class="left"> <a href="/"> <h1>Engineers.id </h1> </a> </div> <div class="right"> <button onclick="location.reload()" class="btn card__btn">Refresh </button> </div> </nav> <div class=“spinner”> ... </div> <ul class="cards"> </ul> <script id="card" type="text/template"> <li class="cards__item"> </li> </script> </body>
  • 31. Get The Data Step 2 // scripts/app.js const url = 'https: //engineers-id-backend- ybbwzovhnl.now.sh/api/videos' fetch(url) .then(response => response.json()) .then(json => { appendData(json) })
  • 33. fetch Polyfill <!-- index.html --> <html> <head> ... </head> <body> <!-- ... --> <script src="scripts/vendors/fetch.js"> </script> <script src="scripts/app.js"> </script> </body> </html>
  • 35. Zoom it out! Naviga"on begins
 (17ms) First conten$ul paint (600ms) First meaningful paint (1.58s) Time to interac"ve (1.8s)
  • 36. Service Worker Not really a new technology Parallel, not just concurrent Independent script Sends message to origin
  • 37. Register Service Worker Step 3 // scripts/app.js if ('serviceWorker' in navigator) { navigator.serviceWorker.register('./service- worker.js').then(function () { console.log('Service Worker Registered') }) }
  • 40. Cache The App Shell Step 4 // service-worker.js var cacheName = ‘engineers-id’ var filesToCache = [ '/', '/index.html', '/scripts/app.js', ‘/styles/main.css', '/styles/spinner.css', ‘/images/logo.svg', // ... ] self.addEventListener('install', function (e) { e.waitUntil( caches.open(cacheName).then(function (cache) { return cache.addAll(filesToCache) }) ) })
  • 41. Cache The App Shell Step 4
  • 42. Wait, How Service Worker actually work?! Service worker Installing Ac"vated Error Idle Push Fetch Terminated Web page Caching App Shell
  • 44. Caching Strategy - Cache Only //service-worker.js self.addEventListener('fetch', function (event) { // If a match isn't found in the cache, the response // will look like a connection error event.respondWith(caches.match(event.request)) })
  • 45. Caching Strategy - Network Only self.addEventListener('fetch', function (event) { event.respondWith(fetch(event.request)) // or simply don't call event.respondWith, which // will result in default browser behaviour })
  • 46. Caching Strategy - Cache, failing back to network //service-worker.js self.addEventListener('fetch', function (event) { event.respondWith( caches.match(event.request).then(function (response) { return response || fetch(event.request) }) ) })
  • 47. Caching Strategy - Cache, NetworK Race // service-worker.js function promiseAny (promises) { return new Promise((resolve, reject) => { promises = promises.map(p => Promise.resolve(p)) promises.forEach(p => p.then(resolve)) promises .reduce((a, b) => a.catch(() => b)) .catch(() => reject(Error('All failed'))) }) } self.addEventListener('fetch', function (event) { event.respondWith( promiseAny([caches.match(event.request), fetch(event.request)]) ) })
  • 48. Caching Strategy - Cache Then Network // service-worker.js self.addEventListener('fetch', function (event) { event.respondWith( caches.open('mysite-dynamic').then(function (cache) { return fetch(event.request).then(function (response) { cache.put(event.request, response.clone()) return response }) }) ) })
  • 49. Caching Strategy - Network Falling Back To Cache self.addEventListener('fetch', function (event) { event.respondWith( fetch(event.request).catch(function () { return caches.match(event.request) }) ) })
  • 50. Cache The Content Step 5 // service-worker.js self.addEventListener('fetch', e => { e.respondWith( caches.open(dataCacheName).then(cache => { return fetch(e.request) .then(networkResponse => { cache.put(e.request, networkResponse.clone()) return networkResponse }) .catch(() => { return caches.match(e.request) }) }) ) })
  • 51. When Our Users Going Rogue...
  • 52. Recap
  • 54. App Manifest // manifest.json { "name": "Engineers.id", "short_name": "eng.id", "lang": "en-US", "start_url": "/index.html", "display": "standalone", "theme_color": "#fff", "icons": [ { "src": "images/icons/icon-128x128.png", "sizes": "128x128", "type": "image/png" }, ... ], "background_color": “#fff”, “orientation”: “portrait” }
  • 55. App Manifest - Display Mode ‘fullscreen’ ‘standalone’ ‘minimal-ui’ ‘browser’
  • 56. App Manifest - Icons 144px by 144px 128px by 128px 192px by 192px 256px by 256px 512px by 512px
  • 57. App Manifest - Home Screen Icons 48 dp icons for home screen and task switcher 144px by 144px 192px by 192px 48px by 48px 96px by96px
  • 58. App Manifest - Splash Screen Icons 128 dp icons for splash screen 128px by 128px 256px by 256px 512px by 512px { "name": "Engineers.id", "short_name": "eng.id", "lang": "en-US", "start_url": "/index.html", "display": "standalone", "theme_color": "#fff", "icons": [], "background_color": “#fff”, “orientation”: “portrait” }
  • 59. App Manifest <!-- index.html --> <link rel="manifest" href="manifest.json">
  • 60. Install Banners { "name": "Engineers.id", "short_name": "eng.id", "lang": "en-US", "start_url": "/index.html", "display": "standalone", "theme_color": "#fff", "icons": [ ... { "src": "images/icons/icon-144x144.png", "sizes": "144x144", "type": "image/png" }, ], "background_color": “#fff”, “orientation”: “portrait” }
  • 63. One last thing: Deploy h%ps://zeit.co/now