- Gumroad prüfte für das neue Projekt Helper htmx in der Erwartung eines schlanken Frontends, wechselte jedoch mit steigenden Anforderungen an eine komplexe UX zu React/Next.js
- Für einfache Interaktionen war htmx vielversprechend, doch bei Formularen mit dynamischer Validierung und bedingten Feldern wurde die serverseitige Logik langatmig und der Entwicklungsfluss unnatürlich
- Der Drag-and-Drop-Workflow-Builder, Echtzeit-Kollaboration, komplexes State-Management und dynamische Formularerzeugung ließen sich im React-Ökosystem und mit dem Komponentenmodell direkter umsetzen
- Materialien zur Problemlösung und die Unterstützung durch AI-Tools waren bei Next.js und React deutlich reichhaltiger; htmx war wegen mangelnder Open-Source-Trainingsdaten bei der Entwicklungsgeschwindigkeit im Nachteil
- htmx kann für bestehende servergerenderte Apps oder einfache Interaktionsmodelle geeignet sein, aber für zustandsreiche Interfaces wie Helper passten React und Next.js besser
Hintergrund der Prüfung von htmx bei Helper
- Gumroad prüfte beim Start des neuen Projekts Helper htmx als Frontend-Kandidaten
- Die anfängliche Erwartung entstand aus früheren Erfahrungen, dass React schwerfälliger ist als nötig, und man sah in htmx eine Möglichkeit, einfache Interaktionen schlank hinzuzufügen
- Im Team gab es auch die Einschätzung, htmx sei einem Meme ähnlich, das das komplex gewordene JavaScript-Ökosystem persifliert
- So wie Tailwind wie eine andere Syntax für Inline-CSS wirkt, wurde auch htmx eher als eine andere Syntax für Inline-JavaScript gesehen
- Tailwind hat sich in Gumroads Tooling etabliert, aber htmx ließ sich nicht passend für den Zweck von Helper erweitern und führte nicht zur bestmöglichen User Experience für die Kunden
Wo sich React/Next.js natürlicher anfühlte
-
Developer Experience und Formularverarbeitung
- Eine korrekte Umsetzung wäre auch mit htmx möglich gewesen, aber Gumroad empfand den Weg, Funktionen in Next.js zum Laufen zu bringen, als intuitiver
- Bei komplexen Formularen mit dynamischer Validierung und bedingten Feldern war die clientseitige Arbeit in React einfacher, während in htmx die serverseitige Logik länger wurde
-
UX- und Interaktionsgrenzen
- htmx neigt dazu, Apps in eine Rails-/CRUD-Richtung zu drängen, wodurch die Standarderfahrung leicht gewöhnlich oder generisch wirkt
- Das Drag-and-Drop-Interface des Workflow-Builders erforderte in htmx Umgehungslösungen und wirkte gröber als die geschmeidige Erfahrung mit React-Bibliotheken
-
AI-Tools und Geschwindigkeit bei der Problemlösung
- AI-Tools sind mit Next.js vertrauter, mit htmx jedoch weniger, was auf fehlende Open-Source-Trainingsdaten zurückgeführt wurde
- Für React/Next.js gibt es reichlich Material, sodass sich bei Problemen schneller Lösungen finden ließen
-
Komplexität und Skalierbarkeit
- Je komplexer das Projekt wurde, desto mehr wurde die Einfachheit von htmx von einem Vorteil zu einer Einschränkung
- Mit Echtzeit-Kollaboration und komplexen Datenvisualisierungen wurde das State-Management zwischen mehreren Komponenten im serverzentrierten Ansatz von htmx zunehmend schwieriger
Unterschiede nach Helper-Funktionen
- Drag-and-Drop:
react-beautiful-dndaus dem React-Ökosystem bietet mit wenig Konfiguration flüssiges und barrierearmes Drag-and-Drop - Komplexes State-Management: Um Einstellungen und Bedingungslogik jeder Workflow-Stufe in Echtzeit in der UI abzubilden, waren React-Ansätze wie
useStateoder Redux direkter - Dynamische Formularerzeugung: Unterschiedliche Konfigurationsformulare je nach Schritttyp zu erstellen und sie anhand von Nutzereingaben zu verändern, ließ sich im React-Komponentenmodell intuitiver umsetzen
- Echtzeit-Kollaboration: Die Funktion, bei der mehrere Nutzer gleichzeitig Workflows bearbeiten, ließ sich mit WebSockets und React vergleichsweise direkt umsetzen; in htmx wären komplexere serverseitige Logik und eigenes JavaScript nötig gewesen
- Performance-Optimierung: Je größer und komplexer die Workflows wurden, desto feiner ließ sich das Rendering in React mit dem virtual DOM und Hooks wie
useMemounduseCallbackoptimieren
Ökosystem und abschließende Einschätzung
- Das React/Next.js-Ökosystem ist groß und ausgereift und bot für fast jedes Problem, auf das Gumroad stieß, eine Lösung
- Mit htmx musste man häufiger Funktionen kompromissbehaftet umsetzen oder selbst neu bauen; auch bei der Integration von Drittanbieterdiensten und Bibliotheken gab es Fälle, in denen React-Bindings existierten, aber kein htmx-Gegenstück
- Nach dem Wechsel zu React/Next.js bewertete Gumroad dies als die bessere Wahl für den Aufbau einer komplexen UX
- Man konnte sich schneller bewegen, eine immersivere User Experience schaffen und vorhandene Tools und Bibliotheken nutzen
- Auch die App-User-Experience für die Kernkundschaft von Helper ließ sich deutlich verbessern
- Die Grenzen von htmx sind nicht unüberwindbar, aber der Lösungsweg führte weg von den Stärken von htmx hin zu Lösungen, die sich in einer JavaScript-zentrierten Umgebung natürlicher anfühlten
- htmx kann für einfache Interaktionsmodelle oder Projekte, die auf bestehenden servergerenderten Apps aufbauen, eine gute Wahl sein
- Für komplexe und zustandsreiche Interfaces wie Helper waren React und Next.js besser geeignet; Gumroad ist der Ansicht, den Tech-Stack auch künftig je nach Bedarf und neuen Technologien weiter neu zu bewerten
1 Kommentare
Meinungen auf Hacker News
Das hatte ich schon in einem anderen Thread geschrieben: Der Gumroad-CEO sagte auf Twitter, dass sie htmx in einem Projekt ausprobiert, sich am Ende aber für NextJS entschieden hätten.
Ich war auf der Suche nach einem durchdachten negativen Erfahrungsbericht, der sich für die htmx-Website eignet, und fragte, ob er seine Erfahrung aufschreiben könne. Ich war dankbar, dass er sofort zustimmte.
Im Vergleich zu anderen Projekten, die behaupten, für alles die beste Lösung zu sein, ist das erfrischend.
Besonders neugierig macht mich der Hinweis auf Drag-and-drop: Ist das in htmx wirklich schwierig, und falls ja, gibt es Pläne, das zu lösen?
Dabei ist es ja nicht so, dass man Rails und React nicht zusammen verwenden könnte.
Der Text wirkt für mich weniger wie ein negativer Erfahrungsbericht zu htmx, sondern eher so, als sei die Entscheidung, htmx überhaupt zu erproben, womöglich von Anfang an falsch gewesen, sobald Drag-and-drop und Echtzeit-Zusammenarbeit ins Spiel kamen.
Ich bin mir auch nicht sicher, was der Screenshot zeigen soll, aber trotzdem halte ich den Beitrag für gut geeignet für die htmx-Website.
Für mich ist htmx weniger ein Ersatz für React als eher ein Ersatz für jQuery.
htmx und jQuery fügen einem Dokument Interaktion hinzu; React will selbst das gesamte Dokument sein.
Je nach Aufgabe sollte man unterschiedliche Werkzeuge wählen.
Die Passage „KI und Tool-Unterstützung: Erwähnenswert ist auch, dass KI-Tools mit Next.js sehr vertraut sind, mit htmx aber deutlich weniger“ wurde zwar nüchtern als Nachteil formuliert, ist aber ein ziemlich unheimliches Vorzeichen für die Zukunft von Entwicklungstools, Libraries, Frameworks und Sprachen.
Meine Prognose: Large Language Models werden bestehende Winner-takes-all- und First-mover-Effekte noch verstärken und durch mehr und bessere Trainingsdaten auch die Nutzung von Open-Source-Tools weiter begünstigen.
Schon vor Large Language Models hatte React den Vorteil, dass die meisten Fragen bereits auf StackOverflow beantwortet waren und es für fast jeden Einsatzzweck ausgereifte Libraries gab.
Jetzt fragen manche Leute eben Large Language Models statt früher StackOverflow, aber das Ergebnis ist dasselbe.
Es bringt Vorteile, das zu verwenden, was viele andere auch verwenden.
Als langfristige Strategie für eine Karriere als Software Engineer halte ich das allerdings entschieden für keine besonders gute Wette.
Ich habe überlegt, ob das vielleicht sogar etwas Gutes sein könnte.
Die Softwarebranche verbringt zu viel Zeit damit, den neuesten Tools, Sprachfeatures und Frameworks hinterherzulaufen.
Ein wenig Stagnation könnte positiv sein, wenn sie dazu führt, dass man mit den vorhandenen Werkzeugen Arbeit erledigt, statt alle sechs Monate einen neuen Hammer zu bauen.
Allein aus dem Kommentar ist nicht ersichtlich, ob die tatsächliche Erfahrung war, dass KI schlecht mit HTMX umgehen konnte, oder ob es eher allgemein um mangelnde Materialien ging.
Large Language Models funktionieren oft sehr gut wie ein universeller Übersetzer.
Wenn sie allgemeine Muster und Konzepte populärer Frameworks gelernt haben und die Syntax kleinerer Frameworks einigermaßen kennen, erzeugen sie meiner Erfahrung nach auch ziemlich guten Code für Nischen-Frameworks.
Das ist ähnlich wie bei Piraten, die auch über Themen in Piratensprache sprechen können, über die in den Trainingsdaten nie ein Pirat gesprochen hat.
Bei der Passage „Beim Erstellen komplexer Formulare mit dynamischer Validierung und bedingten Feldern mussten wir komplexe serverseitige Logik schreiben, um Dinge zu erledigen, die in React einfache clientseitige Arbeit wären“ musste ich an das Anakin-Padme-Meme denken.
„Aber ihr implementiert doch trotzdem auch serverseitige Validierung … oder?“
Formulare, die in React einfach, in htmx aber schwierig sind, fallen mir kaum ein – außer wenn man globalen Anwendungszustand im React-Stil hineinstecken und 90 % mit einer Library erledigen möchte.
Allerdings einmal beim Absenden, nicht auf jeder Seite.
Im Gegensatz zur Aussage „Wir dachten, htmx könnte eine gute Lösung sein, um das Frontend sehr schlank zu halten“ wirkt es so, als sei htmx unpassend geworden, sobald man das schlanke Frontend aufgegeben hatte.
Man begann, Third-Party-Libraries zu verwenden, um komplexe UI/UX und State Management zu rendern.
Außerdem ist es kein fairer Vergleich, zu sagen „In React war X einfacher“, wenn man es dort mit einer Third-Party-Library erledigt hat.
Man musste es nur deshalb nicht selbst machen, weil jemand anderes es schon gemacht hatte.
Ich stimme dem Beitrag in vielem zu, aber wenn klar war, dass komplexer Zustand und Rendering nötig sind, war htmx von Anfang an keine gute Lösung.
Ich mag htmx, aber dieser Beitrag zeigt, dass dem Autor offenbar einiges an technischem Verständnis fehlte.
Das wirkt weniger wie eine Abwägung von Vor- und Nachteilen, die schon mit ein wenig Kenntnis der Webplattform und der Dokumentation auf htmx.org sichtbar gewesen wären, sondern eher so, als habe man HTMX ausprobieren wollen, weil die Stimmung gerade danach war.
Die Gherkin-Sprache sieht in einfachen Fällen gut aus und lässt sich prinzipiell auch auf komplexere Fälle ausweiten, aber je mehr Abstraktionsebenen man verwalten muss, desto angenehmer wird das rein Python-basierte pytest.
Der Projektumfang war überhaupt nicht „einfach“, und in meinem Fall wäre ich direkt zu React gegangen.
Zu der Stelle, dass „die Implementierung eines Drag-and-drop-Interface für den Workflow-Builder in htmx eine große Herausforderung war und im Vergleich zu der reibungslosen Erfahrung, die man mit einer React-Bibliothek bekommt, umständliche Workarounds erforderte“: HTMX ist am besten, wenn das Frontend-Bundle nur so viel macht wie nötig und nicht mehr.
Man kann sich an das Event
htmx.onLoadhängen und dann im geladenen Content Markup mit entsprechenden Attributen finden und anbinden, etwa columns, cards, tasks usw.Zum Beispiel kann man sortable.js an das gerenderte Markup binden und die sortable-Events mit Status-Updates über HTMX verknüpfen.
Das ist ziemlich einfach, und in der Dokumentation gibt es genau so ein Beispiel: https://htmx.org/docs/#3rd-party
Moderne, zustandsbehaftete und dynamische Websites sind keineswegs unvereinbar mit HTMX.
Wenn man den Artikel liest, wirkt das Team eher mit Frontend-Entwicklung vertraut als mit Backend-Entwicklung.
Aus Sicht eines Entwicklers alter Schule sieht man manchmal ein wenig Angst und Missverständnisse in der Denkweise von Frontend-Entwicklern.
Ehrlich gesagt denke ich, dass man nur seine Denkweise ein klein wenig anpassen muss, um zu verstehen, wie dieser Ansatz funktioniert; ich verstehe aber auch, dass viele Menschen in ihrer gesamten Laufbahn nie einen klassischen Client/Server-Ansatz gesehen haben.
Trotzdem kann man den Wert fertiger React-Komponenten sowie den Vorteil leicht auffindbarer Dokumentation und Hilfe nicht ignorieren.
Eine ganze Generation von Designern hat Mobile und Web sehr ähnlich gestaltet und die Komplexität der Umsetzung den Entwicklern zugeschoben.
Aber das Web sollte, wenn möglich, anders sein als Mobile, und es darf auch anders sein.
Im Artikel heißt es, das Design sei zu „generic“ gewesen, wie bei einer CRUD-App, aber ist das wirklich schlecht?
Wir haben die großartige Errungenschaft eines allgemein akzeptierten Dokumentmodells, das über alle Sites hinweg eine vorhersehbare User Experience ermöglicht, und sehen darin nur „langweilig“.
Als wäre Langeweile an sich etwas grundsätzlich Problematisches.
Ich verstehe den Marktdruck, einzigartige, gebrandete Erlebnisse zu verlangen, die sich wie mobile Apps anfühlen, aber ich frage mich, wie es wäre, wenn Designer neben dem Denken im React-Stil auch im WWW-Stil denken könnten.
Ich finde es gut, dass HTMX diesen und ähnliche Artikel auf der eigenen Site veröffentlicht.
Es scheint einige stichhaltige Gründe gegeben zu haben, warum HTMX allein nicht gut passte.
Ich bin kein Frontend-Experte, habe aber ein paar Gedanken dazu.
Erstens: Muss man Formularvalidierung nicht ohnehin auch im Backend machen?
Ich frage mich, warum es so schwierig war, dass das Backend-System die Ergebnisse an das Frontend weitergibt.
In vielen Fällen gibt es gute Gründe, Formularvalidierung sowohl im Frontend als auch im Backend durchzuführen; dann reicht HTMX allein natürlich nicht aus, aber die Formulierung dieses Problems wirkt etwas verwirrend.
Zweitens kann eine App, wenn man nur HTMX verwendet, in gewissem Maß in diese Richtung gedrängt werden, was in manchen Fällen gut ist; sie scheinen aber entschieden zu haben, dass sie für ihre Kunden einen anderen Ansatz brauchen.
Drittens würde ich gern mehr darüber wissen, wie dieses Team AI-Tools eingesetzt hat, wenn die Abhängigkeit von AI-Tools zu einem zentralen Problem werden konnte.
Wenn AI-Entwicklungswerkzeuge künftig wichtiger werden, ist es auch eine interessante Frage, ob die Hürde dafür, für neue Frameworks oder Programmiersprachen genügend Tools und Integrationen zu bekommen, zu hoch wird.
Viertens verlangen manche Projekte, wie es eine häufige Beschwerde über HTMX ist, mehr als das, was HTMX bietet.
Fünftens ist einer der Gründe, warum ich Django und Python mag, ebenfalls die tiefe Community sowie das Ökosystem aus Integrationen und Add-ons.
Etwas wie https://unpoly.com/, das konzeptionell ähnlich ist, aber mehr Funktionen als HTMX bietet, hätte für sie vielleicht besser gepasst.
Zu der Aussage „der Entwicklungsprozess von Next.js fühlte sich natürlich an“: Ich weiß nicht, welcher Teil dieser ReactJS-Syntax natürlich sein soll.
Sie mag vertraut sein, aber natürlich ist sie nicht.
useEffect(() => { const timer = setInterval(() => { setCount((prevCount) => prevCount + 1); }, 1000); return () => clearInterval(timer); }, []);Am Ende muss man das wohl unbeholfen mit JavaScript verdrahten.
Wenn man einen Custom Hook mit variablem Timeout will, kann es deutlich komplexer werden.
Auch Dan musste zu diesem Thema einen langen Artikel schreiben: https://overreacted.io/making-setinterval-declarative-with-r...
Kannst du welchen schreiben?
Es ist lobenswert, dass htmx.org diesen Artikel hostet.
Wenn nun jemand htmx ausprobiert und wütend wird, weil es die eigenen Anforderungen nicht erfüllt, gibt es am Ende wenigstens Material, auf das man verweisen kann.
Ich verwende htmx in einigen meiner Projekte und fand es ziemlich gut.
Solche Artikel bestärken mich eher darin, htmx zu nutzen, weil sie selten zeigen, wo htmx gut ist und wo es Schwächen hat.
Der dritte Punkt wirkt beängstigend.
Ich stelle mir eine Welt vor, in der Unternehmen dafür bezahlen, dass ihr Framework in den Trainingsdatensätzen der Modelle überrepräsentiert ist, und auf dieser Grundlage Verträge verkaufen.
Das ist so ähnlich, als wäre Suchmaschinenoptimierung fest in Entwicklungstools eingebaut.