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

PWA-Workshop: Angular Everywhere - So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on)

PWA-Workshop: Angular Everywhere - So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on)

Stellen Sie sich vor, Sie schreiben Ihre moderne Businessanwendung genau einmal – und sie läuft auf Windows, macOS, Linux, Android, iOS und im Browser. Diese Anwendungen werden per Fingertippen aus dem Browser auf dem Gerät installiert und funktionieren auch dann, wenn das WiFi im Zug gerade mal wieder nicht funktioniert. Das klingt fantastisch? Dank Progressive Web Apps (PWA) wird all das Wirklichkeit. Mit Hilfe moderner Webtechnologien wird aus einer Webanwendung eine App, die einer nativen App in nichts nachsteht. In diesem Workshop zeigen wir anhand eines durchgängigen Beispiels die Grundlagen der PWA-Entwicklung mit Googles Single Page App Framework Angular, bei denen Sie aktiv mitentwickeln können. Jede(r) geht mit einer PWA nach Hause!

Christian Liebel

October 01, 2023
Tweet

More Decks by Christian Liebel

Other Decks in Programming

Transcript

  1. Workshop Angular meets Project Fugu Produktivitäts-PWAs auf Desktopniveau (Hands-on) Christian

    Liebel @christianliebel Consultant Patrick Jahr @jahr_patrick Developer Consultant
  2. Hello, it’s me. Angular Everywhere So entwickeln Sie Progressive Web

    Apps für alle Plattformen (hands-on) Christian Liebel Twitter: @christianliebel Email: christian.liebel @thinktecture.com Angular & PWA Slides: thinktecture.com /christian-liebel
  3. Hello, it’s me. Patrick Jahr Developer Consultant @ Thinktecture AG

    Frontend: Angular, Blazor | Backend: ASP.NET Core, .NET E-Mail: [email protected] Twitter: @jahr_patrick Slides: https://thinktecture.com/patrick-jahr Patrick Jahr So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Angular Everywhere
  4. 08:30–10:00 Block 1 10:00–10:30 Break 10:30–12:00 Block 2 12:00-13:00 Lunch

    13:00-14:30 Block 3 14:30-15:00 Break 15:00-16:30 Block 4 Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Timetable
  5. 08:30–10:00 Block 1 10:00–10:15 Break 10:15–12:00 Block 2 12:00-12:45 Lunch

    12:45-14:15 Block 3 14:15-14:30 Break 14:30-15:45 Block 4 Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Timetable Idea
  6. Things NOT to expect - Blueprint for PWA development -

    No AuthN/AuthZ Things To Expect - Extensive/up-to-date insights into PWA and Project Fugu - A productivity app use case that works on your desktop & smartphone - Lots of fun - Hands-on exercises So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Angular Everywhere
  7. https://paint.js.org – Productivity app – Draw images – Lots of

    actions & tools – Installable – Read/save files – Copy/paste images from/to clipboard – Share files to other apps – Register for file extensions Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Demo Use Case
  8. (Workshop Edition) – Productivity app – Draw images – Lots

    of actions & tools – Installable – Read/save files – Copy/paste images from/to clipboard – Share files to other apps – Register for file extensions Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Demo Use Case
  9. Setup complete? (Node.js, Google Chrome, Editor, Git) Angular Everywhere So

    entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Setup (1/3) LAB #0
  10. git clone https://github.com/thinktecture-labs/ basta-2023-angular-project-fugu.git cd basta-2023-angular-project-fugu npm i npm start

    -- --open Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Setup (3/3) LAB #0
  11. Paint PWA Capabilitie s Progressive Enhanceme nt Angular Everywhere So

    entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Agenda
  12. Paint PWA Capabilitie s Progressive Enhanceme nt Angular Everywhere So

    entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Agenda
  13. Canvas – Plain bitmap for the web – Cross-platform, hardware-

    accelerated graphics operations – Supports different contexts (2D, 3D: WebGL, WebGL 2.0) – Supported on all evergreen browsers and on IE 9+ Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Paint
  14. Canvas Add a canvas element to app.component.html: <canvas #canvas width="600"

    height="480"></canvas> Query the canvas element in app.component.ts: @ViewChild('canvas') canvas?: ElementRef<HTMLCanvasElement>; Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Paint LAB #1
  15. Canvas 2D Context fillRect(x, y, width, height) strokeRect(x, y, width,

    height) beginPath() moveTo(x, y) lineTo(x, y) fill() stroke() Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Paint
  16. Canvas 2D Context 1. Introduce a new field at the

    top of app.component.ts: context?: CanvasRenderingContext2D; 2. Get the 2D context in ngAfterViewInit(): const canvas = this.canvas!.nativeElement; const ctx = canvas.getContext('2d')!; this.context = ctx; 3. Prepare the canvas: ctx.fillStyle = 'white'; ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.fillStyle = 'black'; Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Paint LAB #2
  17. Low-latency Rendering Angular Everywhere So entwickeln Sie Progressive Web Apps

    für alle Plattformen (hands-on) Paint Web pages need to synchronize with the DOM on graphics updates causing latencies that can make drawing difficult Low-latency rendering skips syncing with the DOM with can lead to a more natural experience Supported on Chrome (Chrome OS and Windows only)
  18. Low-latency Rendering Opt-in to low-latency rendering (app.js): const ctx =

    canvas.getContext('2d', { desynchronized: true })!; Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Paint LAB #3
  19. Pointer Events Angular Everywhere So entwickeln Sie Progressive Web Apps

    für alle Plattformen (hands-on) Paint Users nowadays use different input methods, cross-platform apps should cover all of them Pointer Events offer an abstract interface to catch all input methods (pointerdown, pointermove, pointerup) event.offsetX/event.offsetY contain the pointer’s position relative to the listener
  20. Pointer Events 1. In app.component.html, add event bindings for the

    pointer events: <canvas #canvas width="600" height="480" (pointerdown)="onPointerDown($event)" (pointermove)="onPointerMove($event)" (pointerup)="onPointerUp()" ></canvas> 2. In app.component.ts (onPointerMove()), draw the user input: this.context!.fillRect(event.offsetX, event.offsetY, 2, 2); Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Paint LAB #4
  21. Bresenham Line Algorithm The user may move faster than the

    input can be processed For this case, we need to remember the previous point and interpolate the points in between The Bresenham line algorithm calculates the missing pixels between two given points Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Paint
  22. Bresenham Line Algorithm 1. At the top of app.component.ts, a

    field called previousPoint to store the previous point: previousPoint?: { x: number, y: number }; 2. In onPointerDown(), set the current point as the previous point: this.previousPoint = { x: event.offsetX, y: event.offsetY }; 3. In onPointerUp(), set this.previousPoint to undefined. Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Paint LAB #5
  23. Bresenham Line Algorithm 4. In onPointerMove(), call the Bresenham line

    algorithm with the points: if (this.previousPoint) { const currentPoint = { x: event.offsetX, y: event.offsetY }; for (const point of this.paintService.bresenhamLine(this.previousPoint, currentPoint)) { this.context!.fillRect(point.x, point.y, 2, 2); } this.previousPoint = currentPoint; } Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Paint LAB #5
  24. Color Selection For this demo, we will only implement the

    brush tool. However, we want to bring in some color. A simple method to implement a color selection is to use the HTML color-type input element that shows the native color picker: <input type="color"> Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Paint
  25. Color Selection 1. In app.component.html, replace the content of the

    <nav> node with: <input type="color" #color (change)="onColorChange(color)"> 2. In app.component.ts (onColorChange()), update the context’s fill style accordingly: this.context!.fillStyle = color.value; Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Paint LAB #6
  26. Paint PWA Capabilitie s Progressive Enhanceme nt Angular Everywhere So

    entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Agenda
  27. So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on)

    Angular Everywhere Responsive Linkable Discoverable Installable App-like Connectivity Independent Fresh Safe Re-engageable Progressive
  28. Angular Everywhere So entwickeln Sie Progressive Web Apps für alle

    Plattformen (hands-on) Web App Manifest Service Worker
  29. Web Application Manifest Distinguishes Web Apps from Websites JSON-based file

    containing metadata for apps only Apps can be identified by search engines, app store providers, etc. Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) PWA
  30. manifest.webmanifest { "short_name": "Paint", "name": "Paint Workshop", "theme_color": "white", "icons":

    [{ "src": "icon.png", "sizes": "512x512" }], "start_url": "/index.html", "display": "standalone", "shortcuts": [/* … */] } Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) PWA Names Icons Display Mode Shortcuts Start URL Theme color (status bar/window bar)
  31. Manifest Display Modes Angular Everywhere So entwickeln Sie Progressive Web

    Apps für alle Plattformen (hands-on) PWA browser minimal-ui standalone fullscreen
  32. Manifest Icon Purposes (any) any context (e.g. app icon) monochrome

    different color requirements maskable user agent masks icon as required Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) PWA Safe Zone Windows iOS Android
  33. Web App Manifest 1. Stop the npm start command, then

    run the following command to add PWA support to the current project: npm run ng add @angular/pwa 2. In manifest.webmanifest, a) set name and short_name to values of your choice b) change the theme_color to #000080 c) change the background_color to #808080 3. In index.html, change the theme-color to #000080. 4. Test manifest in DevTools: F12 > Application > Manifest Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) PWA LAB #7
  34. Manifest Shortcuts Angular Everywhere So entwickeln Sie Progressive Web Apps

    für alle Plattformen (hands-on) PWA Secondary entrypoints for your application (e.g., home screen quick actions, jump lists, …) Static definition in Web Application Manifest Supported by Google Chrome for Android, macOS and Windows
  35. Web App Manifest 1. In manifest.webmanifest, add (at least) the

    following shortcut: "shortcuts": [{ "name": "About Paint", "short_name": "About", "description": "Show information about Paint", "url": "./", "icons": [{ "src": "assets/icons/icon-512x512.png", "sizes": "512x512" }] }] 2. Test in DevTools: F12 > Application > Manifest Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) PWA LAB #8
  36. Web App Manifest – Chrome Install Criteria 1. Web App

    is not already installed 2. Meets a user engagement heuristic (user has interacted and clicked with origin for at least 30 seconds) 3. Includes a Web App Manifest that has short_name or name, at least a 192px and 512px icon, a start_url and a display mode of fullscreen, standalone or minimal-ui 4. Served over HTTPS 5. Has a registered service worker with a fetch event handler (subject to change!) Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) PWA https://web.dev/install-criteria/
  37. Service Worker JavaScript executed in an own thread, registered by

    the website Acts as a controller, proxy, or interceptor Has a cache to store responses (for offline availability and performance) Can wake up even when the website is closed and perform background tasks (e.g., push notifications or sync) Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) PWA
  38. Service Worker Angular Everywhere So entwickeln Sie Progressive Web Apps

    für alle Plattformen (hands-on) PWA Service Worker Internet Website HTML/JS Cache fetch
  39. NgServiceWorker Angular CLI supports Service Worker generation by simply adding

    PWA support: ng add @angular/pwa One-size-fits-all Service Worker Pre-defined functionality, limited customizability PWA So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Angular Everywhere
  40. Workbox Toolchain by Google Includes a CLI Generates a service

    worker implementation from directory contents (e.g., build output, or our development directory) Allows you to modify the service worker behavior (maximum flexibility) Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) PWA
  41. Service Worker 1. In your console, run: npm run pwa

    2. Test in DevTools: F12 > Application > Service Worker 3. Install the app: Address Bar > Install Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) PWA LAB #9
  42. Push Notifications Just as native apps, PWAs can receive push

    notifications Combination of two technologies: Web Notifications and Push API Supported by Chrome, Edge, Firefox, Safari Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) PWA
  43. Service Worker Debugging More information on installed service workers can

    be found on • about://serviceworker- internals (Chromium-based browsers) • about:serviceworkers (Mozilla Firefox) Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) PWA
  44. Lighthouse Angular Everywhere So entwickeln Sie Progressive Web Apps für

    alle Plattformen (hands-on) PWA Auditing tool by Google, integrated in Chrome DevTools Automatically checks performance metrics, PWA support, accessibility, SEO and other best practices and gives tips on how to improve Can simulate mobile devices
  45. Lighthouse 1. Make sure only one tab/window of your PWA

    is open 2. Open DevTools: F12 > Lighthouse 3. Make sure to select at least the “Progressive Web App” category 4. Click “Analyze page load” Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) PWA LAB #10
  46. Paint PWA Capabilitie s Progressive Enhanceme nt Angular Everywhere So

    entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Agenda
  47. Project Fugu Angular Everywhere So entwickeln Sie Progressive Web Apps

    für alle Plattformen (hands-on) Capabilities »Let’s bring the web back – API by API« Thomas Steiner, Google
  48. Angular Everywhere So entwickeln Sie Progressive Web Apps für alle

    Plattformen (hands-on) Capabilities Contacts Picker Screen Wake Lock API File System Access API Shape Detection API
  49. Angular Everywhere So entwickeln Sie Progressive Web Apps für alle

    Plattformen (hands-on) Capabilities https://goo.gle/fugu-api-tracker
  50. Browser Angular Everywhere So entwickeln Sie Progressive Web Apps für

    alle Plattformen (hands-on) Capabilities navigator.share({ url: 'http://example.com' }); ShareIntent DataTransferManager … NSSharingServicePicker
  51. File System Access API Some applications heavily rely on working

    with files (e.g. Visual Studio Code, Adobe Photoshop, …) File System Access API allows you to open, save and override files and directories Supported by Chrome, Edge Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Capabilities
  52. File System Access API 1. Add the following buttons to

    the <nav> bar in app.component.html (before the color input): <button (click)="open()">Open</button> <button (click)="save()">Save</button> <button (click)="copy()">Copy</button> <button (click)="paste()">Paste</button> <button (click)="share()">Share</button> Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Capabilities LAB #11
  53. File System Access API 2. Add the following lines at

    the top of app.component.ts: readonly fileOptions = { types: [{ description: 'PNG files', accept: {'image/png': ['.png']} }] }; Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Capabilities LAB #11
  54. File System Access API 3. Add the following lines to

    the save() function: const blob = await this.paintService.toBlob(this.canvas!.nativeElement); const handle = await window.showSaveFilePicker(this.fileOptions); const writable = await handle.createWritable(); await writable.write(blob); await writable.close(); Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Capabilities LAB #11
  55. File System Access API Add the following code to the

    open() function: const [handle] = await window.showOpenFilePicker(this.fileOptions); const file = await handle.getFile(); const image = await this.paintService.getImage(file); this.context!.drawImage(image, 0, 0); Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Capabilities LAB #12
  56. Async Clipboard API Allows reading from/writing to the clipboard in

    an asynchronous manner (UI won’t freeze during long-running operations) Reading from the clipboard requires user consent first (privacy!) Supported by Chrome, Edge and Safari and Firefox (plain- text only) Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Capabilities
  57. Async Clipboard API Add the following code to the copy()

    function: await navigator.clipboard.write([ new ClipboardItem({ "image/png": this.paintService.toBlob(this.canvas!.nativeElement) }), ]); Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Capabilities LAB #13
  58. Async Clipboard API const clipboardItems = await navigator.clipboard.read(); for (const

    clipboardItem of clipboardItems) { for (const type of clipboardItem.types) { if (type === 'image/png') { const blob = await clipboardItem.getType(type); const image = await this.paintService.getImage(blob); this.context!.drawImage(image, 0, 0); } } } Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Capabilities LAB #14
  59. Web Share API Allows sharing a title, URL, text, or

    files API can only be invoked as a result of a user action (i.e. a click or keypress) Supported by Chrome, Edge, Safari and Firefox (Android only) Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Capabilities
  60. Web Share API const blob = await this.paintService.toBlob(this.canvas!.nativeElement); const file

    = new File([blob], 'untitled.png', {type: 'image/png'}); const item = { files: [file], text: 'Awesome drawing' }; if (navigator.canShare(item)) { await navigator.share(item); } Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Capabilities LAB #15
  61. File Handling API Register your PWA as a handler for

    file extensions Requires installing the application first Declare supported extensions in Web App Manifest and add imperative code to your application logic Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Capabilities
  62. File Handling API 1. Add the following property to your

    manifest (manifest.webmanifest): "file_handlers": [{ "action": "/index.html", "accept": { "image/png": [".png"] } }] Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Capabilities LAB #16
  63. File Handling API 2. Add the following code to ngAfterViewInit()

    in app.component.ts: if ('launchQueue' in window) { window.launchQueue.setConsumer(async params => { const [handle] = params.files; if (handle) { const file = await handle.getFile(); const image = await this.paintService.getImage(file); ctx.drawImage(image, 0, 0); } }); } Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Capabilities LAB #16
  64. File Handling API 3. Rebuild PWA: npm run pwa Note:

    Wait for a few seconds and reload the application after opening, as the PWA needs to fetch the new files first. about://apps Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Capabilities LAB #16
  65. Summary - Project Fugu helps the web to become more

    and more capable - Project Fugu APIs could bring many more app experiences to the web (IDEs, productivity apps, etc.) - But: Web is threatened by alternative approaches and platforms, support for modern Web API varies from platform to platform - You can make a difference! - File bugs in browser engine bugtrackers - File Fugu requests: https://goo.gle/new-fugu-request Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Capabilities
  66. Paint PWA Capabilitie s Progressive Enhanceme nt Angular Everywhere So

    entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Agenda
  67. Overview Use available interfaces and functions of a system (opposite

    of Graceful Degradation) Users with modern, feature-rich browsers get a better experience Apps are available on older browsers, but with limited functionality Concept: Browser feature support should grow over time—thereby more users can enjoy an increasing number of features Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Progressive Enhancement
  68. Overview if ('serviceWorker' in navigator) { navigator.serviceWorker.register(…) .then(() => /*

    … */); } In JavaScript: check whether an API/feature is available. If yes—use it! Otherwise: 1. Disable the functionality 2. Fall back to an alternative API (if available) Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Progressive Enhancement
  69. Disabling unsupported features In app.component.ts, introduce the following check object:

    readonly supported = { open: 'showOpenFilePicker' in window, } as const; In app.component.html, disable the open button if the API is unsupported: <button (click)="open()" [disabled]="!supported.open"> Open</button> Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Progressive Enhancement LAB #17
  70. Disabling unsupported features Introduce checks for the remaining APIs: 1.

    Save: 'showSaveFilePicker' in window 2. Copy: navigator.clipboard && 'write' in navigator.clipboard 3. Paste: navigator.clipboard && 'read' in navigator.clipboard 4. Share: 'canShare' in navigator Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Progressive Enhancement LAB #17
  71. Providing an alternative implementation 1. In the save() method of

    app.component.ts, test for the existence of the showSaveFilePicker() method on the window object. 2. If the method does not exist, fall back to the following code for save: const anchor = document.createElement('a'); const url = URL.createObjectURL(blob); anchor.href = url; anchor.download = ''; anchor.click(); URL.revokeObjectURL(url); 3. Remove the compatibility check to always enable the button. Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Progressive Enhancement LAB #18
  72. Run app on your device npm run pwa https://ngrok.com/download ngrok

    http 3000 Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) LAB #19
  73. New powerful APIs regularly ship with new releases of Chromium-based

    browsers Some only add minor finishing touches, others enable whole application categories as productivity apps to finally make the shift to the web Some APIs already made their way into other browsers (e.g., Web Share) Fugu process makes sure that capabilities are implemented in a secure, privacy-preserving manner Let’s make the web a more capable platform! Angular Everywhere So entwickeln Sie Progressive Web Apps für alle Plattformen (hands-on) Summary