SlideShare a Scribd company logo
Un-Framework
Delivering Dynamic Experiences with HTML over the Wire
Andreas Nedbal / T3DD23
About Me
Andreas Nedbal
Senior Frontend Developer @ in2code
TYPO3 Core Merger: Backend UX
TYPO3camp Munich Organizer
<template>
<ul id="entries">
<li v-for="item in items">
{{ item }}
</li>
</ul>
<button @click="fetchNextPage">Next Page</button>
</template>
<script>
const items = ref([])
function fetchNextPage() {
fetch('/endpoint').then((res) => {
items.value = items.value.concat(res.body)
})
}
</script>
function fetchNextPage() {
fetch('/endpoint').then(res => {
$('#entries').append(res.html);
})
}
<a href="/endpoint?page=2">Next Page</a>
Frontend is hard
Node
Toolchains
Which npm packages do I need?
All those frameworks
Vite
Webpack
Rollup
React Vue
Svelte
Which are safe?
Which Node version do I need?
Switching versions for projects
Un-Framework - Delivering Dynamic Experiences with HTML over the Wire
Un-Framework - Delivering Dynamic Experiences with HTML over the Wire
Un-Framework - Delivering Dynamic Experiences with HTML over the Wire
Turbo Drive
Previously known as “Turbolinks” in the Rails world.
Turns a page into an “SPA” by replacing all regular page loads with AJAX.
Previous pages are cached, so perceived performance is way faster.
Turbo Frames
Turbo Frames allow pages to be decomposed into smaller components that
capture form actions and navigation.
Navigating inside a <turbo-frame id=”idName”> will check the target
response for a matching <turbo-frame> tag and only replace it’s contents with
the current tag present.
Turbo Streams
Actually meant for streaming over websockets, you can also use this as
responses from any web request.
Turbo will listen to responses using the text/vnd.turbo-stream.html
content-type and execute actions based on <turbo-stream> tags present.
Demonstration
Problems with the Turbo approach
Porting an existing site using a lot of JS already is not recommended.
Pages using Turbo don’t fire the load event anymore (or well, only once) since
page navigation is happening over AJAX.
This requires massive refactoring/rethinking of an application.
Un-Framework - Delivering Dynamic Experiences with HTML over the Wire
Controllers
Classes that contain functionality for sites using actions, targets and values in
HTML.
Controllers don’t require event listeners to be initialized, this happens
automatically as soon as a matching data-controller attribute is found on the
page or even asynchronously loaded.
<div data-controller="hello">
<input data-hello-target="name" type="text">
<button data-action="click->hello#greet">
Greet
</button>
<span data-hello-target="output">
</span>
</div>
import { Controller } from "stimulus"
export default class extends Controller {
static targets = [ "name", "output" ]
greet() {
this.outputTarget.textContent =
`Hello, ${this.nameTarget.value}!`
}
}
Actions
Allow to call controller methods from HTML using data-action attributes.
Example:
<button data-action=”click->example#action”>
Would call the action() method on ExampleController on a button click.
The default interaction of an element can also be omitted, so the above can be
shortened to:
<button data-action=”example#action”>
<div data-controller="hello">
<input data-hello-target="name" type="text">
<button data-action="click->hello#greet">
Greet
</button>
<span data-hello-target="output">
</span>
</div>
import { Controller } from "stimulus"
export default class extends Controller {
static targets = [ "name", "output" ]
greet() {
this.outputTarget.textContent =
`Hello, ${this.nameTarget.value}!`
}
}
Targets
Allow to define targets via HTML that can be accessed inside controllers as an
alternative to selecting them via queries.
The names of targets need to be defined in a static array in the controller.
Example:
<div data-controller=”test” data-test-target=”root”>
The element would be accessible as this.rootTarget in the controller class.
<div data-controller="hello">
<input data-hello-target="name" type="text">
<button data-action="click->hello#greet">
Greet
</button>
<span data-hello-target="output">
</span>
</div>
import { Controller } from "stimulus"
export default class extends Controller {
static targets = [ "name", "output" ]
greet() {
this.outputTarget.textContent =
`Hello, ${this.nameTarget.value}!`
}
}
Values
Allow to specify values in HTML that can be used inside controllers using the
specified value name.
The names of values need to be defined in a static array in the controller.
Example:
<div data-controller=”test” data-test-example-value=”Hello World”>
this.exampleValue would resolve to “Hello World” in TestController.
Demonstration
Who is using Hotwire?
Integrations
Rails
Turbo Rails
bundle install turbo-rails
Laravel
Turbo Laravel
composer require hotwired/turbo-laravel
Symfony
Symfony UX Turbo
composer require symfony/ux-turbo
TYPO3
TYPO3 Extension “Topwire”
Find out more about it right at the next talk in Room IONOS
Past, Present and Future of creating server side rendered interactive websites
with TYPO3
by Helmut Hummel
Questions?
Thanks for listening!
Hope you enjoyed this talk :)
Feedback? Want to chat?
Fediverse (Mastodon/…):
@pixel@desu.social
Twitter:
@pixeldesu
TYPO3 Slack:
@pixeldesu

