SlideShare ist ein Scribd-Unternehmen logo
Turbo powered Web Apps
Am Anfang war HTML.
JCON 2021: Turbo powered Web Apps
JCON 2021: Turbo powered Web Apps
How it started: How it‘s going:
Komplexität
User Experience
Single Page
Application
Server Side
Application
New
Sweet
Spot
JCON 2021: Turbo powered Web Apps
# bescheidenes Java Script
Framework für Controller
# hybride mobile
Applications mit nativem
Code und Web Views
# Beschleunigt Seitenwechsel
und Formulare
# Aufteilung von Seiten in
Komponenten
# Dynamische Updates
Navigation
mit Turbo Drive
Navigation in klassischer Server Side Application
A
B
C
Page 1
Lorem iLorem ipsum dolor sit
amet, consetetur sadipscing elitr,
sed diam nonumy eirmod tempor
invidunt ut labore et dolore magn
1. HTML rendern
2. CSS (+ Schriften) verarbeiten
3. JavaScript verarbeiten und
JavaScript VM starten
A
B
C
Page 2
Lorem iLorem ipsum dolor sit
amet, consetetur sadipscing elitr,
sed diam nonumy eirmod tempor
invidunt ut labore et dolore magn
1. Scroll Position wird zurückgesetzt
2. ungespeicherte Änderungen
gehen verloren
1. HTML rendern
2. CSS (+ Schriften) verarbeiten
3. JavaScript verarbeiten und
JavaScript VM starten
A
B
C
Page 3
Lorem iLorem ipsum dolor sit
amet, consetetur sadipscing elitr,
sed diam nonumy eirmod tempor
invidunt ut labore et dolore magn
1. Scroll Position wird zurückgesetzt
2. ungespeicherte Änderungen
gehen verloren
1. HTML rendern
2. CSS (+ Schriften) verarbeiten
3. JavaScript verarbeiten und
JavaScript VM starten
<head>
<script src="//@hotwired/turbo@7.0.1/turbo.es5-umd.js"/>
</head>
Turbo einlegen
Navigation Server Side Application + Turbo
A
B
C
Page 1
Lorem iLorem ipsum dolor sit
amet, consetetur sadipscing elitr,
sed diam nonumy eirmod tempor
invidunt ut labore et dolore magn
1. HTML rendern
2. CSS (+ Schriften) verarbeiten
3. JavaScript verarbeiten und
JavaScript VM starten
A
B
C
Page 2
Lorem iLorem ipsum dolor sit
amet, consetetur sadipscing elitr,
sed diam nonumy eirmod tempor
invidunt ut labore et dolore magn
1. CSS und JavaScript mergen und
verarbeiten
2. HTML Body austauschen
1. ungespeicherte Änderungen
gehen verloren
Seite aus
Cache holen
A
B
C
Page 3
Lorem iLorem ipsum dolor sit
amet, consetetur sadipscing elitr,
sed diam nonumy eirmod tempor
invidunt ut labore et dolore magn
1. ungespeicherte Änderungen
gehen verloren
1. CSS und JavaScript mergen und
verarbeiten
2. HTML Body austauschen
Seite aus
Cache holen
DEMO
Turbo Navigation
http://localhost:3000/samples/turbo-drive_01/page1.html
Navigation mit Turbo Drive
# Turbo übernimmt alle Links und Formulare aus gleichem
Origin (auch Redirects)
# HTML Head wird gemergt, Body ersetzt
# Während Seite lädt wird Version aus Cache angezeigt
Seiten zerlegen
mit Turbo Frames
Von Seiten zu Turbo Frames
Turbo
Frame
Turbo
Frame
# Seite wird in Turbo Frames zerlegt die einzeln aktualisiert werden
# Links und Formular Eingaben beziehen sich nur auf Frame
Turbo Frame Request
<html>
<nav></nav>
<turbo-frame id="my_frame">
<h1>My Result Content</h1>
</turbo-frame>
</html>
<html>
<nav></nav>
<turbo-frame id="my_frame">
<h1>My Frame Content</h1>
<a href="result.html">A framed link</a>
</turbo-frame>
</html>
GET result.html
Turbo-Frame: my-frame
<html>
<nav></nav>
<turbo-frame id="my_frame">
<h1>My Result Content</h1>
</turbo-frame>
<div>more content ...</div>
</html>
Turbo Frame Request
GET result.html
Turbo-Frame: my-frame
<html>
<nav></nav>
<turbo-frame id="my_frame">
<h1>My Frame Content</h1>
<a href="result.html">A framed link</a>
</turbo-frame>
</html>
<html>
<nav></nav>
<turbo-frame id="my_frame">
<h1>My Result Content</h1>
</turbo-frame>
</html>
<turbo-frame id="my_frame">
<h1>My Result Content</h1>
</turbo-frame>
Aus Turbo Frame ausbrechen
<a href="result.html" data-turbo-frame="my_frame">Link to Frame</a>
<turbo-frame id="my_frame">
<form action="/submit" method="GET" >
<input type=text>My Input</h1>
<button type="submit">Submit</button>
<form>
</turbo-frame>
aktualisiert
Formular in Turbo Frame
<turbo-frame id="my_frame">
<form action="/submit" method="GET" >
<input type=text>My Input</h1>
<button type="submit">Submit</button>
<form>
</turbo-frame>
Lazy Turbo Frame
<turbo-frame id="my_frame" src="feed-frame">
<div class="spinner-border" role="status">
<span class="sr-only">Loading...</span>
</div>
</turbo-frame>
DEMO
Turbo Frames
http://localhost:3000/samples/turbo-frame_01/index.html
Seite zerlegen mit Turbo Frames
# Seite wird in Turbo Frames zerlegt die einzeln aktualisiert
werden
# Links und Formulare wirken nur innerhalb des Frames
# Frames können lazy geladen werden
Dynamische Updates
mit Turbo Streams
Formular mit Turbo Stream
<html>
<nav></nav>
<p>Thanks for your Input!</p>
</html>
<html>
<nav></nav>
<form action="/submit"
method="POST"
id="my_form">
<input type=text>My Input</h1>
<button type="submit">Submit</button>
</form>
</html>
POST result.html
Accept: text/vnd.turbo-stream.html
<turbo-stream action="replace" target="my_form">
<template>
<p>Thanks for your Input!</p>
</template>
</turbo-stream>
Formular mit Turbo Stream
<turbo-stream action="replace" target="my_form">
<template>
<p>Thanks for your Input!</p>
</template>
</turbo-stream>
Turbo Streams erlauben Aktionen
# append
# prepend
# replace
# update
# remove
Server Sent Events (SSE) per Turbo Stream
<script>
Turbo.connectStreamSource(
new EventSource("/events?stream=messages")
);
</script>
<div id="feed-frame">
<div class="task">Task 0</div>
</div>
<div id="feed-frame">
<div class="task">Task 1</div>
<div class="task">Task 0</div>
</div>
EventStream Id: 1
<turbo-stream action="prepend" target="feed-frame">
<template>
<div class="task">Task 1</div>
</template>
</turbo-stream>
Server Sent Events (SSE) per Web Socket
<script>
Turbo.connectStreamSource(
new WebSocket("ws://localhost:3000/ws")
);
</script>
<div target="feed-frame">
<div class="task">Task 0</div>
</div>
Push Data
<turbo-stream action="prepend" target="feed-frame">
<template>
<div class="task">Task 1</div>
</template>
</turbo-stream>
<div target="feed-frame">
<div class="task">Task 1</div>
<div class="task">Task 0</div>
</div>
DEMO
Turbo Streams
http://localhost:3000/task/new
Dynamische Updates mit Turbo
Streams
# mit Streams können feingranular Teile der Seite aktualisiert
werden
# eigener Turbo Accept Header gibt an ob Client Turbo Streams
akzeptiert
# Live Updates per Server Sent Events oder Web Sockets
Beispiel To-Do App
Turbo Drive
Navigation
Formular mit
Turbo Stream
Turbo Frame
DEMO
To-Do App
http://localhost:3000/
Turbo Drive
# SPA-Style Navigation
# Beschleunigt Seitenwechsel und Formulare
Turbo Frames
# Seite wird in Turbo Frames zerlegt die einzeln
aktualisiert werden
# Links und Formulare wirken innerhalb des Frames
Turbo Streams
# Feingranulare Updates von Teilen der Seiten
# Live Updates per Server Sent Events oder
WebSockets
Jan Stamer
Solution Architect
jan.stamer@comdirect.de
JCON 2021: Turbo powered Web Apps

