added notes for PWA
This commit is contained in:
		
							parent
							
								
									2c9ff796fa
								
							
						
					
					
						commit
						16db35a14a
					
				| 
						 | 
				
			
			@ -12,4 +12,9 @@ This will contain all my notes.
 | 
			
		|||
- Although practicality beats purity.
 | 
			
		||||
- Errors should never pass silently, unless explicitly silenced.
 | 
			
		||||
- Now is better than never. But never is often better than right now.
 | 
			
		||||
- If the implementation is hard to explain, it is bad idea.
 | 
			
		||||
- If the implementation is hard to explain, it is bad idea.
 | 
			
		||||
 | 
			
		||||
## Some notes
 | 
			
		||||
- [Git](git.md)
 | 
			
		||||
- [mongo](mongo.md)
 | 
			
		||||
- [PWA](pwa.md)
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,196 @@
 | 
			
		|||
# PWA (Progressive Web app)
 | 
			
		||||
 | 
			
		||||
## The manifest file
 | 
			
		||||
```
 | 
			
		||||
{
 | 
			
		||||
	"name": "Full app name",
 | 
			
		||||
	"short_name": "app short name",
 | 
			
		||||
	"theme_color": "#",
 | 
			
		||||
	"background_color": "#",
 | 
			
		||||
	"description": "description about app",
 | 
			
		||||
	"dir": "ltr",
 | 
			
		||||
	"display": "standalone",
 | 
			
		||||
	"scope": "/",
 | 
			
		||||
	"start_url": "/",
 | 
			
		||||
	"icons": [
 | 
			
		||||
		{
 | 
			
		||||
			"src": "assets/icons/icon-72x72.png",
 | 
			
		||||
			"sizes": "72x72",
 | 
			
		||||
			"type": "image/png"
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"src": "assets/icons/icon-96x96.png",
 | 
			
		||||
			"sizes": "96x96",
 | 
			
		||||
			"type": "image/png"
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"src": "assets/icons/icon-128x128.png",
 | 
			
		||||
			"sizes": "128x128",
 | 
			
		||||
			"type": "image/png"
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"src": "assets/icons/icon-144x144.png",
 | 
			
		||||
			"sizes": "144x144",
 | 
			
		||||
			"type": "image/png"
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"src": "assets/icons/icon-152x152.png",
 | 
			
		||||
			"sizes": "152x152",
 | 
			
		||||
			"type": "image/png"
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"src": "assets/icons/icon-192x192.png",
 | 
			
		||||
			"sizes": "192x192",
 | 
			
		||||
			"type": "image/png"
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"src": "assets/icons/icon-384x384.png",
 | 
			
		||||
			"sizes": "384x384",
 | 
			
		||||
			"type": "image/png"
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"src": "assets/icons/icon-512x512.png",
 | 
			
		||||
			"sizes": "512x512",
 | 
			
		||||
			"type": "image/png"
 | 
			
		||||
		}
 | 
			
		||||
	]
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## For Apple devices
 | 
			
		||||
```
 | 
			
		||||
  <meta name="Title" content="Title of app" />
 | 
			
		||||
	<meta name="mobile-web-app-capable" content="yes" />
 | 
			
		||||
	<meta name="apple-mobile-web-app-capable" content="yes" />
 | 
			
		||||
	<meta name="application-name" content="name of application" />
 | 
			
		||||
	<meta name="apple-mobile-web-app-status-bar-style" content="#007db2" />
 | 
			
		||||
	<meta name="apple-mobile-web-app-title" content="title of app" />
 | 
			
		||||
	<meta name="msapplication-starturl" content="/" />
 | 
			
		||||
	<meta name="theme-color" content="#1976d2" />
 | 
			
		||||
	<meta
 | 
			
		||||
		name="Description"
 | 
			
		||||
		content="Description of the app"
 | 
			
		||||
	/>
 | 
			
		||||
	<link rel="icon" type="image/x-icon" href="favicon.ico" />
 | 
			
		||||
	<link
 | 
			
		||||
		rel="icon"
 | 
			
		||||
		sizes="96x96"
 | 
			
		||||
		href="assets/icons/icon-96x96.png"
 | 
			
		||||
		type="image/png"
 | 
			
		||||
	/>
 | 
			
		||||
	<link
 | 
			
		||||
		rel="apple-touch-icon"
 | 
			
		||||
		sizes="192x192"
 | 
			
		||||
		href="assets/icons/apple-touch-icon.png"
 | 
			
		||||
	/>		
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Strategy
 | 
			
		||||
