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!

Christian Liebel

February 19, 2021
Tweet

More Decks by Christian Liebel

Other Decks in Programming

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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  14. Canvas
    Add a canvas element to app.component.html (line 5):

    Query the canvas element in app.component.ts (line 10):
    @ViewChild('canvas') canvas: ElementRef;
    context: CanvasRenderingContext2D;
    Paint
    EX #1
    Das nächste Level für Cross-Platform-Apps
    Progressive Web Apps und Project Fugu

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  20. Pointer Events
    Add event listeners (app.component.html and app.component.ts):
    (pointerdown)="onPointerDown($event)"
    (pointermove)="onPointerMove(canvas, $event)"
    (pointerup)="onPointerUp()">
    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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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:

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

    View full-size slide

  24. Color Selection
    1. In app.component.html, add the following input to the node:

    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

    View full-size slide

  25. Paint PWA
    Capabilitie
    s
    Progressive
    Enhanceme
    nt
    Agenda
    Das nächste Level für Cross-Platform-Apps
    Progressive Web Apps und Project Fugu

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  43. Service Worker Debugging
    PWA
    Das nächste Level für Cross-Platform-Apps
    Progressive Web Apps und Project Fugu

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  55. File System Access API
    1. Add the following buttons to the bar in app.component.html (before the color
    input):
    Open
    Save
    Copy
    Paste
    Share
    Capabilities
    EX #11
    Das nächste Level für Cross-Platform-Apps
    Progressive Web Apps und Project Fugu

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  68. Paint PWA
    Capabilitie
    s
    Progressive
    Enhanceme
    nt
    Agenda
    Das nächste Level für Cross-Platform-Apps
    Progressive Web Apps und Project Fugu

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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.:
    Copy
    Progressive Enhancement
    EX #17
    Das nächste Level für Cross-Platform-Apps
    Progressive Web Apps und Project Fugu

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  80. Thank you
    for your kind attention!
    Christian Liebel Steffen Jahr
    @christianliebel @steffenjahr
    [email protected] [email protected]

    View full-size slide