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

Progressive Web-Apps mit Angular: hands-on

Progressive Web-Apps mit Angular: hands-on

Progressive Web Apps (PWA) sind das App-Modell der Zukunft. Das sagt zumindest Google und hat damit nichts Geringeres vor, als App-Stores von Mobilgeräten zu verbannen. Stattdessen lautet der Gedanke: Offlinefähigkeit, Push Notifications und schnelles Startverhalten sollen ins Web kommen. Ein Fingertipp reicht und eine mobile Website wird zur installierten App auf dem Gerät einschließlich Homescreen-Icon. Auf aktuellen Android-Versionen können PWA bereits zum Laufen gebracht werden und auch Microsoft ist neuerdings an Bord.

Christian Liebel von Thinktecture zeigt Ihnen, wie Sie mit Angular und der Angular CLI PWAs entwickeln und somit sanft und sacht die Schlucht zwischen reinen Web-Sites, Web-Apps und hybriden/nativen Apps schließen können. Und Sie können mitmachen: Dazu benötigen Sie mindestens einen Laptop, optional ein halbwegs aktuelles Android-Mobilgerät.

Christian Liebel

October 10, 2017
Tweet

More Decks by Christian Liebel

Other Decks in Programming

Transcript

  1. Christian Liebel Thinktecture AG Microsoft MVP Visual Studio and Development

    Technologies Twitter: @chris_liebel E-Mail: [email protected] https://thinktecture.com https://christianliebel.com Gestatten? Hands-on! Progressive Web Apps mit Angular
  2. Was Sie nicht erwartet 1:1-Anleitung zur Implementierung von Progressive Web

    Apps Zukunftssicheres Tutorial zur Implementierung von PWA mit Angular (da Work in Progress) „Echtes“ Hands-on Was Sie erwartet Grundlegender Überblick und Rundumschlag zum Thema Progressive Web Apps Status Quo der Angular- Unterstützung (Cutting Edge) Eine Progressive Web App, die Sie ausprobieren können Hands-on! Progressive Web Apps mit Angular
  3. Angular CLI 1.4.5 wurde zwischenzeitlich veröffentlicht. Bitte verwenden Sie nach

    Möglichkeit die im README oder der Datei package.json angegebenen Versionen. Important Note Hands-on! Progressive Web Apps mit Angular
  4. Neueste Software! Beispiel mit Angular 4 Installierbar auf dem Homebildschirm

    Offlinefähigkeit für Apps Pushbenachrichtigungen auch dann, wenn die App geschlossen ist liebel.io/pwa-ws Progressive Web Apps mit Angular Hands-on! Intro EX #0
  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, 11.06.2007 Hands-on! Progressive Web Apps mit Angular
  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, 17.10.2007 Hands-on! Progressive Web Apps mit Angular
  7. Das Web wird nativ(er) • Gedanke: App-Stores gehen in Rente

    • Web App = App App • Featureparität: Beide Ansätze können auf Pushbenachrichtigungen, Offlineverfügbarkeit, … zurückgreifen • Angetrieben von Google, auf vielen Android- Versionen schon heute lauffähig • Abwärtskompatibel (Progressive Enhancement) • PWA sind keine Technologie, sondern eine Sammlung von Eigenschaften, die eine Anwendung unterstützen muss/kann Apps morgen… Hands-on! Progressive Web Apps mit Angular
  8. Safe Progressive Responsive Discoverable App-like Fresh Connectivity Independent Re- engageable

    Installable Linkable Progressive Web Apps are… https://developers.google.com/web/fundamentals/getting-started/codelabs/your-first-pwapp/ Hands-on! Progressive Web Apps mit Angular
  9. Progressive Web Apps HTML5, JavaScript, CSS3 Service Worker API Fetch

    API Web Notifications Web Workers Push API Web App Manifest HTTPS Technologien aus dem PWA-Umfeld Hands-on! Progressive Web Apps mit Angular
  10. All the tools and techniques to build high-performance mobile apps

    Dokumentation komplett veraltet Hielt nicht Schritt mit späteren Angular-Updates Stellte ursprünglich Flag „--mobile“ bereit, aber: Dieses Flag gibt es nicht mehr und es wird nicht wieder zurückkehren. Progressive Web Apps mit Angular Hands-on! Angular Mobile Toolkit
  11. var worker = new Worker('script.js'); Als Worker ausgeführtes Snippet läuft

    in eigenem Thread Keine Manipulation des DOM des Elterndokuments Kommunikation über dünne Schnittstelle (postMessage) Bezug: Aktuelles Tab/Fenster Lebensdauer: Solange Tab/Fenster geöffnet Web Worker Hands-on! Progressive Web Apps mit Angular
  12. var worker = new SharedWorker('script.js'); Als Worker ausgeführtes Snippet läuft

    in eigenem Thread Keine Manipulation des DOM des Elterndokuments Kommunikation über dünne Schnittstelle (postMessage) Bezug: Origin (Protokoll + Host + Port) Lebensdauer: Solange ein Tab/Fenster einer Origin offen Shared Worker Hands-on! Progressive Web Apps mit Angular
  13. Als Worker ausgeführtes Snippet läuft in eigenem Thread Keine Manipulation

    des DOM des Elterndokuments Kommunikation über dünne Schnittstelle (postMessage) + agiert als Controller/Proxy/Interceptor + führt Hintergrundaufgaben aus muss vor Verwendung installiert werden Bezug: Scope (Origin + Pfad) Lebensdauer: unabhängig von Tab/Fenster Service Worker Hands-on! Progressive Web Apps mit Angular
  14. var xmlHttp = new XMLHttpRequest(); xmlHttp.open('GET', 'sample.json', true); xmlHttp.onreadystatechange =

    function () { if (xmlHttp.readyState == 4) { alert(xmlHttp.responseText); } }; xmlHttp.send(null); fetch('sample.json') .then(function(response) { if (response.status === 200) { response.text() .then(function (data) { alert(data); }); } }); XHR vs. fetch Hands-on! Progressive Web Apps mit Angular
  15. Übersicht Implementiert einen „one size fits all“ Service Worker Instrumentiert

    via ngsw-manifest.json • Initiales Cachen statischer Inhalte • Routenweiterleitung • Pushbenachrichtigungen • Cachen externer Inhalte • Dynamisches Caching Progressive Web Apps mit Angular Hands-on! @angular/service-worker
  16. CLI Integration Integration für Gulp- und Webpack-Pipelines Angular CLI unterstützt

    die Service-Worker-Generierung ab 1.0.0-rc.2 Opt-in, erfordert @angular/service-worker (derzeit 1.0.0-beta.16) Konfiguration: ng set apps.0.serviceWorker true Sobald aktiviert, automatische Integration in die Befehle ng build/serve (für Produktionsbuild) Erweiterung der ngsw-manifest.json ist möglich Progressive Web Apps mit Angular Hands-on! @angular/service-worker EX #1
  17. Ausblick Angular 5.0.0-rc.0 enthält einen neuen Angular Service Worker (NGSW).

    Die Verwendung weicht in Teilen von der hier dargestellten ab. Progressive Web Apps mit Angular Hands-on! @angular/service-worker
  18. Progressive Web Apps sind… Hands-on! Progressive Web Apps mit Angular

    Safe Progressive Responsive Discoverable App-like Fresh Connectivity Independent Re- engageable Installable Linkable
  19. PWA gibt’s nur mit HTTPS! Service Worker ist sehr mächtig

    • Kann stellvertretend für die eigentliche Website antworten • Läuft außerhalb des Lebenszyklus der eigentlichen Website Daher: Installation eines Service Workers nur über gesicherte Verbindung zulässig (HTTPS) Ausnahme: localhost (zu Entwicklungszwecken) Das heißt auch: Progressive Web Apps können ausschließlich über HTTPS ausgeliefert werden Problem: Erforderliche TLS-Zertifikate (Erneuerung, Kosten) Safe Hands-on! Progressive Web Apps mit Angular
  20. Wiederkehrende Kosten Kostenfrei Manuelle Erneuerung erforderlich Comodo GeoTrust Verisign …

    StartSSL Erneuerung automatisch ? Third-Party (Azure, GitHub, CloudFlare) PWA gibt’s nur mit HTTPS Safe Hands-on! Progressive Web Apps mit Angular
  21. Kostenfrei und mit automatischer Erneuerung Initiative der Linux Foundation Automatische

    Domänenvalidierung (Class 1) Website/Webservice muss öffentlich erreichbar sein Gültigkeitsdauer: Vergleichsweise kurz (90 Tage) Interceptor: Verwendung von SSL so einfach wie möglich • Verwaltet privaten Schlüssel • Verschlüsselung transparent für Entwickler • Automatische Erneuerung bei Ablauf Plugins für IIS, Apache, Microsoft Azure, Plesk, … sind kostenfrei verfügbar Let’s Encrypt Hands-on! Progressive Web Apps mit Angular
  22. Progressive Web Apps sind… Hands-on! Progressive Web Apps mit Angular

    Safe Progressive Responsive Discoverable App-like Fresh Connectivity Independent Re- engageable Installable Linkable
  23. Progressive \prə-ˈgre-siv\ • 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 Hands-on! Progressive Web Apps mit Angular
  24. Voranschreiten mit Progressive Enhancement Idee: Die Schnittstellen und Funktionsmerkmale eines

    Systems nutzen, die vorhanden sind. Nutzer mit stärkeren Webbrowsern erhalten bessere Experience Apps funktionieren auf schwächeren Webbrowsern trotzdem, aber mit reduziertem Funktionsumfang Prinzip: Browserunterstützung sollte über die Zeit zunehmen, damit kommen zunehmend mehr Anwender in den Genuss weiterer Features In JavaScript: Vorhandensein einer Schnittstelle/eines Funktionsmerkmals prüfen Bei Vorhandensein nutzen Progressive if ('serviceWorker' in navigator) { navigator.serviceWorker.register(…) .then(function () { … }); } Hands-on! Progressive Web Apps mit Angular
  25. Progressive Web Apps sind… Hands-on! Progressive Web Apps mit Angular

    Safe Progressive Responsive Discoverable App-like Fresh Connectivity Independent Re- engageable Installable Linkable
  26. Alle für einen Idee: Ein Website-Layout für alle Bildschirmabmessungen (meist

    ausgerichtet an Breite) Definition von Triggerpunkten, an denen das Layout verändert wird (Mobile First) Umsetzung: CSS3 Media Queries Frameworks: • Bootstrap • Foundation • AdminLTE • … Responsive Hands-on! Progressive Web Apps mit Angular
  27. Progressive Web Apps sind… Hands-on! Progressive Web Apps mit Angular

    Safe Progressive Responsive Discoverable App-like Fresh Connectivity Independent Re- engageable Installable Linkable
  28. Web-Apps und Websites unterscheiden Wie unterscheidet man eine Website von

    einer App? Idee: Datei mit Metadaten für App hinterlegen Zusätzlicher Vorteil: Apps können durch Suchmaschinen identifiziert werden Web App Manifest <link rel="manifest" href="manifest.json"> Discoverable Hands-on! Progressive Web Apps mit Angular
  29. { "short_name": "PWA Demo App", "name": "PWA Demo Application", "icons":

    [ { "src": "assets/launcher-icon-3x.png", "sizes": "144x144", "type": "image/png" } ], "start_url": "index.html", "display": "standalone" } manifest.json Web App Manifest Titel Icons Einspungspunkt Anzeigeart Splash-Screen weitere Konfiguration Beschreibung Zugehörige Apps Hands-on! Progressive Web Apps mit Angular
  30. Fügen Sie ein Web App Manifest hinzu Referenzieren Sie es

    in Ihrer Datei index.html Testen mit Lighthouse Progressive Web Apps mit Angular Hands-on! Web App Manifest EX #2
  31. Progressive Web Apps sind… Hands-on! Progressive Web Apps mit Angular

    Safe Progressive Responsive Discoverable App-like Fresh Connectivity Independent Re- engageable Installable Linkable
  32. Web-Apps, die sich nativ anfühlen Native Funktionen mit HTML5-Technologien •

    Audio-/Videowiedergabe • Hardwarebeschleunigte 2D/3D-Grafik • Gamepad • Fingereingabe • Lokaler Datenspeicher • Location-Based Services • Kamerazugriff • … App-like Hands-on! Progressive Web Apps mit Angular
  33. Single-Page Web Applications Modell zur Entwicklung von Apps im nativen

    Stil: Single-Page Web Applications (SPA) Sichten, Logik, Assets lokal vorhanden (z.B. in Browser-Cache) Navigation innerhalb der App löst keine tatsächliche Websitenavigation aus (Server-Roundtrip) SPA nimmt nur zum Bezug oder zur Modifikation von Daten Kontakt zum entfernten Server auf Vorgehensweise: Mobile First Beim Design von Use Cases und Benutzeroberfläche zuerst für Mobilgeräte beginnen Später erweitern für Geräte mit größeren Bildschirmen und präziseren Eingabemethoden App-like Hands-on! Progressive Web Apps mit Angular
  34. SPA-Architektur Server- Logik Web API Push Service Web API DBs

    HTML, JS, CSS, Assets Webserver Webbrowser SPA Client- Logik View HTML/CSS View HTML/CSS View HTML/CSS HTTPS WebSockets HTTPS HTTPS App-like Hands-on! Progressive Web Apps mit Angular
  35. App Shell Bestimmte Teile der UI werden häufig/immer angezeigt Andere

    Teile sind Dynamic Content Idee: Statische Teile (App Shell) werden im Cache vorgehalten Grundgerüst funktioniert somit auch bei schlechter/keiner Verbindung Beispiel: Anzeige von Fehlermeldungen, falls keine Verbindung Womit die App Shell realisiert wird, ist unerheblich (Angular, AngularJS, React, jQuery, plain JavaScript, …) App-like Hands-on! Progressive Web Apps mit Angular
  36. App Shell Kombiniert server- und clientseitige Generierung *shellRender Strukturdiektive, die

    nur auf dem Server ausgeführt wird (*shellNoRender entsprechend gegensätzlich) @angular/app-shell (nicht mehr nutzen, letztes Release liegt ein Jahr zuück!) <md-toolbar> {{title}} </md-toolbar> <md-spinner *shellRender></md-spinner> <h1>App is Fully Rendered</h1> Progressive Web Apps mit Angular Hands-on! Angular Mobile Toolkit
  37. Progressive Web Apps sind… Hands-on! Progressive Web Apps mit Angular

    Safe Progressive Responsive Discoverable App-like Fresh Connectivity Independent Re- engageable Installable Linkable
  38. Push Ziel: Daten ständig aktuell halten Lösung: Server pusht Änderungen

    auf Plattformebene zur App (selbst, wenn geschlossen) Prinzip: Push-Subscription auf Gerät pro Service Worker Bereitgestellt durch PushManager auf Registrierung des Service Workers Problem: Jeweiliger Endpoint wird durch Plattformanbieter bereitgestellt Also: Anbieter und Push-Dienste müssen Serverkomponente bekannt sein Für Chrome/Android: gcm_sender_id muss in manifest.json hinterlegt werden Fresh Hands-on! Progressive Web Apps mit Angular
  39. Progressive Web Apps sind… Hands-on! Progressive Web Apps mit Angular

    Safe Progressive Responsive Discoverable App-like Fresh Connectivity Independent Re- engageable Installable Linkable
  40. Offlinefähigkeit Problem: Qualität von Internetverbindungen schwankt stark (vor allem unterwegs)

    Lie-Fi: Verbindungsstärke eines öffentlichen WLAN-Netzes ist schwach oder komplett offline Wunsch: Anwendung funktioniert auch offline oder bei schwacher Verbindung …zumindest im Rahmen der Möglichkeiten (z.B. OneNote) Somit: Lokale Datenhaltung erforderlich Bidirektional: Synchronisation/Konfliktauflösung (Web Background Synchronization) Connectivity Independent Hands-on! Progressive Web Apps mit Angular
  41. Konzept Offlinefähigkeit System Website HTML/JS Lokaler Speicher Zentraler Adapter Entfernter

    Speicher Server Internet Hands-on! Progressive Web Apps mit Angular
  42. Umsetzung mit Service Worker Offlinefähigkeit System Website HTML/JS Cache Storage

    Entfernter Speicher Server Internet fetch HTTP Service Worker Hands-on! Progressive Web Apps mit Angular
  43. Service Worker Cache First Then Network System Website HTML/JS Cache

    Storage Entfernter Speicher Server Internet 2. fetch HTTP Service Worker 1. lookup Hands-on! Progressive Web Apps mit Angular
  44. @angular/service-worker erlaubt statisches Caching Cacheinformationen (Dateinamen und -Hashed) müssen der

    Datei ngsw- manifest.json hinzugefügt werden Das Schreiben dieser Cacheinformation per Hand wäre ein eher harter Job, weswegen eine Integration ins Buildsystem zu bevorzugen wäre Die Webpack-Buildintegration (enthalten in Angular CLI) fügt die Artefakte des Build-Output dem Manifest vollautomatisch hinzu Der Service-Worker funktioniert bereits für Produktivbuilds! Progressive Web Apps mit Angular Hands-on! Static Caching EX #3
  45. "routing": { "index": "/index.html", "routes": { "/": { "prefix": false

    }, "/route": { "prefix": true } } }, Progressive Web Apps mit Angular Hands-on! Route Redirection Standarddokument Ganze Route matchen? Zu matchende Route
  46. @angular/service-worker allows redirecting routes Servers usually deliver a default document

    (e.g. index.html), a service worker won’t per default PathLocationStrategy defining other routes that have to be redirected to index.html Progressive Web Apps mit Angular Hands-on! Route Redirection EX #4
  47. Progressive Web Apps sind… Hands-on! Progressive Web Apps mit Angular

    Safe Progressive Responsive Discoverable App-like Fresh Connectivity Independent Re- engageable Installable Linkable
  48. Benutzer mit Notifications zurückholen Idee: Benutzer zum (Wieder-)Verwenden der App

    bewegen Bekannt aus sozialen Netzwerken, Spielen, … Realisiert über den PushManager Auch hier: Jeweiliger Endpoint wird durch Plattformanbieter bereitgestellt Und: Anbieter und Push-Dienste müssen Serverkomponente bekannt sein Re-Engageable Hands-on! Progressive Web Apps mit Angular
  49. Push Notifications @angular/service-worker allows push notifications They first have to

    be enabled via ngsw-manifest.json "push": { "showNotifications": true, "backgroundOnly": false }, Progressive Web Apps mit Angular Hands-on! Re-Engagable
  50. Push Notifications // … import { ServiceWorkerModule, NgServiceWorker } from

    '@angular/service-worker'; @NgModule({ imports: [ // … ServiceWorkerModule ], // … }) export class AppModule { constructor(serviceWorker: NgServiceWorker) { serviceWorker.registerForPush() .subscribe(registration => console.log(JSON.stringify(registration))); } } Progressive Web Apps mit Angular Hands-on! Re-Engagable
  51. Push Notifications registerForPush returns a PushSubscription Required steps for push

    notifications differ from runtime platform to runtime platform Google Chrome: Google Cloud Messaging API keys required Usually the information from the PushSubscription would be sent to the backend or a third-party service Progressive Web Apps mit Angular Hands-on! Re-Engagable EX #5
  52. Progressive Web Apps sind… Hands-on! Progressive Web Apps mit Angular

    Safe Progressive Responsive Discoverable App-like Fresh Connectivity Independent Re- engageable Installable Linkable
  53. App Install Banners Idee: Aufruf einer Website schlägt Installation zugehöriger

    App vor z. B. bekannt aus iOS (Verknüpfung zu zugehöriger App im Store) Bei PWA: Web-App = App-App Anzeige eines Banners zum Anpinnen der Website auf Home-Screen Alte Idee: iOS Add to homescreen, IE9 Pinned Websites, Windows 8 Live Tiles, … Installable Hands-on! Progressive Web Apps mit Angular
  54. App Install Banners Für das Web als Teil der Web

    App Install Enhancement Proposals Anzeige der jeweiligen Metadaten aus dem Web App Manifest Browser steuert Banner-Anzeige anhand bestimmter Kriterien Event: beforeInstallPrompt Anzeige des Banners kann unterbunden werden Anwendung erfährt, ob Aufforderung bestätigt/abgelehnt wurde Installable Hands-on! Progressive Web Apps mit Angular
  55. App Install Banners – Kriterien* Web App Manifest muss vorhanden

    sein short_name und name müssen darin hinterlegt sein Gültige start_url muss darin hinterlegt sein Wenigstens ein Icon in den Abmaßen 144x144 Pixeln muss hinterlegt sein (sollte PNG sein) Ein beliebiger Service Worker muss für jeweilige Seite registriert sein Seite muss über HTTPS ausgeliefert worden sein Heuristik: Seite muss zweimal besucht worden sein, mit fünf Minuten Pause dazwischen * Kriterien können sich ändern https://developers.google.com/web/updates/2015/03/increasing-engagement-with-app-install-banners-in-chrome-for-android Installable Hands-on! Progressive Web Apps mit Angular
  56. Progressive Web Apps sind… Hands-on! Progressive Web Apps mit Angular

    Safe Progressive Responsive Discoverable App-like Fresh Connectivity Independent Re- engageable Installable Linkable
  57. Reference Apps and Internal App States Idee: Auf Anwendungen oder

    Anwendungszustände (Deep Link) direkt verlinken Technisches Mittel für selbstauflösende Verweise im World Wide Web: Hyperlink Schema für Hyperlinks: Uniform Resource Locator (URL) Annäherung in (mobilen) Betriebssystemen: URI-Schemes (fb://profile) Im Web für Anwendungen for free Gegebenenfalls auch für Anwendungszustände (z. B. bei SPA-Anwendungen) In klassischen Desktop-Anwendungen schwierig zu realisieren (Öffnen des Erweiterungs-Dialogs in Visual Studio via Deep Link?) Linkable Hands-on! Progressive Web Apps mit Angular
  58. Reference Apps and Internal App States https://myapp.com/profile.php?id=peter.mueller Classic (Query String)

    https://myapp.com/#/profile/peter.mueller Hash Anchor (e.g. SPA) https://myapp.com/profile/peter.mueller HTML5 History (SPA)/Server Rendered Linkable Hands-on! Progressive Web Apps mit Angular
  59. Minimalanforderungen • Stammen aus einer sicheren Quelle • Können auch

    offline geladen werden • Referenzieren ein Web App Manifest Progressive Web Apps Hands-on! Progressive Web Apps mit Angular
  60. Evaluation Noch keine Unterstützung für iOS, veraltete Android-Versionen und Windows

    Phone/10 Mobile Monetarisierung/In-App-Käufe/ Qualitätssicherung? Moving Target: Teilweise experimentell/nur in Android umsetzbar/instabil Write once, run anywhere (Real Cross Platform) Web App = App App (volle Flexibilität) Free Lunch Progressive Web Apps Germany Mobile Platform Market Share (Smartphones Sold, Q2 2016) Android iOS Windows Blackberry Other Hands-on! Progressive Web Apps mit Angular
  61. Monetarisierung • Payment Request API • Unterstützt von Microsoft Edge

    und Google Chrome • Aufkommende Zahlungstechnologie des Web (für Onlineshops etc.) • Gegenspieler: Apple Pay JS Progressive Web Apps Hands-on! Progressive Web Apps mit Angular
  62. Alternatives (Extract) Native App Packaging Offline Availability Real Cross Platform

    – Get it Today LOCALFORAGE Hands-on! Progressive Web Apps mit Angular