SlideShare une entreprise Scribd logo
1  sur  174
Télécharger pour lire hors ligne
NGSW or Workbox?NGSW or Workbox?
Maxim Salnikov
Angular GDE
CreatingCreating
Angular PWAAngular PWA
“ How to create AngularHow to create Angular
Progressive Web App?Progressive Web App?
“ How to create AngularHow to create Angular
Progressive Web App?Progressive Web App?
Using the proper toolsUsing the proper tools
Maxim SalnikovMaxim Salnikov
@webmaxru@webmaxru
Google Developer Expert inGoogle Developer Expert in AngularAngular
AngularAngular OsloOslo // PWA OsloPWA Oslo meetupsmeetups
organizerorganizer
ngVikingsngVikings conference organizerconference organizer
“ Products from the future
UI Engineer at ForgeRock
After all, what is PWA?After all, what is PWA?
After all, what is PWA?After all, what is PWA?
Progressive web apps use modern web APIs along
with traditional progressive enhancement strategy
to create cross-platform web applications.
https://developer.mozilla.org/en-US/Apps/Progressive
After all, what is PWA?After all, what is PWA?
Progressive web apps use modern web APIs along
with traditional progressive enhancement strategy
to create cross-platform web applications.
https://developer.mozilla.org/en-US/Apps/Progressive
These apps workThese apps work everywhereeverywhere and provideand provide
several features that give them the sameseveral features that give them the same
user experience advantagesuser experience advantages as native apps.as native apps.
#YearOfPWA#YearOfPWA
#YearOfPWA#YearOfPWA
Latest updatesLatest updates
Cross-platform?Cross-platform?
Cross-platform?Cross-platform?
BrowserBrowser
Cross-platform?Cross-platform?
BrowserBrowser
MobileMobile
Cross-platform?Cross-platform?
BrowserBrowser
DesktopDesktop
MobileMobile
Cross-platform?Cross-platform?
BrowserBrowser
DesktopDesktop
MobileMobile
Cross-platform?Cross-platform?
BrowserBrowser
DesktopDesktop
MobileMobile
Cross-platform?Cross-platform?
BrowserBrowser
DesktopDesktop
MobileMobile
Cross-platform?Cross-platform?
BrowserBrowser
DesktopDesktop
MobileMobile
Flagged
UX advantages?UX advantages?
UX advantages?UX advantages?
Smart networking + OfflineSmart networking + Offline
UX advantages?UX advantages?
Smart networking + OfflineSmart networking + Offline
Staying notifiedStaying notified
UX advantages?UX advantages?
Smart networking + OfflineSmart networking + Offline
Staying notifiedStaying notified
Other cool thingsOther cool things
UX advantages?UX advantages?
Smart networking + OfflineSmart networking + Offline
Staying notifiedStaying notified
Other cool thingsOther cool things
}}Service Worker
API
UX advantages?UX advantages?
Smart networking + OfflineSmart networking + Offline
Proper app experienceProper app experience
Staying notifiedStaying notified
Other cool thingsOther cool things
}}Service Worker
API
Web App Manifest
❤❤
Create Angular PWACreate Angular PWA
Create Angular PWACreate Angular PWA
Code service workerCode service worker manuallymanually
Create Angular PWACreate Angular PWA
Code service workerCode service worker manuallymanually
Use Angular Service Worker (Use Angular Service Worker (NGSWNGSW))
Create Angular PWACreate Angular PWA
Code service workerCode service worker manuallymanually
Use Angular Service Worker (Use Angular Service Worker (NGSWNGSW))
Go for someGo for some PWA librariesPWA libraries
Create Angular PWACreate Angular PWA
Code service workerCode service worker manuallymanually
Use Angular Service Worker (Use Angular Service Worker (NGSWNGSW))
Go for someGo for some PWA librariesPWA libraries
sw-precachesw-precache
Create Angular PWACreate Angular PWA
Code service workerCode service worker manuallymanually
Use Angular Service Worker (Use Angular Service Worker (NGSWNGSW))
Go for someGo for some PWA librariesPWA libraries
sw-precachesw-precache
++ ==
++ ==<script />
Service Worker 101Service Worker 101
Service Worker 101Service Worker 101
Wait a sec!Wait a sec!
bit.ly/go-pwa-slackbit.ly/go-pwa-slack
1500+ developers1500+ developers
bit.ly/go-pwa-slackbit.ly/go-pwa-slack
1500+ developers1500+ developers
Major browsers/frameworks/libs repsMajor browsers/frameworks/libs reps
bit.ly/go-pwa-slackbit.ly/go-pwa-slack
App shellApp shell
My App
Managing cacheManaging cache
Managing cacheManaging cache
self.addEventListener('install', (event) => {
// Put app's html/js/css to cache
})
Managing cacheManaging cache
self.addEventListener('install', (event) => {
// Put app's html/js/css to cache
})
self.addEventListener('activate', (event) => {
// Wipe previous version of app files from cache
})
In the real worldIn the real world
In the real worldIn the real world
Can't addCan't add opaque responsesopaque responses directlydirectly
In the real worldIn the real world
Can't addCan't add opaque responsesopaque responses directlydirectly
Redirected requestsRedirected requests should be managedshould be managed
In the real worldIn the real world
Can't addCan't add opaque responsesopaque responses directlydirectly
Redirected requestsRedirected requests should be managedshould be managed
Always creating a new version of cache and deletingAlways creating a new version of cache and deleting
the old one isthe old one is not optimalnot optimal
In the real worldIn the real world
Can't addCan't add opaque responsesopaque responses directlydirectly
Redirected requestsRedirected requests should be managedshould be managed
Always creating a new version of cache and deletingAlways creating a new version of cache and deleting
the old one isthe old one is not optimalnot optimal
Control overControl over cache sizecache size is requiredis required
In the real worldIn the real world
Can't addCan't add opaque responsesopaque responses directlydirectly
Redirected requestsRedirected requests should be managedshould be managed
Always creating a new version of cache and deletingAlways creating a new version of cache and deleting
the old one isthe old one is not optimalnot optimal
Control overControl over cache sizecache size is requiredis required
Cache invalidationCache invalidation for runtime caching is complexfor runtime caching is complex
In the real worldIn the real world
Can't addCan't add opaque responsesopaque responses directlydirectly
Redirected requestsRedirected requests should be managedshould be managed
Always creating a new version of cache and deletingAlways creating a new version of cache and deleting
the old one isthe old one is not optimalnot optimal
Control overControl over cache sizecache size is requiredis required
Cache invalidationCache invalidation for runtime caching is complexfor runtime caching is complex
......
Intercepting requestsIntercepting requests
Intercepting requestsIntercepting requests
self.addEventListener('fetch', (event) => {
if (event.request.url.indexOf('/api') != -1) {
event.respondWith(
// Network-First Strategy
)
} else {
event.respondWith(
// Cache-First Strategy
)
}
})
In the real worldIn the real world
In the real worldIn the real world
All kinds ofAll kinds of fallbacksfallbacks needed for the strategiesneeded for the strategies
In the real worldIn the real world
All kinds ofAll kinds of fallbacksfallbacks needed for the strategiesneeded for the strategies
There are more complex strategies likeThere are more complex strategies like Stale-While-Stale-While-
RevalidateRevalidate
In the real worldIn the real world
All kinds ofAll kinds of fallbacksfallbacks needed for the strategiesneeded for the strategies
There are more complex strategies likeThere are more complex strategies like Stale-While-Stale-While-
RevalidateRevalidate
Good to haveGood to have routingrouting
In the real worldIn the real world
All kinds ofAll kinds of fallbacksfallbacks needed for the strategiesneeded for the strategies
There are more complex strategies likeThere are more complex strategies like Stale-While-Stale-While-
RevalidateRevalidate
Good to haveGood to have routingrouting
Good to have the possibility to provide someGood to have the possibility to provide some extraextra
settingssettings for different resource groupsfor different resource groups
In the real worldIn the real world
All kinds ofAll kinds of fallbacksfallbacks needed for the strategiesneeded for the strategies
There are more complex strategies likeThere are more complex strategies like Stale-While-Stale-While-
RevalidateRevalidate
Good to haveGood to have routingrouting
Good to have the possibility to provide someGood to have the possibility to provide some extraextra
settingssettings for different resource groupsfor different resource groups
......
ProsPros
 
