Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten...

36
Oliver Zeigermann, Stefan Toth – embarc GmbH Flux – Facebooks Beitrag zur UI- Architektur der Zukunft

Transcript of Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten...

Page 1: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Oliver Zeigermann, Stefan Toth – embarc GmbH

Flux – Facebooks Beitrag zur UI-Architektur der Zukunft

Page 2: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

UI-Architektur – Warum?

§  User Experience wird wichtiger

§  Rich Client Optionen werden rar

§  Es gibt mehrere Philosophien für UIs im Browser

§  Es gibt eine Vielzahl an Frameworks und Optionen

§  Nachvollziehbarkeit und Komplexität ist oft ein Problem

Page 3: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Die klassische Webanwendung

HTML5 Unobstrusive JavaScript

HTTP

UI-Verhalten HTML Rendering evtl. Anwendungszustand

Page 4: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Die klassische Webanwendung

Häufig genannte Vorteile: §  „So funktioniert das Web“ §  Langlebige und stabile Technologien

Häufige Probleme: §  Abbildung von dynamischem Verhalten §  Verteilter Zustand

Page 5: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Single-Page Applications (SPA)

HTML5 (Typed) JavaScript UI-Verhalten HTML Rendering Anwendungszustand Webservices / JSON

Page 6: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Single-Page Applications (SPA)

HTML5 (Typed) JavaScript UI-Verhalten HTML Rendering Anwendungszustand Webservices / JSON

Page 7: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Single-Page Applications (SPA)

Häufig genannte Vorteile: §  Zustand und UI-Logik an einer Stelle §  Dynamik ... Siehe Nachteile klassische Webapps

Häufige Probleme: §  Mehr JavaScript-Code: Wartbarkeit/Überblick leidet §  JavaScript Frameworks sind kurzlebig

Page 8: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Unidirektionale UI-Architekturen

§  Klarer Datenfluss im UI §  Klare Abbildung von Zustand §  Entkopplung von Anzeigefameworks §  Entkopplung von Server-Seite (Service-Struktur) §  Vertreter:

–  Model-View-Update („Elm Architektur“) –  Model-View-Intent (Cycle.js) –  Om / Om Next (ClojureScript) –  Flux (Architekturidee) –  Redux (Framework abgeleitet von Flux)

Page 9: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Ebene von Unidirektionalen UIs

Page 10: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Flux §  Ein Architektur-Pattern für unidirektionale UIs §  Entstanden bei Facebook §  Bricht mit gängigen Mustern auf UI-Ebene

Page 11: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Flux Einsatz §  Web, Desktop und mobile Apps möglich

Hier beschränken wir uns auf Web-Anwendungen

Page 12: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

MVC: Ist das nicht gut genug?

Page 13: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Schwer zu verstehen: wo ist was?

Page 14: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Probleme von MVC-Anwendungen

§  Datenfluss über Listener schwer nachzuvollziehen

§  Zustand ist über viele Modelle verteilt

§  Sogar UI hält temporär Zustand

§  Was ist eigentlich ein Controller? –  Da tut man alles rein, was weder View noch Modell ist

Page 15: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Flux am Beispiel von Redux

Page 16: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Flux/Redux-Konzepte

§  Klare Aufteilung der Anwendung §  Kontrollfluss in eine Richtung §  Zentrale Verwaltung des Zustands

Page 17: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Actions und Action-Creators

§  Actions – Nachrichten, enthalten Typ und Nutzlast

§  Action-Creators – Erzeugen Actions –  können Geschäftslogik enthalten – Machen Server Calls

Page 18: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Store und Reducers §  Store

– Hält zentralen, strukturierten Zustand – Verteilt Actions an Reducer – Aktualisiert UI, wenn Zustand verändert

§  Reducer –  (Alter Zustand, Action) => Neuer Zustand – Keine Seiteneffekte – Mehrere Reducer

Page 19: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

UI-Komponenten

§  Controller-Views: – Rufen Action-Creators auf – Bekommen Zustand vom Store – Reichen Zustand und Callbacks an Child-

Views weiter §  Child-Views:

– Reine Darstellung – Aufruf der Callback der Controller-Views

Page 20: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Wozu ist das gut?

§  Aufteilung: Es ist immer klar was wo hin soll, beim Erstellen und Analysieren

§  Kontrollfluss: Dynamische Abhängigkeiten folgen den immer gleichen Mustern –  einfach zu verstehen –  einfach zu debuggen

Page 21: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Zentrale Verwaltung des Zustands