More Related Content

PPSX
Ένα δώρο για τον καθένα
PPTX
πώς λέμε οχι (2)
PDF
HTML5 New and Improved
PDF
Pengenalan AngularJS
PDF
Паразитируем на React-экосистеме (Angular 4+) / Алексей Охрименко (IPONWEB)
PPTX
Client Web
PDF
The Browser Environment - A Systems Programmer's Perspective [sinatra edition]
PDF
Server side rendering with React and Symfony
Ένα δώρο για τον καθένα
πώς λέμε οχι (2)
HTML5 New and Improved
Pengenalan AngularJS
Паразитируем на React-экосистеме (Angular 4+) / Алексей Охрименко (IPONWEB)
Client Web
The Browser Environment - A Systems Programmer's Perspective [sinatra edition]
Server side rendering with React and Symfony

Similar to Un-Framework - Delivering Dynamic Experiences with HTML over the Wire (20)

PDF
Web components with Angular
PPTX
practical9.pptx
PDF
PrimeNG - Components para la Vida Real
PDF
Web 5 | JavaScript Events
PDF
Hidden Docs in Angular
PDF
JSLab. Алексей Волков. "React на практике"
PDF
Technical Preview: The New Shopware Admin
PPTX
Introducing Wire for Drupal, the Livewire concepts adapted to work with Drupal
PDF
Devoxx 2014-webComponents
PDF
Polymer - pleasant client-side programming with web components
PDF
Building a js widget
PDF
Capstone ms2
PPTX
Introduction to React and MobX
PDF
Vaadin Components @ Angular U
PDF
Mobile Software Engineering Crash Course - C06 WindowsPhone
PPTX
An introduction to Vue.js
PDF
ANGULARJS.pdf
PPTX
Javascript 1
PDF
Backbone - TDC 2011 Floripa
PPTX
Academy PRO: React native - building first scenes
Web components with Angular
practical9.pptx
PrimeNG - Components para la Vida Real
Web 5 | JavaScript Events
Hidden Docs in Angular
JSLab. Алексей Волков. "React на практике"
Technical Preview: The New Shopware Admin
Introducing Wire for Drupal, the Livewire concepts adapted to work with Drupal
Devoxx 2014-webComponents
Polymer - pleasant client-side programming with web components
Building a js widget
Capstone ms2
Introduction to React and MobX
Vaadin Components @ Angular U
Mobile Software Engineering Crash Course - C06 WindowsPhone
An introduction to Vue.js
ANGULARJS.pdf
Javascript 1
Backbone - TDC 2011 Floripa
Academy PRO: React native - building first scenes
Ad

Recently uploaded (20)

PPTX
L1 - Introduction to python Backend.pptx
PPTX
Reimagine Home Health with the Power of Agentic AI​
PPTX
VVF-Customer-Presentation2025-Ver1.9.pptx
PDF
PTS Company Brochure 2025 (1).pdf.......
PPTX
Operating system designcfffgfgggggggvggggggggg
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
PPTX
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
PDF
wealthsignaloriginal-com-DS-text-... (1).pdf
PDF
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
PDF
medical staffing services at VALiNTRY
PDF
2025 Textile ERP Trends: SAP, Odoo & Oracle
PDF
Understanding Forklifts - TECH EHS Solution
PPTX
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
PDF
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
PDF
top salesforce developer skills in 2025.pdf
PDF
Odoo Companies in India – Driving Business Transformation.pdf
PDF
Design an Analysis of Algorithms I-SECS-1021-03
PPTX
Transform Your Business with a Software ERP System
PDF
Design an Analysis of Algorithms II-SECS-1021-03
PDF
System and Network Administration Chapter 2
L1 - Introduction to python Backend.pptx
Reimagine Home Health with the Power of Agentic AI​
VVF-Customer-Presentation2025-Ver1.9.pptx
PTS Company Brochure 2025 (1).pdf.......
Operating system designcfffgfgggggggvggggggggg
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
wealthsignaloriginal-com-DS-text-... (1).pdf
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
medical staffing services at VALiNTRY
2025 Textile ERP Trends: SAP, Odoo & Oracle
Understanding Forklifts - TECH EHS Solution
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
top salesforce developer skills in 2025.pdf
Odoo Companies in India – Driving Business Transformation.pdf
Design an Analysis of Algorithms I-SECS-1021-03
Transform Your Business with a Software ERP System
Design an Analysis of Algorithms II-SECS-1021-03
System and Network Administration Chapter 2
Ad

