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

Progressive Web Apps und Project Fugu: Das nächste Level für Cross-Platform-Apps

Progressive Web Apps und Project Fugu: Das nächste Level für Cross-Platform-Apps

Progressive Web Apps (PWA) ermöglichen es Ihnen, Businessanwendungen für den Browser zu entwickeln, die sich zugleich wie native Anwendungen anfühlen und dabei sogar offline-fähig sind. Dank Project Fugu stehen diese PWAs ihren nativen Gegenstücken in nichts nach! Erfahren Sie in diesem Workshop, wie Sie erfolgreich ihre eigenen PWAs entwickeln!

12c88a3a10478fa18d0363b3ba3d9df1?s=128

Christian Liebel
PRO

February 19, 2021
Tweet

Transcript

  1. Progressive Web Apps und Project Fugu Das nächste Level für

    Cross-Platform-Apps Christian Liebel Steffen Jahr @christianliebel @steffenjahr Consultant Consultant
  2. Feel free to ask questions anytime! Your instructors Das nächste

    Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu Steffen Jahr Christian Liebel
  3. 09:00–10:30 Block 1 10:30–11:00 Break 11:00–12:30 Block 2 12:30–13:30 Break

    13:30–15:00 Block 3 15:00–15:30 Break 15:30–17:00 Block 4 Timetable Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  4. Proposal 09:00–10:30 Block 1 10:30–10:45 Break 10:45–12:30 Block 2 12:30–13:30

    Break 13:30–15:00 Block 3 15:00–15:15 Break 15:15–16:30 Block 4 Timetable Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  5. Things NOT to expect - Blueprint for PWA development -

    No AuthN/AuthZ - No 1:1 support 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 Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  6. 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 Demo Use Case Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  7. (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 Demo Use Case Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  8. Setup complete? (Node.js, Google Chrome, Editor, Git) Setup (1/3) LAB

    Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  9. Optional Download and install Chrome Canary: https://www.google.com/intl/de/chrome/canary/ Setup (2/3) LAB

    Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  10. git clone https://github.com/thinktecture/basta- spring-2021-pwa-fugu.git cd basta-spring-2021-pwa-fugu npm i npm start

    Setup (3/3) LAB Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  11. Paint PWA Capabilitie s Progressive Enhanceme nt Agenda Das nächste

    Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  12. Paint PWA Capabilities Progressive Enhancement Agenda Das nächste Level für

    Cross-Platform-Apps Progressive Web Apps und Project Fugu
  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+ Paint Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  14. Canvas Add a canvas element to app.component.html (line 5): <canvas

    #canvas width="600" height="480"></canvas> Query the canvas element in app.component.ts (line 10): @ViewChild('canvas') canvas: ElementRef<HTMLCanvasElement>; context: CanvasRenderingContext2D; Paint EX #1 Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  15. Canvas 2D Context fillRect(x, y, width, height) strokeRect(x, y, width,

    height) beginPath() moveTo(x, y) lineTo(x, y) fill() stroke() Paint Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  16. Canvas 2D Context Get the 2D context and prepare the

    canvas in app.component.ts in the method ngAfterViewInit(): const canvas = this.canvas.nativeElement; const ctx = this.context = canvas.getContext('2d'); ctx.fillStyle = 'white'; ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.fillStyle = 'black'; Paint EX #2 Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  17. Low-latency Rendering 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) Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  18. Low-latency Rendering Opt-in to low-latency rendering (app.component.ts): const ctx =

    this.context = canvas.getContext('2d', { desynchronized: true }); Paint EX #3 Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  19. Pointer Events 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 Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  20. Pointer Events Add event listeners (app.component.html and app.component.ts): <canvas #canvas

    width="600" height="480" (pointerdown)="onPointerDown($event)" (pointermove)="onPointerMove(canvas, $event)" (pointerup)="onPointerUp()"></canvas> onPointerMove(canvas: HTMLCanvasElement, event: PointerEvent): void { this.context.fillRect(~~event.offsetX, ~~event.offsetY, 2, 2); } Paint EX #4 Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  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 Paint Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  22. Bresenham Line Algorithm Update the method onPointerMove() in app.component.ts: if

    (this.previousPoint) { const currentPoint = {x: Math.floor(event.offsetX), y: Math.floor(event.offsetY)}; const points = this.paintService.bresenhamLine(this.previousPoint.x, this.previousPoint.y, currentPoint.x, currentPoint.y); for (const {x, y} of points) { this.context.fillRect(x, y, 2, 2); this.previousPoint = currentPoint; } } Paint EX #5 Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  23. 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"> Paint Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  24. Color Selection 1. In app.component.html, add the following input to

    the <nav> node: <input type="color" (change)="colorChange($event)"> 2. In app.component.ts, add the following code in the method colorChange(): this.context.fillStyle = $event.target.value; Paint EX #6 Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  25. Paint PWA Capabilitie s Progressive Enhanceme nt Agenda Das nächste

    Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  26. Responsive Linkable Discoverable Installable App-like Connectivity Independent Fresh Safe Re-engageable

    Progressive Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  27. Web App Manifest Service Worker Das nächste Level für Cross-Platform-Apps

    Progressive Web Apps und Project Fugu
  28. Web App 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. PWA Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  29. manifest.webmanifest { "short_name": "Paint", "name": "Paint Workshop", "theme_color": "white", "icons":

    [{ "src": "icon.png", "sizes": "512x512" }], "start_url": "/index.html", "display": "standalone", "shortcuts": [/* … */] } PWA Names Icons Display Mode Shortcuts Start URL Theme color (status bar/window bar) Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  30. Manifest Display Modes PWA browser minimal-ui standalone fullscreen Das nächste

    Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  31. Manifest Icon Purposes (any) any context (e.g. app icon) monochrome

    different color requirements (at risk) maskable user agent masks icon as required PWA Safe Zone Windows iOS Android Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  32. Web App Manifest 1. In your console, run: npx ng

    add @angular/pwa 2. Update the new file manifest.webmanifest and set: a) name and short_name to values of your choice b) theme_color to #000080 and background_color to #808080 3. In index.html, set theme_color to #000080 as well. 4. Run npm run start 5. Test manifest in DevTools: F12 > Application > Manifest PWA EX #7 Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  33. Manifest Shortcuts PWA Secondary entrypoints for your application (e.g., home

    screen quick actions, jump lists, …) Static definition in Web App Manifest Dynamic API may follow in the future Supported by Google Chrome for Android Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  34. 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": "/index.html", "icons": [{ "src": "assets/icons/icon-512x512.png", "sizes": "512x512" }] }], 2. Test in DevTools: F12 > Application > Manifest PWA EX #8 Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  35. Web App Manifest – Chrome Installability Signals Web App is

    not already installed Meets a user engagement heuristic (previously: user has interacted with domain for at least 30 seconds) 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 Served over HTTPS Has a registered service worker with a fetch event handler PWA Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  36. Service Worker JavaScript snippet 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) PWA Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  37. Service Worker PWA Service Worker Internet Website HTML/JS Cache fetch

    Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  38. 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 Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  39. 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) PWA Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  40. Service Worker 1. Start build with npm run build --

    --prod 2. Go to dist folder: cd dist/basta-spring-2021-pwa-fugu 3. Start with npx lite-server 4. Test in DevTools: F12 > Application > Service Worker 5. Install the app: Address Bar > ⊕ Install PWA EX #9 Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  41. Push Notifications Just as native apps, PWAs can receive push

    notifications Combination of two technologies: Web Notifications and Push API (Not supported on Safari for macOS, iOS and iPadOS!) Progressive Web Apps und Project Fugu Das nächste Level für Cross-Platform-Apps PWA
  42. Service Worker Debugging More information on installed service workers can

    be found on • chrome://serviceworker- internals (Google Chrome) • about:serviceworkers (Mozilla Firefox) PWA Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  43. Service Worker Debugging PWA Das nächste Level für Cross-Platform-Apps Progressive

    Web Apps und Project Fugu
  44. Lighthouse 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 Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  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 “Generate report” PWA EX #10 Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  46. Paint PWA Capabilities Progressive Enhancement Agenda Das nächste Level für

    Cross-Platform-Apps Progressive Web Apps und Project Fugu
  47. Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project

    Fugu
  48. Project Fugu Capabilities »Let’s bring the web back – API

    by API« Thomas Steiner, Google Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  49. Capabilities Contacts Picker Screen Wake Lock API File System Access

    API Shape Detection API Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  50. Capabilities https://goo.gle/fugu-api-tracker Das nächste Level für Cross-Platform-Apps Progressive Web Apps

    und Project Fugu
  51. Fugu Process – Write an Explainer (https://github.com/WICG/native-file- system/blob/master/EXPLAINER.md) – Discuss

    capability with developers, browser vendors, standard orgs – Iterate – Compile a design document – W3C TAG Review (https://github.com/w3ctag/design- reviews/issues/390) – Formal spec within Web Incubator Community Group (WICG, https://wicg.github.io/native-file-system/) Capabilities Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  52. Fugu Process – Implementation in Chromium – Launches behind a

    flag (chrome://flags/#enable-experimental-web- platform-features) – Origin Trial (https://developers.chrome.com/origintrials/) – Transfer to W3C Working Group + Recommendation? Capabilities Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  53. Capabilities navigator.share({ url: 'http://example.com' }); ShareIntent DataTransferManager … NSSharingServicePicker Das

    nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  54. 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 Shipped with Google Chrome 86 Capabilities Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  55. 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> Capabilities EX #11 Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  56. File System Access API 2. Add the following lines at

    the top of app.component.ts: private fileOptions = { types: [{ description: 'PNG files', accept: {'image/png': ['.png']} }] }; Capabilities EX #11 Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  57. File System Access API 4. Add the following lines in

    the method save of app.component.ts: const blob = await this.paintService.toBlob(this.canvas.nativeElement); const handle = await (window as any).showSaveFilePicker(this.fileOptions); const writable = await handle.createWritable(); await writable.write(blob); await writable.close(); Capabilities EX #11 Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  58. File System Access API Add the following code int the

    method open() of app.component.ts: const [handle] = await (window as any).showOpenFilePicker(this.fileOptions); const file = await handle.getFile(); const image = await this.paintService.getImage(file); this.context.drawImage(image, 0, 0); Capabilities EX #12 Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  59. 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 Capabilities Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  60. Async Clipboard API Add the following code in the method

    copy() of app.component.ts: const blob = await this.paintService.toBlob(this.canvas.nativeElement); await navigator.clipboard.write([ new ClipboardItem({[blob.type]: blob}) ]); Capabilities EX #13 Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  61. Async Clipboard API Add the following code in the method

    paste() of app.component.ts: 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); } } } Capabilities EX #14 Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  62. 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) Files supported in Chrome on Android, Edge on Windows Capabilities Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  63. Web Share API Add the following code in the paste()

    method in the app.component.ts: const blob = await this.paintService.toBlob(this.canvas.nativeElement); const file = new File([blob], 'untitled.png', {type: 'image/png'}); const item = {files: [file], title: 'untitled.png'}; if (await navigator.canShare(item)) { await navigator.share(item); } Capabilities EX #15 Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  64. File System 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 Capabilities Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  65. File System Handling API 1. Enable the following flag in

    Chrome Canary and restart the browser: chrome://flags/#file-handling-api 2. Add the following property to your manifest (manifest.webmanifest): "file_handlers": [{ "action": "/index.html", "accept": { "image/png": [".png"] } }] Capabilities EX #16 Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  66. File System Handling API 3. Add the following code to

    the bottom of the ngAfterViewInit() method of app.component.ts: if ('launchQueue' in window) { (window as any).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); } }); } 4. Re-generate Service Worker: npm run workbox generateSW Capabilities EX #16 Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  67. 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 Capabilities Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  68. Paint PWA Capabilitie s Progressive Enhanceme nt Agenda Das nächste

    Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  69. 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 Progressive Enhancement Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  70. 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) Progressive Enhancement Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  71. Disabling unsupported features In app.component.ts, disable the buttons in case

    the respective API does not exist, e.g.: isClipboardDisabled = !('clipboard' in navigator && 'read' in navigator.clipboard); And update the buttons in the app.component.html with a [disabled] attribute, e.g.: <button (click)="copy()" [disabled]="isClipboardDisabled">Copy</button> Progressive Enhancement EX #17 Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  72. Disabling unsupported features 1. Open: window.showOpenFilePicker() 2. Save: window.showSaveFilePicker() 3.

    Copy: navigator.clipboard + navigator.clipboard.read() 4. Paste: navigator.clipboard + navigator.clipboard.write() 5. Share: navigator.canShare() Progressive Enhancement EX #17 Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  73. Providing an alternative implementation 1. In app.component.ts in the method

    save(), test for the existence of the showSaveFilePicker() method on the navigator object. 2. If the method does not exist, fall back to the following code for save: const anchor = this.document.createElement('a'); const url = URL.createObjectURL(blob); anchor.href = url; anchor.download = ''; anchor.click(); URL.revokeObjectURL(url); Progressive Enhancement EX #18 Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  74. Deployment Electron/Capacitor JS HTML CSS .ipa .exe .app ELF .apk

    .appx Single-Page Application Capacitor Electron Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  75. (Simplified) Store Deployments https://example.com .appx .apk Server Microsoft Store Play

    Store Source Files Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  76. Run app on your device https://ngrok.com/download ngrok http 3000 EX

    #19 Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  77. Crunch Time LAB Das nächste Level für Cross-Platform-Apps Progressive Web

    Apps und Project Fugu
  78. Q&A Das nächste Level für Cross-Platform-Apps Progressive Web Apps und

    Project Fugu
  79. 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! Summary Das nächste Level für Cross-Platform-Apps Progressive Web Apps und Project Fugu
  80. Thank you for your kind attention! Christian Liebel Steffen Jahr

    @christianliebel @steffenjahr christian.liebel@thinktecture.com steffen.jahr@thinktecture.com