Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Progressive Web Apps mit Angular: Das Web wird nativ(er)

Progressive Web Apps mit Angular: Das Web wird nativ(er)

Progressive Web Apps (PWA) sind ein heißes und topaktuelles Thema in der Webentwicklung. Dank einer ganzen Reihe von Technologien und Vorgehensweisen aus dem PWA-Umfeld lassen sich Websites und Webanwendungen mit einigen zentralen und relevanten Features ausstatten, die bisher ausschließlich nativen Anwendungen vorbehalten waren: Offlinefähigkeit, Push Notifications, schnelles Startverhalten und mehr. Christian Liebel zeigt Ihnen, wie Sie solche PWAs mit Angular erstellen und somit sanft und sacht die Schlucht zwischen reinen Websites, Web Apps und hybriden/nativen Apps schließen können.

Christian Liebel

October 12, 2018
Tweet

More Decks by Christian Liebel

Other Decks in Programming

Transcript

  1. Progressive Web Apps mit Angular: Das Web wird nativ(er) Angular

    Days 2018 Christian Liebel @christianliebel Consultant
  2. Things NOT to expect - Blueprint for PWA development -

    Extensive one-on-one support Things TO EXPECT - Extensive/up-to-date insights into PWA and Angular’s PWA support - Hands-on labs for you - Latest & greatest software - Lots of fun Das Web wird nativ(er) Progressive Web Apps
  3. Hello, it’s me. Progressive Web Apps mit Angular Das Web

    wird nativ(er) Christian Liebel Follow me: @christianliebel Blog: christianliebel.com Email: christian.liebel @thinktecture.com Cross-Platform & Cloud & Enterprise Blockchain 3
  4. Intro • Motivation • Cordova/Electron • "Uber Pattern" Web App

    Manifest • Add to Home Screen • App Install Banners Service Worker • Lifecycle • App Shell • Caching • Offline-First & Sync Advanced • Push Messages • Tools • Limitations Das Web wird nativ(er) Progressive Web Apps
  5. And guess what? There’s no SDK that you need! You’ve

    got everything you need if you know how to write apps using the most modern web standards to write amazing apps for the iPhone today. — Steve Jobs, June 11, 2007 Das Web wird nativ(er) Progressive Web Apps
  6. Let me just say it: We want native third party

    applications on the iPhone, and we plan to have an SDK in developers’ hands in February. — Steve Jobs, October 17, 2007 Das Web wird nativ(er) Progressive Web Apps
  7. Web Goes Native • No app stores anymore! • Web

    App = App App • Feature parity: Push notifications, offline availability and more for web & native applications • Backwards compatibility: PWAs can also be run on non-PWA browsers, but with reduced feature set Apps Tomorrow… Das Web wird nativ(er) Progressive Web Apps
  8. Progressive Web Apps HTML5, JavaScript, CSS3 Service Worker API Fetch

    API Web Notifications Web Workers Push API Web App Manifest HTTPS PWA Technology Overview Das Web wird nativ(er) Progressive Web Apps
  9. The Power of the Modern Web Web Share API Gamepad

    API Payment Request API Ambient Light Sensor Web Bluetooth API Shape Detection API Web Notifications WebVR WebRTC WebGL Speech Synthesis Web Cryptography API IndexedDB Geolocation Canvas Media Capture and Streams Das Web wird nativ(er) Progressive Web Apps
  10. Flight Arcade • WebGL • Web Audio API • Gamepad

    API The Power of the Modern Web Das Web wird nativ(er) Progressive Web Apps
  11. Device Support Mobile Devices Recent Android devices (4.1+) with recent

    Chrome versions (40+) Apple iOS 11.3+ (Safari 11.1+) PWA Status Quo Browsers Google Chrome Mozilla Firefox Microsoft Edge 17+ Apple Safari 11.1+ Das Web wird nativ(er) Progressive Web Apps
  12. This looks great, but there are still… features - that

    aren’t exposed to the web platform (e.g. Contacts API) - that aren’t available on every platform (e.g. Ambient Light API) - that require more performance (e.g. PDF annotations) devices - that don’t support Progressive Web Apps (old Androids, old iOS versions, etc.) marketing reasons - App Store presence PWA Status Quo Das Web wird nativ(er) Progressive Web Apps
  13. Native App Packaging Real Cross Platform – Get It Today

    Das Web wird nativ(er) Progressive Web Apps
  14. Native App Packaging Native web view (WKWebView/UIWebView, Android Browser/Chrome, Edge)

    + Native plug-ins (Objective-C, Java, C#, …) Node.js runtime + Chromium engine Real Cross Platform – Get It Today Das Web wird nativ(er) Progressive Web Apps
  15. Native App Packaging Result: App packages .ipa, .apk, .appx Result:

    Executables .exe, .app, ELF Real Cross Platform – Get It Today Das Web wird nativ(er) Progressive Web Apps
  16. Progressive Web Apps are not a technology, but a collection

    of features an application must/should support. “Uber Pattern” Das Web wird nativ(er) Progressive Web Apps
  17. Responsive Linkable Discoverable Installable App-like Connectivity Independent Fresh Safe Re-

    engageable Progressive “Uber Pattern” Das Web wird nativ(er) Progressive Web Apps https://developers.google.com/web/fundamentals/getting-started/codelabs/your-first-pwapp/
  18. Service Worker Key Technology Service Worker Internet Website HTML/JS Cache

    fetch Das Web wird nativ(er) Progressive Web Apps
  19. Please stick to the versions noted in README.md and package.json,

    as there might have been updates in the meantime. Important Note Das Web wird nativ(er) Progressive Web Apps
  20. NgServiceWorker • One-size-fits-all Service Worker • Angular CLI supports Service

    Worker generation • Pre-defined functionality, limited customizability Custom Implementation • Individually created Service Worker • Post-process build output of an Angular app • Maximum flexibility, maximum management overhead What about Angular & PWA? Das Web wird nativ(er) Progressive Web Apps
  21. Overview Implements a “one-size-fits-all” service worker Instrumented via ngsw-manifest.json Restricted

    feature set (i.e. no communication between app and SW) • Initial caching of static content • Caching external content • Dynamic Caching • Push notifications @angular/service-worker Das Web wird nativ(er) Progressive Web Apps
  22. ngsw-config.json { "index": "/index.html", "assetGroups": [ { "name": "app", "installMode":

    "prefetch", "resources": { "files": [ "/favicon.ico", "index.html" ], } }, { "name": "assets", "installMode": "lazy", "updateMode": "prefetch", "resources": { "files": [ ], "urls": [ "http://xy.invalid/1.jpg" ], } } ] } @angular/service-worker Das Web wird nativ(er) Progressive Web Apps
  23. CLI Integration Angular CLI supports service worker generation Opt-in, requires

    @angular/service-worker When activated, service worker generation is automatically added to the ng build command (for production builds) @angular/service-worker Das Web wird nativ(er) Progressive Web Apps
  24. New Project ng new project ng add @angular/pwa Angular CLI

    & @angular/service-worker Das Web wird nativ(er) Progressive Web Apps
  25. Responsive Linkable Discoverable Installable App-like Connectivity Independent Fresh Safe Re-

    engageable Progressive PWA Features Das Web wird nativ(er) Progressive Web Apps https://developers.google.com/web/fundamentals/getting-started/codelabs/your-first-pwapp/
  26. One size fits all A single website layout for different

    screen resolutions (typically related to the screen’s width) Definition of trigger points at which the layout changes Mobile first: Create (minimal) mobile views first, then proceed with larger screens, so all devices get the best experience Key technologies: CSS3 Media Queries, CSS Flexible Box Layout, CSS Grid Layout Progressive Web Apps Das Web wird nativ(er) Responsive
  27. Frameworks • Bootstrap 4 • Foundation • AdminLTE • etc.

    Progressive Web Apps Das Web wird nativ(er) Responsive
  28. Responsive Linkable Discoverable Installable App-like Connectivity Independent Fresh Safe Re-

    engageable Progressive PWA Features Das Web wird nativ(er) Progressive Web Apps https://developers.google.com/web/fundamentals/getting-started/codelabs/your-first-pwapp/
  29. Reference Apps and Internal App States Goal: Directly link to

    applications or application states/views (deep link) Key technology for references in the World Wide Web: Hyperlinks Schema for hyperlinks: Uniform Resource Locator (URL) Linkable Das Web wird nativ(er) Progressive Web Apps
  30. Reference Apps and Internal App States Approximation in (mobile) operating

    systems: URI schemes (e.g. fb://profile) For applications on the web, this comes for free In some cases also for application states/views (e.g. for single-page applications) Linkable Das Web wird nativ(er) Progressive Web Apps
  31. Reference Apps and Internal App States Classic (Query String) https://myapp.com/profile.php?id=peter.mueller

    Hash Anchor (e.g. SPA) https://myapp.com/#/profile/peter.mueller HTML5 History (SPA)/Server Rendered https://myapp.com/profile/peter.mueller Linkable Das Web wird nativ(er) Progressive Web Apps
  32. Angular Router In Angular, you can use the @angular/router package

    in combination with HashLocationStrategy or PathLocationStrategy to achieve “linkability” imports: [ RouterModule.forRoot(ROUTES, { useHash: true }) ] Linkable Das Web wird nativ(er) Progressive Web Apps
  33. Responsive Linkable Discoverable Installable App-like Connectivity Independent Fresh Safe Re-

    engageable Progressive PWA Features Das Web wird nativ(er) Progressive Web Apps https://developers.google.com/web/fundamentals/getting-started/codelabs/your-first-pwapp/
  34. Distinguish Web Apps from Websites How to distinguish websites from

    apps? Idea: Add a file with metadata for apps only Advantage: Apps can be identified by search engines, app store providers etc. Web App Manifest <link rel="manifest" href="manifest.json"> Discoverable Das Web wird nativ(er) Progressive Web Apps
  35. manifest.json { "short_name": "PWA Demo", "name": ”Angular Days 2018 PWA

    Demo", "icons": [ { "src": "assets/icon-144x144.png", "sizes": "144x144", "type": "image/png" } ], "start_url": "/index.html", "display": "standalone" } Web App Manifest Title Icons Start URL Display Type Splash Screen Additional Config Description Related Apps Das Web wird nativ(er) Progressive Web Apps
  36. manifest.json { "short_name": "PWA Demo", "name": ”Angular Days 2018 PWA

    Demo", "icons": [ { "src": "assets/icon-144x144.png", "sizes": "144x144", "type": "image/png" } ], "start_url": "/index.html", "display": "standalone" } Web App Manifest Das Web wird nativ(er) Progressive Web Apps
  37. Adjust the Web App Manifest Test it by adding the

    app to your home screen Web App Manifest LAB #2 Das Web wird nativ(er) Progressive Web Apps
  38. Responsive Linkable Discoverable Installable App-like Connectivity Independent Fresh Safe Re-

    engageable Progressive PWA Features Das Web wird nativ(er) Progressive Web Apps https://developers.google.com/web/fundamentals/getting-started/codelabs/your-first-pwapp/
  39. App Install Banners Website suggests installing a related native app

    (e.g. known from iOS, link to App Store) PWA: Web app and installed app are one and the same Showing a banner to pin the website to the homescreen You’ve seen this before: iOS Add to homescreen, IE9 Pinned Websites, Windows 8 Live Tiles etc. Progressive Web Apps Das Web wird nativ(er) Installable
  40. App Install Banners For the web as a part of

    the Web App Install Enhancement Proposal Shows metadata defined in the Web App Manifest file Browser controls when the banner is shown based on certain criteria Event: beforeInstallPrompt Must be prevented/deferred by the application Application can determine if banner was dismissed/confirmed Installable Das Web wird nativ(er) Progressive Web Apps
  41. Prevent/Defer App Install Banners let deferredPrompt; window.addEventListener( 'beforeinstallprompt', e =>

    { e.preventdefault(); deferredPrompt = e; return false; }); btnClick.addEventListener( 'click', () => { if (deferredPrompt) { deferredPrompt.prompt(); } }); Installable Das Web wird nativ(er) Progressive Web Apps
  42. App Install Banners – Criteria for Google Chrome* Web App

    Manifest exists User Engagement Heuristic was met (currently, the user has interacted with the domain for at least 30 seconds) Web App is not installed Has a web app manifest with short_name, name, icons with sizes 192px and 512px, start_url and display_type standalone Served via HTTPS Service Worker responds to fetch events https://developers.google.com/web/fundamentals/app-install-banners/ Progressive Web Apps Das Web wird nativ(er) Installable
  43. Responsive Linkable Discoverable Installable App-like Connectivity Independent Fresh Safe Re-

    engageable Progressive PWA Features Das Web wird nativ(er) Progressive Web Apps https://developers.google.com/web/fundamentals/getting-started/codelabs/your-first-pwapp/
  44. Web Apps that feel natively Native functionality with HTML5 technologies

    • Playing audio and video • Hardware accelerated 2D/3D graphics • Gamepad • Touch input • Local storage • Location-based services • Access to camera • etc. Progressive Web Apps Das Web wird nativ(er) App-like
  45. Single-Page Web Applications Pattern how to develop apps in a

    native style: Single-Page Web Applications (SPA) Views, logic and assets are stored locally (e.g. in browser cache) App navigation doesn’t lead to a complete page reload (server round- trip) SPAs only request server for getting or modifying data via APIs Progressive Web Apps Das Web wird nativ(er) App-like
  46. Single-Page web applications Approach: Mobile First Start with mobile devices

    when designing use cases and user interfaces Extend for devices with larger screens and more precise input methods at a later point of time Progressive Web Apps Das Web wird nativ(er) App-like
  47. SPA architecture Progressive Web Apps Das Web wird nativ(er) App-like

    Server logic Web API Push Service Web API DBs HTML, JS, CSS, Assets Server Browser SPA Client logic View HTML/CSS View HTML/CSS View HTML/CSS HTTPS WebSockets HTTPS HTTPS
  48. App Shell Certain parts of the UI are always visible

    Other parts are dynamic content Idea: Static parts (App Shell) are stored in the cache App Shell works without or bad connectivity Example: Error message if no connection is available Technology of the App Shell doesn’t matter (Angular, AngularJS, React, jQuery, plain JavaScript, …) Progressive Web Apps Das Web wird nativ(er) App-like
  49. Responsive Linkable Discoverable Installable App-like Connectivity Independent Fresh Safe Re-

    engageable Progressive PWA Features Das Web wird nativ(er) Progressive Web Apps https://developers.google.com/web/fundamentals/getting-started/codelabs/your-first-pwapp/
  50. Progressive Web Apps Das Web wird nativ(er) JavaScript & Threading

    http://techdows.com/wp-content/uploads/2016/01/Firefox-unresponsive-JavaScritp-edit-bookmarkOverlay.png
  51. var worker = new Worker('script.js'); Worker snippet is executed in

    an own thread Worker can’t manipulate the parent document’s DOM Communication via thin API (postMessage) Relation: Current tab/window Lifetime: Until tab/window is closed Web Worker Das Web wird nativ(er) Progressive Web Apps
  52. var worker = new SharedWorker('script.js'); Worker snippet is executed in

    an own thread Worker can’t manipulate the parent document’s DOM Communication via thin API (postMessage) Relation: Origin (protocol + hostname + port) Lifetime: Until all tabs/windows of an origin are closed Shared Worker Das Web wird nativ(er) Progressive Web Apps
  53. Worker snippet is executed in an own thread Worker can’t

    manipulate the parent document’s DOM Communication via thin API (postMessage) + Acts as a controller/proxy/interceptor + Performs background tasks Has to be installed before usage Relation: Scope (origin + path) Lifetime: Unrelated to tab/window Progressive Web Apps Das Web wird nativ(er) Service Worker
  54. Progressive Web Apps Das Web wird nativ(er) Service Worker as

    a controller/proxy/interceptor Service Worker Internet Website HTML/JS Cache fetch
  55. Progressive Web Apps Das Web wird nativ(er) Service Worker Lifecycle

    Installing Parsed Error Activated Idle Terminated fetch/ message
  56. var xmlHttp = new XMLHttpRequest(); xmlHttp.open('GET', 'sample.json', true); xmlHttp.onreadystatechange =

    () => { if (xmlHttp.readyState == 4) { alert(xmlHttp.responseText); } }; xmlHttp.send(null); XHR vs. fetch Das Web wird nativ(er) Progressive Web Apps fetch('sample.json') .then(response => { if (response.status === 200) { response.text() .then(data => alert(data)); } });
  57. Offline capability Challenge: Connection strength varies a lot (especially en

    route) Lie-Fi: Connection strength of a public WiFi is weak or even completely offline Goal: App works offline or with a weak connection at least within the possibilities (e.g. OneNote) Hence: Local data storage is needed—synchronization/conflict management required (Web Background Synchronization) Progressive Web Apps Das Web wird nativ(er) Connectivity Independent
  58. Progressive Web Apps Das Web wird nativ(er) Offline capability in

    General System Website HTML/JS Local storage Central adapter Remote storage Server Internet
  59. Progressive Web Apps Das Web wird nativ(er) Offline capability with

    Service Worker System Website HTML/JS Cache Storage Remote storage Server Internet fetch HTTP Service Worker
  60. Progressive Web Apps Das Web wird nativ(er) Cache Then Network

    System Website HTML/JS Cache Storage Remote storage Server Internet 2. fetch HTTP Service Worker 1. lookup
  61. { "index": "/index.html", "assetGroups": [ // … ], "dataGroups": [

    // … ] } Progressive Web Apps Das Web wird nativ(er) Static Caching Name of index document Purged for each new app version, e.g. for static caching Survive app versions, e.g. for dynamic caching
  62. @angular/service-worker allows static caching Cache information has to be added

    to the ngsw-manifest.json Webpack build integration (included in Angular CLI) adds the build output artefacts to the manifest automatically Service Worker already works for production builds! ng build --prod cd dist/myPwa npx lite-server Progressive Web Apps Das Web wird nativ(er) Static Caching LAB #4
  63. { "index": "/index.html", "assetGroups": [ { "name": "app", "installMode": "prefetch",

    "resources": { "files": [] } }, { "name": "assets", "installMode": "lazy", "updateMode": "prefetch", "resources": { "files": [], "urls": [] } } ] } Progressive Web Apps Das Web wird nativ(er) Static Caching Default is prefetch Prefetch: Cache directly Lazy: Cache when requested Specify files or urls
  64. Caching Strategies "dataGroups": [ { "name": "my-api", "urls": ["/api"], "cacheConfig":

    { "strategy": "freshness", "maxSize": 30, "maxAge": "30m", "timeout": "2s" } } ] Progressive Web Apps Das Web wird nativ(er) Dynamic Caching Maximum cache duration freshness: network-first performance: cache-first Only for freshness Maximum amount of cached requests
  65. Responsive Linkable Discoverable Installable App-like Connectivity Independent Fresh Safe Re-

    engageable Progressive PWA Features Das Web wird nativ(er) Progressive Web Apps https://developers.google.com/web/fundamentals/getting-started/codelabs/your-first-pwapp/
  66. Keep your app up-to-date The Service Worker caches a specific

    version of your application. If the user is online, you want to deliver the latest version of your app. When new versions become available, you might want to notify the user to update the application. Progressive Web Apps Das Web wird nativ(er) Fresh
  67. @angular/service-worker Update Process On every page reload, the @angular/service-worker reads

    the ngsw.json file generated by the CLI as a part of the build process. This file contains information about the bundled files and their contents. If this file differs from the previous version, the Service Worker will refresh your app. Hence, it’s sufficient to just reload the application after an update. Progressive Web Apps Das Web wird nativ(er) Fresh
  68. SwUpdate @angular/service-worker offers an SwUpdate service This service provides an

    available observable that fires when there’s an update. As a result, the user can be prompted to reload the website. Progressive Web Apps Das Web wird nativ(er) Fresh
  69. Orthogonal to Service Workers The web platform has different techniques

    to store arbitrary data (e.g. application state) offline: • Web Storage API (Local Storage/Session Storage—synchronous!) • Web SQL (deprecated) • Cookies (inconvenient) • IndexedDB Progressive Web Apps Das Web wird nativ(er) Offline Capability
  70. Responsive Linkable Discoverable Installable App-like Connectivity Independent Fresh Safe Re-

    engageable Progressive PWA Features Das Web wird nativ(er) Progressive Web Apps https://developers.google.com/web/fundamentals/getting-started/codelabs/your-first-pwapp/
  71. PWAs Require HTTPS! Service workers are very powerful • Can

    answer representatively for the server • Runs outside of the tab’s/window’s lifecycle Installation of service workers is only allowed via a secure connection Exception: localhost (for development purposes) PWAs can only be delivered via HTTPS Problem: TLS certificates are required (costs/renewal) Safe Das Web wird nativ(er) Progressive Web Apps
  72. PWAs Require HTTPS! Recurring Costs Free Manual Renewal Required Comodo

    GeoTrust Verisign … StartSSL Automatic Renewal ? Third-Party (Azure, GitHub, CloudFlare) Progressive Web Apps Das Web wird nativ(er) Safe
  73. Free with automatic renewel Initiative of the Linux Foundation Automatic

    domain validation (Class 1) Website/Webservice has to be public available Period of validity: Comparatively short (90 days) Usage of TLS/SSL as easy as possible Plugins are available for IIS, Apache, Microsoft Azure, Plesk, … free! Let’s Encrypt Das Web wird nativ(er) Progressive Web Apps
  74. Responsive Linkable Discoverable Installable App-like Connectivity Independent Fresh Safe Re-

    engageable Progressive PWA Features Das Web wird nativ(er) Progressive Web Apps https://developers.google.com/web/fundamentals/getting-started/codelabs/your-first-pwapp/
  75. Get the user back with notifications Idea: Push the users

    to use the app again Known from social networks or games, etc. Combination of two technologies: • Web Notifications • Push API Progressive Web Apps Das Web wird nativ(er) Re-Engageable
  76. Push services Every browser vendor has its own push service

    Challenge: Every service is used in a different way Ends in several implementations on the server Solution: One protocol that can be used by every push service Web Push Protocol Progressive Web Apps Das Web wird nativ(er) Re-Engageable
  77. Web Push Protocol Every push service talks Web Push Protocol

    Only one server implementation needed To make the push request secure, private and public keys are needed Ready-to-use-packages are available for different servers (e.g. Node, ASP.NET, etc.) Progressive Web Apps Das Web wird nativ(er) Re-Engageable
  78. Sending Push Notifications Progressive Web Apps Das Web wird nativ(er)

    Re-Engageable Push Service Server 4. Send Message to Push Service endpoint 5. Response (success/fail) 1. Register for push 2. Send push information to client 6. Push to client Client(s) 3. Send push endpoint
  79. SwPush @angular/service-worker offers an SwPush service The service provides a

    requestSubscription promise that returns a new push subscription This subscription includes the push service endpoint That endpoint can be used from the server to send push notifications to the client Progressive Web Apps Das Web wird nativ(er) Re-Engageable
  80. Lab Create key pair https://web-push-codelab.glitch.me/ can be used to generate

    key pairs Register for Push swPush.requestSubscription({ serverPublicKey: "public key"}) .then(subscription => console.log(subscription)); Progressive Web Apps Das Web wird nativ(er) Push Notifications LAB #5
  81. Debugging More information on installed service workers can be found

    on • chrome://serviceworker- internals (Google Chrome) • about:serviceworkers (Mozilla Firefox) Progressive Web Apps Das Web wird nativ(er) Service Worker
  82. Responsive Linkable Discoverable Installable App-like Connectivity Independent Fresh Safe Re-

    engageable Progressive PWA Features Das Web wird nativ(er) Progressive Web Apps https://developers.google.com/web/fundamentals/getting-started/codelabs/your-first-pwapp/
  83. • moving forward • happening or developing gradually over a

    period of time • using or interested in new or modern ideas especially in politics and education Source: Merriam-Webster's Learner's Dictionary Progressive Web Apps Das Web wird nativ(er) Progressive \prə-ˈgre-siv\
  84. Progressive Web Apps Das Web wird nativ(er) Service Worker Compatibility

    https://jakearchibald.github.io/isserviceworkerready/
  85. Advance with Progressive Enhancement Idea: Use available interfaces and functions

    of a system Users with modern, feature-rich browsers are getting better experience Apps are available on older browsers but with limited functionality Concept: Browser feature support grows over time—thereby more users can enjoy an increasing number of app features Progressive Web Apps Das Web wird nativ(er) Progressive
  86. Advance with Progressive Enhancement if ('serviceWorker' in navigator) { navigator.serviceWorker.register(…)

    .then(() => { /* … */ }); } In JavaScript: check whether or not an API/feature is available If yes—use it! Progressive Web Apps Das Web wird nativ(er) Progressive
  87. Payment Request API Upcoming payment technology for the web Supported

    by Microsoft Edge 15+, Google Chrome 61+, Safari 11.1+ (iOS 11.3+) https://blogs.windows.com/msedge dev/2016/12/15/payment-request- api-edge/ Monetization Das Web wird nativ(er) Progressive Web Apps
  88. Responsive Linkable Discoverable Installable App-like Connectivity Independent Fresh Safe Re-

    engageable Progressive “Uber Pattern” Das Web wird nativ(er) Progressive Web Apps https://developers.google.com/web/fundamentals/getting-started/codelabs/your-first-pwapp/