Un-Framework - Delivering Dynamic Experiences with HTML over the Wire

  • 1. Un-Framework Delivering Dynamic Experiences with HTML over the Wire Andreas Nedbal / T3DD23
  • 2. About Me Andreas Nedbal Senior Frontend Developer @ in2code TYPO3 Core Merger: Backend UX TYPO3camp Munich Organizer
  • 3. <template> <ul id="entries"> <li v-for="item in items"> {{ item }} </li> </ul> <button @click="fetchNextPage">Next Page</button> </template> <script> const items = ref([]) function fetchNextPage() { fetch('/endpoint').then((res) => { items.value = items.value.concat(res.body) }) } </script>
  • 4. function fetchNextPage() { fetch('/endpoint').then(res => { $('#entries').append(res.html); }) }
  • 6. Frontend is hard Node Toolchains Which npm packages do I need? All those frameworks Vite Webpack Rollup React Vue Svelte Which are safe? Which Node version do I need? Switching versions for projects
  • 10. Turbo Drive Previously known as “Turbolinks” in the Rails world. Turns a page into an “SPA” by replacing all regular page loads with AJAX. Previous pages are cached, so perceived performance is way faster.
  • 11. Turbo Frames Turbo Frames allow pages to be decomposed into smaller components that capture form actions and navigation. Navigating inside a <turbo-frame id=”idName”> will check the target response for a matching <turbo-frame> tag and only replace it’s contents with the current tag present.
  • 12. Turbo Streams Actually meant for streaming over websockets, you can also use this as responses from any web request. Turbo will listen to responses using the text/vnd.turbo-stream.html content-type and execute actions based on <turbo-stream> tags present.
  • 14. Problems with the Turbo approach Porting an existing site using a lot of JS already is not recommended. Pages using Turbo don’t fire the load event anymore (or well, only once) since page navigation is happening over AJAX. This requires massive refactoring/rethinking of an application.
  • 16. Controllers Classes that contain functionality for sites using actions, targets and values in HTML. Controllers don’t require event listeners to be initialized, this happens automatically as soon as a matching data-controller attribute is found on the page or even asynchronously loaded.
  • 17. <div data-controller="hello"> <input data-hello-target="name" type="text"> <button data-action="click->hello#greet"> Greet </button> <span data-hello-target="output"> </span> </div>
  • 18. import { Controller } from "stimulus" export default class extends Controller { static targets = [ "name", "output" ] greet() { this.outputTarget.textContent = `Hello, ${this.nameTarget.value}!` } }
  • 19. Actions Allow to call controller methods from HTML using data-action attributes. Example: <button data-action=”click->example#action”> Would call the action() method on ExampleController on a button click. The default interaction of an element can also be omitted, so the above can be shortened to: <button data-action=”example#action”>
  • 20. <div data-controller="hello"> <input data-hello-target="name" type="text"> <button data-action="click->hello#greet"> Greet </button> <span data-hello-target="output"> </span> </div>
  • 21. import { Controller } from "stimulus" export default class extends Controller { static targets = [ "name", "output" ] greet() { this.outputTarget.textContent = `Hello, ${this.nameTarget.value}!` } }
  • 22. Targets Allow to define targets via HTML that can be accessed inside controllers as an alternative to selecting them via queries. The names of targets need to be defined in a static array in the controller. Example: <div data-controller=”test” data-test-target=”root”> The element would be accessible as this.rootTarget in the controller class.
  • 23. <div data-controller="hello"> <input data-hello-target="name" type="text"> <button data-action="click->hello#greet"> Greet </button> <span data-hello-target="output"> </span> </div>
  • 24. import { Controller } from "stimulus" export default class extends Controller { static targets = [ "name", "output" ] greet() { this.outputTarget.textContent = `Hello, ${this.nameTarget.value}!` } }
  • 25. Values Allow to specify values in HTML that can be used inside controllers using the specified value name. The names of values need to be defined in a static array in the controller. Example: <div data-controller=”test” data-test-example-value=”Hello World”> this.exampleValue would resolve to “Hello World” in TestController.
  • 27. Who is using Hotwire?
  • 30. Laravel Turbo Laravel composer require hotwired/turbo-laravel
  • 31. Symfony Symfony UX Turbo composer require symfony/ux-turbo
  • 32. TYPO3 TYPO3 Extension “Topwire” Find out more about it right at the next talk in Room IONOS Past, Present and Future of creating server side rendered interactive websites with TYPO3 by Helmut Hummel
  • 34. Thanks for listening! Hope you enjoyed this talk :) Feedback? Want to chat? Fediverse (Mastodon/…): @pixel@desu.social Twitter: @pixeldesu TYPO3 Slack: @pixeldesu