Weitere ähnliche Inhalte

PPTX
Einführung in HTTP/2
PDF
Programmiertechniken
PPTX
CQRS in der Praxis - Newsletter Double-Opt-In
PDF
AdminCamp 14: Make your IBM Connections deployment your own - Customize it!
PDF
PrettyFaces: RESTful URLs für JSF
PDF
Wie Sie WordPress auf Joomla Migrieren?
ODP
Intro to scaling Databases
PDF
JAX 2025: Microservices lieben Azure Container Apps
Einführung in HTTP/2
Programmiertechniken
CQRS in der Praxis - Newsletter Double-Opt-In
AdminCamp 14: Make your IBM Connections deployment your own - Customize it!
PrettyFaces: RESTful URLs für JSF
Wie Sie WordPress auf Joomla Migrieren?
Intro to scaling Databases
JAX 2025: Microservices lieben Azure Container Apps

Mehr von Jan Stamer (15)

PDF
JAX 2025: Go Crashkurs mit praktischen Beispielen
PDF
W-JAX 2024: Go in der Praxis, für CLI und Web
PDF
W-JAX 2024: Serverless mit Go in der Cloud
PDF
JAX 2024: Go-über-den-Wolken und in der Cloud
PDF
JAX 2024: Go in der Praxis einsetzen
PDF
W-JAX 2023: Go über den Wolken
PDF
CloudLand 2023: Rock, Paper, Scissors Cloud Competition - Go vs. Java
PDF
entwickler.de 05/2023: Go über den Wolken
PDF
IT-Tage 2021: Java to Go - Google Go für Java-Entwickler
PDF
entwickler.de Go Day: Go Web Development 101
PDF
betterCode() Go: Einstieg in Go, Standard-Library und Ökosystem
PDF
DevOpsCon 2021: Go Web Development 101
PDF
JavaForum Nord 2021: Java to Go - Google Go für Java-Entwickler
PDF
Karlsruher Entwicklertag 2021: Turbo powered Web Apps
PDF
Jugs HH: Elefant unter Strom - von OldSQL über NoSQL zu NewSQL?
JAX 2025: Go Crashkurs mit praktischen Beispielen
W-JAX 2024: Go in der Praxis, für CLI und Web
W-JAX 2024: Serverless mit Go in der Cloud
JAX 2024: Go-über-den-Wolken und in der Cloud
JAX 2024: Go in der Praxis einsetzen
W-JAX 2023: Go über den Wolken
CloudLand 2023: Rock, Paper, Scissors Cloud Competition - Go vs. Java
entwickler.de 05/2023: Go über den Wolken
IT-Tage 2021: Java to Go - Google Go für Java-Entwickler
entwickler.de Go Day: Go Web Development 101
betterCode() Go: Einstieg in Go, Standard-Library und Ökosystem
DevOpsCon 2021: Go Web Development 101
JavaForum Nord 2021: Java to Go - Google Go für Java-Entwickler
Karlsruher Entwicklertag 2021: Turbo powered Web Apps
Jugs HH: Elefant unter Strom - von OldSQL über NoSQL zu NewSQL?
Anzeige