§  Große Teile der Anwendung als reine Funktionen implementiert

§  Seiteneffekte nur in bestimmten Teilen der Anwendung

§  Hot-Reload und Time-Traveling Debugger

Page 22: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Async Aktionen und Seiteneffekte

Page 23: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Live-Demo 1: Eine einfache Redux

Anwendung

Page 24: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Universal Apps

§  Clientseitiges Rendering erlaubt beste Benutzbarkeit und Offline-Fähigkeit

§  Seversertiges Rendering erlaubt SEO und schnelle First-Page-Impression

§  Universal Apps kombinieren beides –  rendern den ersten Request auf der Server-

Seite –  alles weitere passiert im Browser

Page 25: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Universal Apps mit Redux §  Probleme

– Zustand vom Server zum Client – Serverseitig müssen alle Daten vor dem ersten

Rendering vorliegen §  Redux

– Zustand liegt zentral vor, wird mit Seite übertragen

–  Initialer Zustand kann unabhängig vom Rendering ermittelt werden

Page 26: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Eine komplexe Anwendung

Page 27: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Live-Demo 2: Universal App mit

Redux

Page 28: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Daten getriebene Anwendung

§  In realen Applikationen brauchen Komponenten Daten vom Server

§  In Standard-Flux rufen Komponenten Action-Creators auf, um diese über eine REST-Schnittstelle zu laden

Page 29: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Probleme

§  REST-Schnittstelle – Potentiell viele Requests für eine einzige Anzeige – Wie fasst man mehrere Datenänderungen in

einem Commit zusammen? §  Use-Case getriebener Webservice

– Enge Kopplung zwischen "Client und Server "(Granularität, Daten)

Page 30: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Relay und GraphQL

§  Komplementär zu Flux §  Relay:

– deklarative Angabe "welche Daten eine "Komponente braucht

§  Abfrage-Sprache: GraphQL §  Relay holt in einer Abfrage genau die nötigen Daten §  Danach wird die Komponente mit den geholten

Daten automatisch aktualisiert

Page 31: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Anfrage

{

Choice { id,

title, count

}

}

Antwort

{

"Choice": { "id": "choice_1",

"title": "How’s your day?", "count": 2

}

}

Beispiel: Relay/GraphQL

Page 32: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Falcor (Netflix)

§  Komplementär zu Flux §  Alternativ zu Relay + GraphQL §  Abstrahiert den Zugriff auf Daten über

Modelle §  Zugriff auf einen Wert über einen Pfad §  Werte werden über Promises geliefert

Page 33: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Wozu Falcor?

§  Ob, wann und wie Daten vom Server geholt werde, ist in Falcor abstrahiert

§  Batches und Dubletten-Löschung möglich – Server implementiert einen Endpunkt – Alle Daten werden als JSON Graph

übertragen

Page 34: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

Code

model.get("greeting“).then(res => ...);

Anfrage

http://localhost:3000/model.json?paths=[[greeting]]&method=get

Antwort

{"jsonGraph":{"greeting":"Hello World"}}

Beispiel: Falcor

Page 35: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

The Doctor is In Daten Anforderungen Funktionale

Programmierung A-Z

40 Kann ich Daten im Browser bei Absturz retten?

Kann ich Flux in meiner Java-Desktop-Anwendung nutzen?

Muss man mit Performance-Einbußen rechnen?

Sind die Ideen von Flux brandneu oder geklaut?

60 Was verliere ich durch den Einsatz von Relay/Falcor?

Wie migriere ich meine MVC/MVP-Anwendung?

Sind Stores nicht MVC Models?

Welche Anzeige-frameworks passen am Besten zu Flux?

80 Was ist besser? Falcor oder Relay?

Ist eine UI-Ablösung durch Flux einfacher oder billiger?

Zentraler Zustand? Ist das noch OO?

Gibt es Alternativen zu JavaScript?

100 Wie kann man trotz Asynchronität Konsistenz garantieren?

Wann passt eine klassische WebApp besser als Flux?

Was ist fix, was ist eine Design-Entscheidung in Flux?

Gibt es DAS Flux? Wieso so viele Implementierungen?

Page 36: Flux - embarcRelay und GraphQL Komplementär zu Flux Relay: – deklarative Angabe "welche Daten eine "Komponente braucht Abfrage-Sprache: GraphQL Relay holt in einer Abfrage genau

[email protected] [email protected] @djcordhose @st_toth

Vielen Dank.

DOWNLOAD FOLIEN: http://www.embarc.de/blog/