```
 | 
			
		||||
{
 | 
			
		||||
	"$schema": "path to schema.json",
 | 
			
		||||
	"index": "/index.html",
 | 
			
		||||
	"assetGroups": [
 | 
			
		||||
		{
 | 
			
		||||
			"name": "app",
 | 
			
		||||
			"installMode": "prefetch",
 | 
			
		||||
			"resources": {
 | 
			
		||||
				"files": [
 | 
			
		||||
					"/favicon.ico",
 | 
			
		||||
					"/index.html",
 | 
			
		||||
					"/manifest.json",
 | 
			
		||||
					"/*.css",
 | 
			
		||||
					"/*.js"
 | 
			
		||||
				],
 | 
			
		||||
				"urls": []
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"name": "assets",
 | 
			
		||||
			"installMode": "lazy",
 | 
			
		||||
			"updateMode": "prefetch",
 | 
			
		||||
			"resources": {
 | 
			
		||||
				"files": [
 | 
			
		||||
					"/assets/**",
 | 
			
		||||
					"/*.(eot|svg|cur|jpg|png|webp|gif|otf|ttf|woff|woff2|ani)"
 | 
			
		||||
				]
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	],
 | 
			
		||||
	"dataGroups": [
 | 
			
		||||
		{
 | 
			
		||||
			"name": "apis",
 | 
			
		||||
			"urls": [
 | 
			
		||||
				"urls to be stored to imporve performance of the app"
 | 
			
		||||
			],
 | 
			
		||||
			"cacheConfig": {
 | 
			
		||||
				"maxSize": 3,
 | 
			
		||||
				"maxAge": "1d",
 | 
			
		||||
				"timeout": "5s",
 | 
			
		||||
				"strategy": "performance"
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"name": "quick-load",
 | 
			
		||||
			"urls": [
 | 
			
		||||
				"urls to be stored to get the latest value"
 | 
			
		||||
			],
 | 
			
		||||
			"cacheConfig": {
 | 
			
		||||
				"maxSize": 2,
 | 
			
		||||
				"maxAge": "5m",
 | 
			
		||||
				"timeout": "1m",
 | 
			
		||||
				"strategy": "performance"
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	]
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Service Worker Registration
 | 
			
		||||
```
 | 
			
		||||
	ServiceWorkerModule.register('path to service worker file', {
 | 
			
		||||
		enabled: <true/false/condition to return truthy>,
 | 
			
		||||
		registrationStrategy: 'registerImmediately',
 | 
			
		||||
	})
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Show app version (for user and debug process)
 | 
			
		||||
```
 | 
			
		||||
import { version } from 'path to package.json';
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Custom installation
 | 
			
		||||
 | 
			
		||||
### Javascript
 | 
			
		||||
```
 | 
			
		||||
	let promptEvent;
 | 
			
		||||
	window.addEventListener('beforeinstallprompt', (event) => {
 | 
			
		||||
		this.promptEvent = event;
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	// On User Click to install
 | 
			
		||||
	this.promptEvent.prompt();
 | 
			
		||||
	this.promptEvent.userChoice.then((choiceResult) => {
 | 
			
		||||
		if (choiceResult.outcome === 'accepted') {
 | 
			
		||||
			this.promptEvent = null;
 | 
			
		||||
		}
 | 
			
		||||
	});
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Force app update
 | 
			
		||||
```
 | 
			
		||||
	if ('serviceWorker' in navigator) {
 | 
			
		||||
		navigator.serviceWorker
 | 
			
		||||
			.getRegistrations()
 | 
			
		||||
			.then((registrations: ServiceWorkerRegistration[]) => {
 | 
			
		||||
				for (const registration of registrations) {
 | 
			
		||||
					registration.update();
 | 
			
		||||
				}
 | 
			
		||||
			});
 | 
			
		||||
	}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Show user if app is online
 | 
			
		||||
```
 | 
			
		||||
	navigator.onLine
 | 
			
		||||
```
 | 
			
		||||
		Loading…
	
		Reference in New Issue