JCON 2021: Turbo powered Web Apps

  • 5. How it started: How it‘s going:
  • 8. # bescheidenes Java Script Framework für Controller # hybride mobile Applications mit nativem Code und Web Views # Beschleunigt Seitenwechsel und Formulare # Aufteilung von Seiten in Komponenten # Dynamische Updates
  • 10. Navigation in klassischer Server Side Application A B C Page 1 Lorem iLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magn 1. HTML rendern 2. CSS (+ Schriften) verarbeiten 3. JavaScript verarbeiten und JavaScript VM starten A B C Page 2 Lorem iLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magn 1. Scroll Position wird zurückgesetzt 2. ungespeicherte Änderungen gehen verloren 1. HTML rendern 2. CSS (+ Schriften) verarbeiten 3. JavaScript verarbeiten und JavaScript VM starten A B C Page 3 Lorem iLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magn 1. Scroll Position wird zurückgesetzt 2. ungespeicherte Änderungen gehen verloren 1. HTML rendern 2. CSS (+ Schriften) verarbeiten 3. JavaScript verarbeiten und JavaScript VM starten
  • 12. Navigation Server Side Application + Turbo A B C Page 1 Lorem iLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magn 1. HTML rendern 2. CSS (+ Schriften) verarbeiten 3. JavaScript verarbeiten und JavaScript VM starten A B C Page 2 Lorem iLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magn 1. CSS und JavaScript mergen und verarbeiten 2. HTML Body austauschen 1. ungespeicherte Änderungen gehen verloren Seite aus Cache holen A B C Page 3 Lorem iLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magn 1. ungespeicherte Änderungen gehen verloren 1. CSS und JavaScript mergen und verarbeiten 2. HTML Body austauschen Seite aus Cache holen
  • 14. Navigation mit Turbo Drive # Turbo übernimmt alle Links und Formulare aus gleichem Origin (auch Redirects) # HTML Head wird gemergt, Body ersetzt # Während Seite lädt wird Version aus Cache angezeigt
  • 16. Von Seiten zu Turbo Frames Turbo Frame Turbo Frame # Seite wird in Turbo Frames zerlegt die einzeln aktualisiert werden # Links und Formular Eingaben beziehen sich nur auf Frame
  • 17. Turbo Frame Request <html> <nav></nav> <turbo-frame id="my_frame"> <h1>My Result Content</h1> </turbo-frame> </html> <html> <nav></nav> <turbo-frame id="my_frame"> <h1>My Frame Content</h1> <a href="result.html">A framed link</a> </turbo-frame> </html> GET result.html Turbo-Frame: my-frame <html> <nav></nav> <turbo-frame id="my_frame"> <h1>My Result Content</h1> </turbo-frame> <div>more content ...</div> </html>
  • 18. Turbo Frame Request GET result.html Turbo-Frame: my-frame <html> <nav></nav> <turbo-frame id="my_frame"> <h1>My Frame Content</h1> <a href="result.html">A framed link</a> </turbo-frame> </html> <html> <nav></nav> <turbo-frame id="my_frame"> <h1>My Result Content</h1> </turbo-frame> </html> <turbo-frame id="my_frame"> <h1>My Result Content</h1> </turbo-frame>
  • 19. Aus Turbo Frame ausbrechen <a href="result.html" data-turbo-frame="my_frame">Link to Frame</a> <turbo-frame id="my_frame"> <form action="/submit" method="GET" > <input type=text>My Input</h1> <button type="submit">Submit</button> <form> </turbo-frame> aktualisiert
  • 20. Formular in Turbo Frame <turbo-frame id="my_frame"> <form action="/submit" method="GET" > <input type=text>My Input</h1> <button type="submit">Submit</button> <form> </turbo-frame>
  • 21. Lazy Turbo Frame <turbo-frame id="my_frame" src="feed-frame"> <div class="spinner-border" role="status"> <span class="sr-only">Loading...</span> </div> </turbo-frame>
  • 23. Seite zerlegen mit Turbo Frames # Seite wird in Turbo Frames zerlegt die einzeln aktualisiert werden # Links und Formulare wirken nur innerhalb des Frames # Frames können lazy geladen werden
  • 25. Formular mit Turbo Stream <html> <nav></nav> <p>Thanks for your Input!</p> </html> <html> <nav></nav> <form action="/submit" method="POST" id="my_form"> <input type=text>My Input</h1> <button type="submit">Submit</button> </form> </html> POST result.html Accept: text/vnd.turbo-stream.html <turbo-stream action="replace" target="my_form"> <template> <p>Thanks for your Input!</p> </template> </turbo-stream>
  • 26. Formular mit Turbo Stream <turbo-stream action="replace" target="my_form"> <template> <p>Thanks for your Input!</p> </template> </turbo-stream> Turbo Streams erlauben Aktionen # append # prepend # replace # update # remove
  • 27. Server Sent Events (SSE) per Turbo Stream <script> Turbo.connectStreamSource( new EventSource("/events?stream=messages") ); </script> <div id="feed-frame"> <div class="task">Task 0</div> </div> <div id="feed-frame"> <div class="task">Task 1</div> <div class="task">Task 0</div> </div> EventStream Id: 1 <turbo-stream action="prepend" target="feed-frame"> <template> <div class="task">Task 1</div> </template> </turbo-stream>
  • 28. Server Sent Events (SSE) per Web Socket <script> Turbo.connectStreamSource( new WebSocket("ws://localhost:3000/ws") ); </script> <div target="feed-frame"> <div class="task">Task 0</div> </div> Push Data <turbo-stream action="prepend" target="feed-frame"> <template> <div class="task">Task 1</div> </template> </turbo-stream> <div target="feed-frame"> <div class="task">Task 1</div> <div class="task">Task 0</div> </div>
  • 30. Dynamische Updates mit Turbo Streams # mit Streams können feingranular Teile der Seite aktualisiert werden # eigener Turbo Accept Header gibt an ob Client Turbo Streams akzeptiert # Live Updates per Server Sent Events oder Web Sockets
  • 34. Turbo Drive # SPA-Style Navigation # Beschleunigt Seitenwechsel und Formulare Turbo Frames # Seite wird in Turbo Frames zerlegt die einzeln aktualisiert werden # Links und Formulare wirken innerhalb des Frames Turbo Streams # Feingranulare Updates von Teilen der Seiten # Live Updates per Server Sent Events oder WebSockets