Die Entwicklung moderner Webanwendungen stellt Entwickler vor zahlreiche Herausforderungen, insbesondere wenn es um die Kombination bewährter Back-End-Technologien mit dynamischen Front-End-Frameworks geht. Ein aktueller Trend ist die Nutzung von Inertia.js zusammen mit Ruby on Rails, um Single-Page-Application-ähnliche Erlebnisse zu schaffen, ohne auf den Full-Stack-Framework-Charakter von Rails verzichten zu müssen. Besonders spannend ist dabei die serverseitige Darstellung der Applikation (Server-Side Rendering, SSR), welche sowohl die Performance als auch die SEO-Freundlichkeit erheblich verbessern kann. Die Kombination aus Inertia.
js, React, TypeScript, Tailwind CSS und ShadcnUI bietet eine moderne, produktive Basis, die Rails-Entwickler nutzen können, um ansprechende und schnelle User-Interfaces zu erstellen. Dieser Leitfaden stellt die erprobten Schritte und Erkenntnisse vor, die in einer intensiven Entwicklungswoche gesammelt wurden, um den Einstieg in dieses Setup für Rails-Entwickler erheblich zu erleichtern. Die Herausforderung bei der Nutzung von Rails mit modernen Front-End-Frameworks beginnt oft bei der Gestaltung der UI-Komponenten und der Handhabung von CSS. Während früher Bootstrap und umfassende Themes den Bedarf deckten, hat sich die Front-End-Landschaft mit der Verbreitung von Tailwind CSS stark verändert. Tailwind CSS setzt auf Utility-First und erlaubt dadurch eine schnelle, flexible und wartbare Gestaltung von Oberflächen.
ShadcnUI, eine auf Tailwind optimierte UI-Bibliothek, bietet vorgefertigte Komponenten, die in React und TypeScript erstellt werden. Diese Kombination vermeidet viel händische Arbeit und sorgt für konsistente Designs. Allerdings kollidiert die Verwendung rein auf React basierender Komponenten mit der von Rails bevorzugten Hotwire-Methode, die das sogenannte HTML-over-the-wire-Prinzip verfolgt. Das heißt, Hotwire strebt danach, so viel wie möglich serverseitig zu rendern und nur minimale JavaScript-Interaktionen im Client zu verwenden. React-Komponenten, gerade wenn sie durch Tools wie v0.
dev generiert werden, sind ein komplett anderer Ansatz, da sie primär im Browser gerendert werden und wesentlich mehr Client-Side-Logik benötigen. Diese Diskrepanz führt zu einer fragmentierten Entwicklungswelt, in der man zwischen zwei mentalen Paradigmen jonglieren muss. Genau an diesem Punkt setzt Inertia.js mit SSR-Unterstützung an, indem es Rails als API-Backend nutzt und React-Komponenten serverseitig rendert, bevor sie an den Client ausgeliefert werden. Der Einsatz von Inertia.
js erlaubt somit, das Beste aus beiden Welten zu vereinen: die ausgereifte Backend-Logik und das Routing von Rails sowie moderne React-basierte UI-Komponenten. Die Integration mit TypeScript steigert zusätzlich die Codequalität und Wartbarkeit der Front-End-Komponenten erheblich. Dabei kann Tailwind CSS dank Integration in Vite als schneller Build-Prozess nahtlos verwendet werden. Vite übernimmt nicht nur das schnelle Kompilieren und Entwickeln, sondern sorgt dank serverseitigem Rendering auch dafür, dass der initiale Seitenaufbau schnell und SEO-freundlich bleibt. Ein wichtiger Punkt beim Setup ist die einheitliche Konfiguration der TypeScript-Projekte.
Um ShadcnUI reibungslos nutzen zu können, sind Anpassungen an tsconfig.app.json und tsconfig.json nötig. Diese Konfiguration erlaubt den modularen Import von Komponenten und das Auflösen der Pfade, um das Arbeiten mit dem Front-End Code zu vereinfachen.
Dabei ist zu berücksichtigen, dass die Struktur so konfiguriert ist, dass sowohl clientseitiges Rendering als auch SSR nahtlos funktionieren. Die Vorbereitung des SSR wurde häufig unterschätzt. Fast überall waren die Tutorials veraltet oder nur unvollständig. Für das React-basierte Server-Side Rendering müssen Dateien speziell in TypeScript mit der Endung .tsx stattfinden.
Ein häufiger Fehler ist, diese als .jsx zu definieren, was Kompatibilitätsprobleme verursacht. Die Verwendung von ReactDOMServer’s renderToString in Verbindung mit Inertia’s createInertiaApp erlaubt die serverseitige Erzeugung von vollständigem HTML, das der Client als initialen Seiteninhalt erhält. Wichtig für die Entwicklungsumgebung ist außerdem die korrekte Einrichtung der Ports und Hosts in den Konfigurationsdateien von Vite. Ohne diese Einstellungen treten häufig Fehler auf, zum Beispiel Verbindungsprobleme zu Vite Dev Server bei Verwendung von localhost beziehungsweise 127.
0.0.1. Hier sind kleine Anpassungen in vite.json erforderlich, um einen reibungslosen Entwicklungsablauf zu gewährleisten.
Die Integration von ShadcnUI ermöglicht es Entwicklern, vorgefertigte UI-Komponenten direkt in ihre React-Seiten einzubinden. Mit Hilfe der Kommandozeilenbefehle zur Installation und Auswahl eines Templates kann eine moderne Oberfläche in wenigen Minuten generiert werden. Für eine stabile Nutzung sollte man darauf achten, vorübergehend auf React 18 zu downgraden, da ShadcnUI auf React 19 noch nicht vollständig stabil ist und Warnungen verursachen kann. Das Deployment stellt eine eigene Herausforderung dar. Die Standard-Dockerfiles des Rails-Ökosystems berücksichtigen meist nicht die zusätzlichen NodeJS-Abhängigkeiten, die für das Builden der JavaScript-Assets benötigt werden.
Daher ist es essenziell, NodeJS während der Build-Phase des Docker-Images zu installieren. Dies geschieht durch das Herunterladen und Kompilieren einer spezifischen Node-Version innerhalb der Dockerfile. Die Node-Module werden anschließend via npm ci sauber installiert, was eine reproduzierbare und saubere Installation garantiert. Ein weiterer Knackpunkt beim Deployment liegt in der Konfiguration von Kamal – einem modernen Tool zur Container-orchestrierten Bereitstellung. Kamal kann unter anderem für das Starten der SSR-Vite-Server verwendet werden, die für die serverseitige Darstellung der React-Komponenten notwendig sind.
Die clever eingerichteten Netzwerknamen und Aliase, wie beispielsweise vite_ssr im Container-Netzwerk, stellen sicher, dass der Rails-Webserver den SSR-Server zuverlässig ansprechen kann. Dies führt zu einer stabilen, skalierbaren Infrastruktur, die auch bei der Nutzung mehrerer Architekturen (x86 und ARM64) flexibel bleibt. Die Handhabung von Secrets und sensiblen Daten erfolgt dabei sicher über Environment-Variablen und Files, die Kamal verarbeitet. Besonders die Datenbank-Passwörter, der Rails-Master-Key sowie Login-Daten für Docker-Registries werden hierbei getrennt und nie im Code festgehalten. Der Einsatz von .
env Dateien, die nicht mit in Git kommen, und die Weitergabe der Umgebungsvariablen über die Shell bilden die Grundlage für eine sichere und flexible Konfiguration. Die Datenbankkonfiguration wurde angepasst, um neben der eigentlichen Produktionsdatenbank auch separate Caches und Queues zu bedienen, was sich mit Rails 8 als neuer Standard etabliert hat. Das Bereitstellen von SQL-Seed-Dateien beim Start der PostgreSQL-Datenbank erleichtert die Automatisierung und stellt sicher, dass alle benötigten Datenbanken vorhanden sind. Zusammenfassend lässt sich sagen, dass die Kombination von Inertia.js mit Rails, React, TypeScript, Tailwind CSS und ShadcnUI eine zukunftssichere Möglichkeit bietet, leistungsfähige, responsiv und SEO-freundlich optimierte Webanwendungen zu erstellen.