ConsCons
 
ProsPros
Great flexibility!Great flexibility!
 
ConsCons
 
ProsPros
Great flexibility!Great flexibility!
 
ConsCons
Great responsibility!Great responsibility!
 
Tools help withTools help with
ImplementingImplementing complexcomplex algorithms algorithms
Tools help withTools help with
ImplementingImplementing complexcomplex algorithms algorithms
AdoptingAdopting best practicesbest practices
Tools help withTools help with
ImplementingImplementing complexcomplex algorithms algorithms
AdoptingAdopting best practicesbest practices
Focusing onFocusing on YOURYOUR task task
Tools help withTools help with
ImplementingImplementing complexcomplex algorithms algorithms
AdoptingAdopting best practicesbest practices
Focusing onFocusing on YOURYOUR task task
Following specificationsFollowing specifications updatesupdates
Tools help withTools help with
ImplementingImplementing complexcomplex algorithms algorithms
AdoptingAdopting best practicesbest practices
Focusing onFocusing on YOURYOUR task task
Following specificationsFollowing specifications updatesupdates
HandlingHandling edge casesedge cases
Tools help withTools help with
Angular Service WorkerAngular Service Worker
Angular Service WorkerAngular Service Worker
NGSWNGSW
Generate a new Angular PWAGenerate a new Angular PWA
"Yesterday""Yesterday"
Generate a new Angular PWAGenerate a new Angular PWA
$ ng new myPWA --service-worker
"Yesterday""Yesterday"
Generate a new Angular PWAGenerate a new Angular PWA
$ ng new myPWA --service-worker
Angular CLI 1.6-1.7 Angular CLI 1.6-1.7 
Angular Service Worker 5Angular Service Worker 5
"Yesterday""Yesterday"
Generate a new Angular PWAGenerate a new Angular PWA
TodayToday
Generate a new Angular PWAGenerate a new Angular PWA
$ ng new myPWA
TodayToday
Generate a new Angular PWAGenerate a new Angular PWA
$ ng new myPWA
TodayToday
$ ng add @angular/pwa
Generate a new Angular PWAGenerate a new Angular PWA
$ ng new myPWA
Angular CLI 6Angular CLI 6
TodayToday
$ ng add @angular/pwa
Generate a new Angular PWAGenerate a new Angular PWA
$ ng new myPWA
Angular CLI 6Angular CLI 6
Angular Service Worker 6Angular Service Worker 6
TodayToday
$ ng add @angular/pwa
Generate a new Angular PWAGenerate a new Angular PWA
$ ng new myPWA
Angular CLI 6Angular CLI 6
Angular Service Worker 6Angular Service Worker 6
Web App ManifestWeb App Manifest
TodayToday
$ ng add @angular/pwa
Generate a new Angular PWAGenerate a new Angular PWA
$ ng new myPWA
Angular CLI 6Angular CLI 6
Angular Service Worker 6Angular Service Worker 6
Web App ManifestWeb App Manifest
@Schematics@Schematics
TodayToday
$ ng add @angular/pwa
Building Angular PWABuilding Angular PWA
Building Angular PWABuilding Angular PWA
$ ng build --prod
Building Angular PWABuilding Angular PWA
$ ng build --prod
ngsw-worker.jsngsw-worker.js
dist/dist/
Building Angular PWABuilding Angular PWA
$ ng build --prod
ngsw-worker.jsngsw-worker.js
ngsw.jsonngsw.json
dist/dist/
safety-worker.jssafety-worker.js
assets/manifest.jsonassets/manifest.json
Checking the statusChecking the status
Checking the statusChecking the status
https://yourwebsite.comhttps://yourwebsite.com/ngsw/state/ngsw/state
Checking the statusChecking the status
https://yourwebsite.comhttps://yourwebsite.com/ngsw/state/ngsw/state
NGSW Debug Info:
Driver state: NORMAL ((nominal))
Latest manifest hash: cd4716ff2d3e24f4292010c929ff429d9eeead73
Last update check: 9s215u
=== Version 34c3fd2361735b1330a23c32880640febd059305 ===
Clients: 7eb10c76-d9ed-493a-be12-93f305394a77
=== Version cd4716ff2d3e24f4292010c929ff429d9eeead73 ===
Clients: ee22d69e-37f1-439d-acd3-4f1f366ec8e1
=== Idle Task Queue ===
Last update tick: 4s602u
Last update run: 9s222u
Task queue:
Registering NGSWRegistering NGSW
Registering NGSWRegistering NGSW
import { ServiceWorkerModule } from '@angular/service-worker';
app.module.tsapp.module.ts
Registering NGSWRegistering NGSW
import { ServiceWorkerModule } from '@angular/service-worker';
import { environment } from '../environments/environment';
app.module.tsapp.module.ts
Registering NGSWRegistering NGSW
import { ServiceWorkerModule } from '@angular/service-worker';
import { environment } from '../environments/environment';
...
@NgModule({
...
imports: [
...
]
})
export class AppModule { }
app.module.tsapp.module.ts
Registering NGSWRegistering NGSW
import { ServiceWorkerModule } from '@angular/service-worker';
import { environment } from '../environments/environment';
...
@NgModule({
...
imports: [
...
]
})
export class AppModule { }
ServiceWorkerModule.register('/ngsw-worker.js',
{ enabled: environment.production }),
app.module.tsapp.module.ts
NGSW configuration fileNGSW configuration file
NGSW configuration fileNGSW configuration file
src/ngsw-config.jsonsrc/ngsw-config.json
{
"index": "/index.html",
"assetGroups": [...],
"dataGroups": [...]
}
App shellApp shell
App shellApp shell
assetGroupsassetGroups
{
"name": "app",
"installMode": "prefetch",
"resources": {...}
}
App shell resourcesApp shell resources
assetGroups / "app" / resourcesassetGroups / "app" / resources
"resources": {
}
App shell resourcesApp shell resources
assetGroups / "app" / resourcesassetGroups / "app" / resources
"resources": {
}
"files": [
"/favicon.ico",
"/index.html"
],
App shell resourcesApp shell resources
assetGroups / "app" / resourcesassetGroups / "app" / resources
"resources": {
}
"versionedFiles": [
"/*.bundle.css",
"/*.bundle.js",
"/*.chunk.js"
"files": [
"/favicon.ico",
"/index.html"
],
App shell / on-demandApp shell / on-demand
App shell / on-demandApp shell / on-demand
assetGroupsassetGroups
{
"name": "assets",
"installMode": "lazy",
"updateMode": "prefetch",
"resources": {...}
}
App shell / on-demandApp shell / on-demand
assetGroups / "assets" / resourcesassetGroups / "assets" / resources
"resources": {
}
App shell / on-demandApp shell / on-demand
assetGroups / "assets" / resourcesassetGroups / "assets" / resources
"resources": {
}
"files": [
"/assets/**"
],
App shell / on-demandApp shell / on-demand
assetGroups / "assets" / resourcesassetGroups / "assets" / resources
"resources": {
}
"files": [
"/assets/**"
],
"urls": [
"https://fonts.googleapis.com/**",
"https://fonts.gstatic.com/**"
]
Runtime cachingRuntime caching
Runtime cachingRuntime caching
dataGroupsdataGroups
{
"name": "api-freshness",
"urls": [
"/api/breakingnews/**"
],
}
Runtime cachingRuntime caching
dataGroupsdataGroups
{
"name": "api-freshness",
"urls": [
"/api/breakingnews/**"
],
}
"cacheConfig": {
"strategy": "freshness",
"maxSize": 10,
"maxAge": "12h",
"timeout": "10s"
}
Runtime cachingRuntime caching
dataGroupsdataGroups
{
"name": "api-performance",
"urls": [
"/api/archive/**"
],
}
Runtime cachingRuntime caching
dataGroupsdataGroups
{
"name": "api-performance",
"urls": [
"/api/archive/**"
],
}
"cacheConfig": {
"strategy": "performance",
"maxSize": 100,
"maxAge": "365d"
}
Support API versioningSupport API versioning
dataGroupsdataGroups
{
"version": 1,
"name": "api-performance",
"urls": [
"/api/**"
],
...
}
Support API versioningSupport API versioning
dataGroupsdataGroups
{
"version": 1,
"name": "api-performance",
"urls": [
"/api/**"
],
...
}
{
"version": 2,
"name": "api-performance",
"urls": [
"/api/**"
],
...
}
App version updatesApp version updates
v1v1
v1v1
ServerServer
BrowserBrowser
App version updatesApp version updates
v1v1 v2v2
v1v1
ServerServer
BrowserBrowser
App version updatesApp version updates
v1v1 v2v2
v1v1v1v1
ServerServer
BrowserBrowser
App version updatesApp version updates
v1v1 v2v2
v1v1v1v1 v2v2
ServerServer
BrowserBrowser
v2v2
App version updatesApp version updates
v1v1 v2v2
v1v1v1v1 v2v2
ServerServer
BrowserBrowser
v2v2
Notify about updatesNotify about updates
Notify about updatesNotify about updates
import { SwUpdate } from '@angular/service-worker';
updates.component.tsupdates.component.ts
Notify about updatesNotify about updates
import { SwUpdate } from '@angular/service-worker';
constructor(private swUpdate: SwUpdate) {}
updates.component.tsupdates.component.ts
Notify about updatesNotify about updates
import { SwUpdate } from '@angular/service-worker';
constructor(private swUpdate: SwUpdate) {}
this.swUpdate.available.subscribe(event => {
let snackBarRef = this.snackBar
.open('Newer version of the app is available', 'Refresh');
snackBarRef.onAction().subscribe(() => {
window.location.reload()
})
})
updates.component.tsupdates.component.ts
Push notificationsPush notifications
Push notificationsPush notifications
import { SwPush } from '@angular/service-worker';
push.component.tspush.component.ts
Push notificationsPush notifications
import { SwPush } from '@angular/service-worker';
constructor(private swPush: SwPush) {}
push.component.tspush.component.ts
Push notificationsPush notifications
import { SwPush } from '@angular/service-worker';
constructor(private swPush: SwPush) {}
subscribeToPush() {
this.swPush.requestSubscription({
serverPublicKey: this.VAPID_PUBLIC_KEY
})
.then(pushSubscription => {
// Pass subscription object to backend
})
}
push.component.tspush.component.ts
Push notifications / sendPush notifications / send
Push notifications / sendPush notifications / send
{
"notification": {
}
}
server-side.js / sendNotification payloadserver-side.js / sendNotification payload
Push notifications / sendPush notifications / send
{
"notification": {
}
}
server-side.js / sendNotification payloadserver-side.js / sendNotification payload
"title": "Very important notification",
"body": "Angular Service Worker is cool!",
"icon": "https://angular.io/assets/logo.png",
"actions": [
{
"action": "gocheck",
"title": "Go and check"
}
],
...
Kill switchKill switch
Kill switchKill switch
1.1. Long wayLong way
ng set apps.0.serviceWorker=false
ng build --prod
...deploy
Kill switchKill switch
1.1. Long wayLong way
2.2. Short wayShort way
ng set apps.0.serviceWorker=false
ng build --prod
...deploy
rm dist/ngsw.json
...deploy
Kill switchKill switch
3.3. Proper wayProper way
cp dist/safety-worker.js dist/ngsw-worker.js
...deploy
Kill switchKill switch
3.3. Proper wayProper way
cp dist/safety-worker.js dist/ngsw-worker.js
...deploy
self.addEventListener('install', e => { self.skipWaiting(); })
self.addEventListener('activate', e => {
e.waitUntil(self.clients.claim());
self.registration.unregister().then(
() => { console.log('Unregistered old service worker');
});
safety-worker.jssafety-worker.js
Main available featuresMain available features
Main available featuresMain available features
App ShellApp Shell
Main available featuresMain available features
App ShellApp Shell Runtime CachingRuntime Caching
Main available featuresMain available features
App ShellApp Shell Runtime CachingRuntime Caching
Push NotificationsPush Notifications
Main available featuresMain available features
App ShellApp Shell Runtime CachingRuntime Caching
Push NotificationsPush Notifications Smart UpdatesSmart Updates
ProsPros ConsCons
 
ProsPros
Smart defaults go outSmart defaults go out
of the boxof the box
ConsCons
 
ProsPros
Smart defaults go outSmart defaults go out
of the boxof the box
Essential features areEssential features are
codelesscodeless
ConsCons
 
ProsPros
Smart defaults go outSmart defaults go out
of the boxof the box
Essential features areEssential features are
codelesscodeless
Doing things inDoing things in
Angular wayAngular way
ConsCons
 
ProsPros
Smart defaults go outSmart defaults go out
of the boxof the box
Essential features areEssential features are
codelesscodeless
Doing things inDoing things in
Angular wayAngular way
ConsCons
Intended to play aIntended to play a
main service worker'smain service worker's
role in your PWArole in your PWA
 
ProsPros
Smart defaults go outSmart defaults go out
of the boxof the box
Essential features areEssential features are
codelesscodeless
Doing things inDoing things in
Angular wayAngular way
ConsCons
Intended to play aIntended to play a
main service worker'smain service worker's
role in your PWArole in your PWA
There is no good wayThere is no good way
to extend theto extend the
functionalityfunctionality
 
++ ==
App shellApp shell
Runtime cachingRuntime caching
Offline GAOffline GA
Replay failed requestsReplay failed requests
Broadcast updatesBroadcast updates
Build integrationsBuild integrations
# Install the Workbox CLI
$ npm install workbox-cli --global
App shellApp shell
Runtime cachingRuntime caching
Offline GAOffline GA
Replay failed requestsReplay failed requests
Broadcast updatesBroadcast updates
Build integrationsBuild integrations
# Install the Workbox CLI
$ npm install workbox-cli --global
# Run the wizard to generate a service worker
$ workbox wizard
App shellApp shell
Runtime cachingRuntime caching
Offline GAOffline GA
Replay failed requestsReplay failed requests
Broadcast updatesBroadcast updates
Build integrationsBuild integrations
Workbox 101Workbox 101
App shellApp shell
module.exports = {
"globDirectory": "dist/",
"globPatterns": [
"**/*.{txt,png,ico,html,js,json,css}"
],
"swDest": "dist/sw.js"
};
workbox-config.jsworkbox-config.js
App shellApp shell
App shellApp shell
module.exports = {
"globDirectory": "dist/ngPwa",
"globPatterns": [
"favicon.ico",
"index.html",
"*.css",
"*.js",
"assets/**/*"
],
"swDest": "dist/ngPwa/sw.js"
};
workbox-config.jsworkbox-config.js
App shellApp shell
Generated service workerGenerated service worker
importScripts("https://storage.googleapis.com/.../workbox-sw.js");
self.__precacheManifest = [
{
"url": "index.html",
"revision": "b3429974cda6f87f84df90b35fc6faa4"
}, ...
].concat(self.__precacheManifest || []);
workbox.precaching.suppressWarnings();
workbox.precaching.precacheAndRoute(self.__precacheManifest, {});
sw.jssw.js
Generated service workerGenerated service worker
RegistrationRegistration
platformBrowserDynamic()
.bootstrapModule(AppModule)
.then(() => {
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('sw-default.js')
}
});
main.tsmain.ts
RegistrationRegistration
Caching and servingCaching and serving
Caching and servingCaching and serving
Caching and servingCaching and serving
Caching and servingCaching and serving
Our own service workerOur own service worker
Our own service workerOur own service worker
$ npm install --save-dev workbox-build
$ workbox copyLibraries libraries/
Our own service workerOur own service worker
"assets": [
{
"glob": "**",
"input": "../libraries/",
"output": "./"
}
...
]
.angular-cli.json.angular-cli.json
$ npm install --save-dev workbox-build
$ workbox copyLibraries libraries/
Our own service workerOur own service worker
Our own service workerOur own service worker
const {injectManifest} = require('workbox-build')
const swSrc = 'src/service-worker.js';
const swDest = 'dist/sw-default.js'
injectManifest({
swSrc, swDest, ...
})
.then(({count, size}) => {
console.log(`Generated SW which will
precache ${count} files,
totaling ${size} bytes.`)
})
workbox-build.jsworkbox-build.js
Our own service workerOur own service worker
Our own service workerOur own service worker
importScripts("workbox-v3.2.0/workbox-sw.js");
workbox.precaching.precacheAndRoute([])
my-serviceworker.jsmy-serviceworker.js
Our own service workerOur own service worker
importScripts("workbox-v3.2.0/workbox-sw.js");
workbox.precaching.precacheAndRoute([])
my-serviceworker.jsmy-serviceworker.js
// Features code
workbox.routing.registerRoute(
/(http[s]?://)?([^/s]+/)timeline/,
workbox.strategies.networkFirst()
)
...
ProsPros
 
ConsCons
ProsPros
Can extend existingCan extend existing
service workerservice worker
 
ConsCons
ProsPros
Can extend existingCan extend existing
service workerservice worker
Feature-richFeature-rich
 
ConsCons
ProsPros
Can extend existingCan extend existing
service workerservice worker
Feature-richFeature-rich
 
ConsCons
Extra build stepExtra build step
neededneeded
Thank you!Thank you!
Questions?Questions?

Contenu connexe

Plus de Maxim Salnikov

How Azure helps to build better business processes and customer experiences w...
How Azure helps to build better business processes and customer experiences w...How Azure helps to build better business processes and customer experiences w...
How Azure helps to build better business processes and customer experiences w...Maxim Salnikov
 
Using the power of Generative AI at scale
Using the power of Generative AI at scaleUsing the power of Generative AI at scale
Using the power of Generative AI at scaleMaxim Salnikov
 
Web Push Notifications done right
Web Push Notifications done rightWeb Push Notifications done right
Web Push Notifications done rightMaxim Salnikov
 
The Status of Angular v13
The Status of Angular v13The Status of Angular v13
The Status of Angular v13Maxim Salnikov
 
Azure cloud for the web frontend developers
Azure cloud for the web frontend developersAzure cloud for the web frontend developers
Azure cloud for the web frontend developersMaxim Salnikov
 
[Russian] Сервис-воркеры: используем накопленные знания для светлого будущего...
[Russian] Сервис-воркеры: используем накопленные знания для светлого будущего...[Russian] Сервис-воркеры: используем накопленные знания для светлого будущего...
[Russian] Сервис-воркеры: используем накопленные знания для светлого будущего...Maxim Salnikov
 
[Russian] Прогрессивные веб-приложения: по-настоящему кросс-платформенный опыт
[Russian] Прогрессивные веб-приложения: по-настоящему кросс-платформенный опыт[Russian] Прогрессивные веб-приложения: по-настоящему кросс-платформенный опыт
[Russian] Прогрессивные веб-приложения: по-настоящему кросс-платформенный опытMaxim Salnikov
 
Securing Connected Cars Requires Digital Identity
Securing Connected Cars Requires Digital IdentitySecuring Connected Cars Requires Digital Identity
Securing Connected Cars Requires Digital IdentityMaxim Salnikov
 
How to Make Your IoT Devices Secure, Act Autonomously & Trusted Subjects
How to Make Your IoT Devices Secure, Act Autonomously & Trusted SubjectsHow to Make Your IoT Devices Secure, Act Autonomously & Trusted Subjects
How to Make Your IoT Devices Secure, Act Autonomously & Trusted SubjectsMaxim Salnikov
 

Plus de Maxim Salnikov (9)

How Azure helps to build better business processes and customer experiences w...
How Azure helps to build better business processes and customer experiences w...How Azure helps to build better business processes and customer experiences w...
How Azure helps to build better business processes and customer experiences w...
 
Using the power of Generative AI at scale
Using the power of Generative AI at scaleUsing the power of Generative AI at scale
Using the power of Generative AI at scale
 
Web Push Notifications done right
Web Push Notifications done rightWeb Push Notifications done right
Web Push Notifications done right
 
The Status of Angular v13
The Status of Angular v13The Status of Angular v13
The Status of Angular v13
 
Azure cloud for the web frontend developers
Azure cloud for the web frontend developersAzure cloud for the web frontend developers
Azure cloud for the web frontend developers
 
[Russian] Сервис-воркеры: используем накопленные знания для светлого будущего...
[Russian] Сервис-воркеры: используем накопленные знания для светлого будущего...[Russian] Сервис-воркеры: используем накопленные знания для светлого будущего...
[Russian] Сервис-воркеры: используем накопленные знания для светлого будущего...
 
[Russian] Прогрессивные веб-приложения: по-настоящему кросс-платформенный опыт
[Russian] Прогрессивные веб-приложения: по-настоящему кросс-платформенный опыт[Russian] Прогрессивные веб-приложения: по-настоящему кросс-платформенный опыт
[Russian] Прогрессивные веб-приложения: по-настоящему кросс-платформенный опыт
 
Securing Connected Cars Requires Digital Identity
Securing Connected Cars Requires Digital IdentitySecuring Connected Cars Requires Digital Identity
Securing Connected Cars Requires Digital Identity
 
How to Make Your IoT Devices Secure, Act Autonomously & Trusted Subjects
How to Make Your IoT Devices Secure, Act Autonomously & Trusted SubjectsHow to Make Your IoT Devices Secure, Act Autonomously & Trusted Subjects
How to Make Your IoT Devices Secure, Act Autonomously & Trusted Subjects
 

Dernier

%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...masabamasaba
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfonteinmasabamasaba
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...masabamasaba
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrandmasabamasaba
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension AidPhilip Schwarz
 
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburgmasabamasaba
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024VictoriaMetrics
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisamasabamasaba
 
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyviewmasabamasaba
 
WSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2
 
WSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaSWSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaSWSO2
 
WSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security ProgramWSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security ProgramWSO2
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...Shane Coughlan
 
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...WSO2
 
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open SourceWSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open SourceWSO2
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...masabamasaba
 
Artyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptxArtyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptxAnnaArtyushina1
 
tonesoftg
tonesoftgtonesoftg
tonesoftglanshi9
 

Dernier (20)

%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
 
WSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go Platformless
 
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
 
WSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaSWSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaS
 
WSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security ProgramWSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security Program
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
 
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
 
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open SourceWSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
 
Artyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptxArtyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptx
 
tonesoftg
tonesoftgtonesoftg
tonesoftg
 

Angular Progressive Web App: NGSW vs Workbox