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

Architekturoptionen für moderne Web-Frontends

Architekturoptionen für moderne Web-Frontends

Eine moderne Web-Anwendung wird selbstverständlich in JavaScript implementiert, erzeugt ihr HTML clientseitig im Browser selbst und kommuniziert mit dem Server nur, um über ein HTTP/REST-API Daten im JSON-Format abzuholen – das, so scheint es, ist die gängige Weisheit. Aber haben die bewährten Ansätze wie serverseitiges HTML und „Progressive Enhancement“ tatsächlich ausgedient?

In diesem Talk möchten wir darüber diskutieren, welche unterschiedlichen Stile von Web-Anwendungen es gibt, welche Vor- und Nachteile diese haben und wieso teilweise als altmodisch angesehene Ansätze für viele Anwendungen eine gute Wahl sind.

Stefan Tilkov

May 26, 2020
Tweet

More Decks by Stefan Tilkov

Other Decks in Technology

Transcript

  1. Architectures for Modern Web Front Ends 2 0 2 0

    / 0 5 / 2 6 J U G S w i t z e r l a n d Stefan Tilkov @stilkov Lucas Dohmen @moonbeamlabs
  2. 1) in the SOAP/WSDL sense “Web app”2) 2) built as

    a careless SPA “Web service”1) > Uses HTTP as transport > Ignores HTTP verbs > Ignores URIs > Exposes single “endpoint” > Fails to embrace the Web > Uses browser as runtime > Ignores forward, back, refresh > Does not support linking > Exposes monolithic “app” > Fails to embrace the browser
  3. The web-native way of distributing logic Process Flow Presentation Domain

    Logic Data Server Client > Rendering, layout, styling on an unknown client > Logic & state machine on server > Client user-agent extensible via code on demand
  4. HTML & Hypermedia • In REST, servers expose a hypermedia

    format • Option 1: Just invent your own JSON-based, incomplete clone • Option 2: Just use HTML • Clients need to be RESTful, too • Option 1: Invent your own, JS-based, buggy, incomplete implementation • Option 2: Use the browser
  5. A great REST hypermedia API is very similar to a

    simple, server-sided rendered web application
  6. Why Routing? Solution: Store some app state in the URI!

    Bookmarks? Deep links? Reload? Browser Server GET / 200 OK… GET /app.js 200 OK… App start…
  7. State Business Logic Routing Rendering Logic Look & Presentation Logic

    Server Client JSON JSON API JSON Client Rendering Logic Routing HTML
  8. State Business Logic Routing Rendering Logic Look & Presentation Logic

    Server Client JSON JSON API JSON Client Rendering Logic Routing HTML Same Code
  9. “All your users are non-JS users while they‘re downloading your

    JS” Jake Archibald, developer advocate for Google Chrome
  10. Prerendering Browser Server GET / Static HTML Snapshot API run

    App AJAX Fun… FCP TTI load & run App AJAX Fun…
  11. Hydration How to simulate readiness? What about Events (Clicks etc)?

    How to match server-side HTML to client-side DOM? Browser GET / Static HTML Snapsho FCP TTI load & run App
  12. State Business Logic Routing Rendering Logic Look & Presentation Logic

    Server Client JSON JSON API JSON Client (Pre-)Rendering Logic Routing HTML
  13. State Business Logic Routing Rendering Logic Look & Presentation Logic

    Server Client JSON JSON API JSON Client (Pre-)Rendering Logic Routing HTML Hydration
  14. JSON API Routing Rendering Logic Look & Presentation Logic Server

    Client JSON JSON Client (Pre-)Rendering Logic Routing HTML Hydration Business Logic State Business Logic Same functionality, different languages! State
  15. State Business Logic JSON API Business Logic State Routing Rendering

    Logic Look & Presentation Logic Server Client JSON JSON Client (Pre-)Rendering Logic Routing HTML Hydration high control, high observability low control, low observability
  16. State Routing Rendering Logic Look & Presentation Logic Server Client

    JSON JSON Client (Pre-)Rendering Logic Routing HTML Hydration Business Logic JSON API State Business Logic Much, much more client side JavaScript
  17. 37 Resilience customElement.define( "my-element", MyElement ); Modern API in JS

    Modern API in CSS .item { display: contents; } Firefox 63: It works Firefox 63: It works Chrome 69: Exception Chrome 69: Skips that line
  18. “JavaScript is the most expensive part of your page” Addy

    Osmani, Speed team lead for Google Chrome
  19. Cost of JavaScript on Reddit.com Pixel 3 Moto G4 Alcatel

    2X 5059D 0 seconds 1 second 2 seconds Main thread Worker thread The cost of JavaScript in 2019
  20. RAGE CLICKS “15% of users tried to interact sometime between

    onload and interactive.” Akamai: Metrics That Matter RAGE CLICKS
  21. • Client-side state handling • Better offline support • Closer

    to desktop model • Better performance • Server-side state handling • Simpler • More resilient & observable • Smaller client footprint • Better performance
  22. State Business Logic Routing Rendering Logic Look & Presentation Logic

    Server Client HTML Rendering Logic Look & Presentation Logic JSON/ HTML
  23. Pure SPA SSR+RC Pure SSR • Large number of users

    • Basic UX needs • Support for past, present and future devices • Complex global client state • Offline support • Controlled device landscape • Like SSR, but with • more UX needs • Complex component state • Basic offline support
  24. Krischerstr. 100 40789 Monheim am Rhein Germany +49 2173 3366-0

    Ohlauer Str. 43 10999 Berlin Germany +49 2173 3366-0 Ludwigstr. 180E 63067 Offenbach Germany +49 2173 3366-0 Kreuzstr. 16 80331 München Germany +49 2173 3366-0 Hermannstrasse 13 20095 Hamburg Germany +49 2173 3366-0 Gewerbestr. 11 CH-6330 Cham Switzerland +41 41 743 0116 innoQ Deutschland GmbH innoQ Schweiz GmbH www.innoq.com 50 Thanks! Questions? Stefan Tilkov [email protected] +49 170 4712625 stilkov Lucas Dohmen [email protected] +49 151 75062496 moonbeamlabs