Sie wissen, wann ein Projekt HTML und CSS benötigt, weil es im Grunde nur daraus besteht. Wann Sie zu JavaScript greifen, ist ziemlich klar: wenn Sie Interaktivität oder Funktionalität benötigen, die nur JavaScript bieten kann. Früher war es ziemlich klar, wann wir zu Bibliotheken griffen. Wir griffen zu jQuery, um die Arbeit mit dem DOM, Ajax und die Bewältigung von Cross-Browser-Problemen mit JavaScript zu vereinfachen. Wir griffen zu Underscore, um Hilfsfunktionen zu erhalten, die JavaScript allein nicht hatte.
Da der Bedarf an diesen Bibliotheken schwindet und wir einen massiven Anstieg neuer Frameworks sehen, würde ich argumentieren, dass es nicht mehr so klar ist, wann man zu ihnen greifen sollte. Ab welchem Punkt brauchen wir React?
Ich benutze React hier nur als Platzhalter für ziemlich große JavaScript-Framework-Dinger. Vue, Ember, Svelte... egal. Ich verstehe, dass sie nicht alle gleich sind, aber wann man zu ihnen greifen sollte, finde ich gleichermaßen nebulös.
Hier ist mein Take.
✅ Weil es viel Zustand gibt.
Selbst "Zustand" ist ein etwas nebulöses Wort. Stellen Sie sich Dinge wie diese vor
- Welches Navigations-Element ist aktiv
- Ob ein Button deaktiviert ist oder nicht
- Der Wert einer Eingabe
- Welche Akkordeon-Abschnitte aufgeklappt sind
- Wenn ein Bereich geladen wird
- Der angemeldete Benutzer und das Team, dem er angehört
- Ob das, woran der Benutzer arbeitet, veröffentlicht ist oder ein Entwurf
Geschäftslogik-Artige Dinge, mit denen wir regelmäßig zu tun haben. Zustand kann auch einfach Inhalt sein
- Alle Kommentare zu einem Artikel und die Details, aus denen sie bestehen
- Der aktuell angezeigte Artikel und all seine Metadaten
- Ein Array verwandter Artikel und die Metadaten für diese
- Eine Liste von Autoren
- Ein Aktivitätsprotokoll der letzten Aktionen eines Benutzers
React hilft Ihnen nicht, diesen Zustand zu *organisieren*, es sagt nur: Ich weiß, dass Sie sich mit Zustand *befassen* müssen, also nennen wir ihn einfach *Zustand* und haben programmgesteuerte Wege, diesen Zustand zu setzen und abzurufen.
Vor React haben wir vielleicht in Bezug auf den Zustand *nachgedacht*, aber meistens haben wir ihn nicht als direktes Konzept verwaltet.
Vielleicht haben Sie den Ausdruck "Single Source of Truth" gehört? Oft haben wir den DOM als unsere Single Source of Truth behandelt. Sagen wir zum Beispiel, Sie müssen wissen, ob ein Formular auf Ihrer Website abgeschickt werden kann. Vielleicht würden Sie überprüfen, ob $(".form input[type='submit']).is(":disabled"), weil all Ihre Geschäftslogik, die damit zu tun hatte, ob das Formular abgeschickt werden konnte oder nicht, letztendlich das deaktivierte Attribut dieses Buttons geändert hat. Der Button wurde also zur De-facto-Quelle der Wahrheit für den Zustand Ihrer App.
Oder sagen Sie, Sie müssten den Namen des ersten Kommentarautors eines Artikels herausfinden. Vielleicht würden Sie schreiben $(".comments > ul > li:first > h3.comment-author).text(), weil der DOM der einzige Ort ist, der diese Information kennt.
React sagt uns quasi
- Fangen wir an, all diese Dinge als Zustand zu betrachten.
- Ich gehe noch einen Schritt weiter: Zustand ist ein Stück JSON, also ist es einfach zu handhaben und funktioniert wahrscheinlich gut mit Ihrem Backend.
- Und noch eins drauf: Sie erstellen Ihr HTML mit Teilen dieses Zustands, und Sie müssen sich nicht direkt mit dem DOM befassen, ich kümmere mich um all das für Sie (und mache es wahrscheinlich besser/schneller als Sie es getan hätten).
✅ Um Spaghetti zu bekämpfen.
Das hängt stark mit den Zustandsthemen zusammen, über die wir gerade gesprochen haben.
"Spaghetti"-Code ist, wenn Ihnen Organisation und Struktur des Codes entglitten sind. Stellen Sie sich wieder ein Formular auf Ihrer Website vor. Es enthält Geschäftslogik, die sich speziell mit den Eingaben darin befasst. Vielleicht gibt es eine Zahleneingabe, die beim Ändern das Ergebnis einer Berechnung daneben anzeigt. Das Formular kann auch abgeschickt werden und muss validiert werden, also ist dieser Code vielleicht woanders in einer Validierungsbibliothek. Vielleicht wird das Formular deaktiviert, bis Sie sicher sind, dass alle JavaScript woanders geladen sind, und diese Logik ist woanders. Vielleicht erhalten Sie beim Absenden des Formulars Daten zurück, die Logik und Handhabung erfordern. Nichts wirklich Überraschendes hier, aber Sie sehen, wie schnell das verwirrend werden kann. Wie kann ein neuer Entwickler in dem Projekt, der sich dieses Formular ansieht, alles nachvollziehen, was vor sich geht?
React fördert das Erstellen von Dingen in Modulen. Dieses Formular wäre also wahrscheinlich entweder ein eigenes Modul oder aus kleineren Modulen zusammengesetzt. Jedes davon würde die Logik behandeln, die für es direkt relevant ist.
React sagt: *Nun, Sie werden den DOM nicht direkt auf Änderungen und so überwachen, weil der DOM meiner ist und Sie nicht direkt damit arbeiten dürfen*. Warum fangen Sie nicht an, diese Dinge als Teil des Zustands zu betrachten, ändern den Zustand, wenn Sie es brauchen, und ich kümmere mich um den Rest, rendere neu, was neu gerendert werden muss.
Es sei darauf hingewiesen, dass React selbst Spaghetti nicht vollständig löst. Sie können immer noch Zustand an allen möglichen seltsamen Orten haben, Dinge schlecht benennen und Dinge auf seltsame Weise verbinden.
Nach meiner begrenzten Erfahrung ist es Redux, das Spaghetti wirklich tötet. Redux sagt: Ich werde den *gesamten* wichtigen Zustand global verwalten, nicht Modul für Modul. Ich bin die absolute Quelle der Wahrheit. Wenn Sie den Zustand ändern müssen, ist ein ziemlicher *Aufwand* damit verbunden (ich habe es so gehört, und es gefällt mir). Es gibt Reducer und dispatchte Actions und so weiter. Alle Änderungen folgen dem Aufwand.
Wenn Sie den Redux-Weg gehen (und davon gibt es natürlich Variationen), erhalten Sie wirklich soliden Code. Es ist viel schwieriger, Dinge kaputt zu machen, und es gibt klare Spuren, wie alles miteinander verbunden ist.
✅ Viel DOM-Management.
Das manuelle Handhaben des DOM ist wahrscheinlich die größte Ursache für Spaghetti-Code.
- HTML hier einfügen!
- Etwas hier herausreißen!
- Dieses Gebiet auf dieses Ereignis beobachten!
- Hier ein neues Ereignis binden!
- Neue Inhalte kommen! Wieder einfügen! Sicherstellen, dass sie die richtigen Ereignisbindungen haben!
All diese Dinge können jederzeit und von überall in einer Anwendung geschehen, die zu Spaghetti geworden ist. Echte Organisation wurde aufgegeben, und es ist zurück zum DOM als Quelle der Wahrheit. Es ist schwer genau zu wissen, was für ein bestimmtes Element vor sich geht, also fragt jeder einfach den DOM, macht, was er tun muss, und hofft, dass es niemanden anderen stört.
React sagt: Sie dürfen sich nicht direkt mit dem DOM befassen. Ich habe ein virtuelles DOM und kümmere mich darum. Ereignisse werden direkt an die Elemente gebunden, und wenn Sie etwas tun müssen, das über etwas hinausgeht, das direkt in diesem Modul handhabbar ist, können Sie auf eine Art zeremonielle Weise Dinge in höheren Modulen aufrufen, aber auf diese Weise kann der Brotkrumenpfad verfolgt werden.
*Kompliziertes* DOM-Management ist eine weitere Sache. Stellen Sie sich eine Chat-App vor. Neue Chat-Nachrichten können erscheinen, weil eine Echtzeit-Datenbank neue Daten von anderen Chattern hat und einige neue Nachrichten angekommen sind. Oder Sie haben selbst eine neue Nachricht getippt! Oder die Seite wird zum ersten Mal geladen und alte Nachrichten werden aus einem lokalen Datenspeicher geladen, damit Sie sofort etwas sehen. Hier ist ein Twitter-Thread, der das verdeutlicht.
❌ Nur weil. Es ist die neue heiße Sache.
Etwas zu lernen, nur um des Lernens willen, ist großartig. Tu das.
Ein Projekt für Kunden und echte menschliche Benutzer zu bauen, erfordert sorgfältigere Überlegungen.
Ein Blog zum Beispiel hat *wahrscheinlich* keine der Probleme und passt in kein Szenario, das React zu einer guten Wahl machen würde. Und weil es keine gute Wahl ist, ist es wahrscheinlich eine *schlechte* Wahl, da es komplizierte Technologie und Abhängigkeiten für etwas einführt, das sie nicht erfordert.
Und doch, Grauzone. Wenn dieser Blog eine SPA ("Single Page App", d. h. keine Browser-Aktualisierung) ist, die aus Daten von einem Headless CMS erstellt wurde und ein schickes serverseitiges Rendering hatte... nun, vielleicht ist das wieder React-Territorium.
Das Web-App-CMS, das diesen Blog erstellt? Vielleicht eine gute Wahl für React, wegen all des Zustands.
❌ Ich mag einfach JavaScript und möchte alles in JavaScript schreiben.
Leuten wird gesagt, hey, ich habe Leuten gesagt: Lerne JavaScript. Es ist riesig. Es treibt alle möglichen Dinge an. Es gibt Jobs darin. Es wird nicht verschwinden.
Erst in der jüngsten Web-Geschichte ist es möglich geworden, JavaScript nie zu verlassen. Sie haben Node.js auf der Serverseite. Es gibt viele Projekte, die CSS aus dem Mix reißen und Stile über JavaScript handhaben. Und mit React ist auch Ihr HTML in JavaScript.
Alles JavaScript! Heil JavaScript!
Das ist alles schön und gut, aber auch hier gilt: Nur weil man es kann, heißt das nicht, dass man es tun sollte. Nicht alle Projekte erfordern das, und die meisten wahrscheinlich nicht.
☯️ Das ist, was ich weiß.
(Es gibt gute Emojis für JA und NEIN, aber VIELLEICHT ist schwieriger!)
Sie lernen. Großartig. Das tun alle. Lernen Sie weiter. Je mehr Sie wissen, desto fundiertere Entscheidungen können Sie über die zu verwendende Technologie treffen.
Aber manchmal muss man mit dem bauen, was man kennt, also werde ich es Ihnen nicht verdenken.
☯️ Da sind die Jobs.
Nicht jeder hat direkten Einfluss darauf, welche Technologie in einem bestimmten Projekt verwendet wird. Hoffentlich haben Sie im Laufe der Zeit Einfluss darauf, aber das braucht Zeit. Eden sagt, sie hat 2 Jahre mit Ember verbracht, weil dort die Jobs waren. Nichts dabei falsch. Jeder muss seinen Lebensunterhalt verdienen, und Ember mag für diese Projekte perfekt gepasst haben.
Toller Beitrag, besonders der Teil "gute Gründe, React zu verwenden"
Ausgezeichneter Artikel!
Es ist schön, etwas Vernunft im Land der Schlagworte zu sehen :)
Es gibt .js-basierte, bei denen man Dinge wie GSAP und mehr verliert. Sie machen CSS in .js zum Beispiel. Sie kommen und gehen alle 18 Monate. Knockout, Ember. Das nächste ist ELM.
vs DOM-basiert, wie Polymer2 (z.B. Google Earth) und RIOT (https://youtu.be/5bpBkvuy-OE). Durch die Nutzung des DOM ist man mehr ein Teamplayer mit Designern, SASS usw. Funktioniert mit jQuery und all den anderen Produktivitätstools.
Ich benutze sogar Pug ( https://youtu.be/wzAWI9h3q18 ) mit RIOT für statische / serverlose Anwendungen.
Danke, dass Sie sich die Zeit genommen haben, dieses Thema gründlich zu erklären.
Global State Management ist so entscheidend, wenn man es braucht. Da es so viele Alternativen zu Redux gibt, wollte ich einen aktuellen Überblick für diejenigen teilen, die neu sind oder ihre Optionen erkunden möchten
http://stateofjs.com/2016/statemanagement/
Es gibt auch mehr über Frameworks
http://stateofjs.com/2016/frontend/
Stimme den meisten Punkten zu und hier ein Gegenbeispiel.
Dies ist Teil des HTML, das verwendet wird, um die bisher schnellste Hacker News PWA zu erstellen.
Tooling macht es zu einem wörtlichen Template.
Diese Ansicht wird sowohl über den Server als auch über den Client ausgeliefert.
Bei all dem ist das CSS eine CSS-Datei und wird als solche geliefert.
Zusammenfassend lässt sich sagen, dass das HTML separat gehalten werden kann, das CSS separat gehalten werden kann und das JS sie alle sowohl auf dem Server als auch auf dem Client orchestrieren kann, und eine Hacker News PWA serviert, die auf schnellem 3G in 1,6 Sekunden interaktiv ist.
Alles funktioniert mit oder ohne JS und kann pro Sitzung geteilt und gerendert werden.
React koppelt Komponenten und Rendering über JSX in JS, aber wie Sie sagten, und glücklicherweise für das Web, ist React nicht die einzige Option.
Ich denke, das ist genau richtig. DOM- und Anwendungs-/UI-Zustandsmanagement sind die beiden wichtigsten entscheidenden Faktoren.
Einfachere automatisierte Tests sind ein weiterer großer Vorteil; wenn Sie React (und insbesondere Redux/ähnliches) verwenden, haben Sie eine vorgefertigte Struktur, um einfache Tests einzubauen. Sie müssen keinen Spaghetti-Code entwirren, um Dinge vorhersehbar und testbar zu machen.
Ein weiterer Grund, zu einem Framework zu wechseln, ist, wenn Sie mehrere Front-End-Entwickler parallel am Projekt arbeiten lassen. Der gekapselte, modulare Ansatz von React (und ähnlichen Frameworks) hilft, die Effizienz des Teams zu maximieren und gleichzeitig die Codekonsistenz zu wahren und Integrationsfehler zu reduzieren.
Beides werden auf größeren Projekten schnell zu wichtigen Überlegungen. Die Projektgröße ist ein guter Indikator allein dafür, ob ein Framework sinnvoll ist oder nicht.
Hallo Chris, toller Artikel und persönlich sehr hilfreich für mich!
Sind Änderungen möglich, um die Leistung bei responsiven Websites abzudecken? :)
Vielleicht ist Vue eine Ausnahme (und das ist eine seiner Stärken)
Die Front-End-Entwicklung wird immer besser. Toller Artikel, der erklärt, "warum/wann man ein Framework (irgendein) benutzt" prägnant.
Heutzutage sehe ich Entwickler, die ein neues Framework lernen, weil andere Entwickler dieses Framework verwenden. Wie Sie schrieben, ist es wichtig, alles zu lernen, aber es in jeder Situation zu verwenden, ist für mich sehr umstritten.
Vor Monaten sprachen ich und ein Freund darüber, React in jedem Projekt zu verwenden. Er versuchte, mich davon zu überzeugen, dass React für alles eine gute Lösung sei. Ich widersprach jedoch, denn auch wenn React eine großartige Idee ist, es in jedem Projekt zu verwenden, weil Ihre Community großartig ist, es viele Beiträge dazu gibt oder weil es ein Hype ist, ist das für mich ein großes Problem.
Also, toller Artikel und ich hoffe, dieser Beitrag öffnet vielen Entwicklern die Augen.
PS: Mein Englisch ist sehr schlecht, Entschuldigung! ;)
Schön!
Als "Plus" würde ich hinzufügen: "Die Vorteile der Arbeit mit einem Framework", insbesondere einem wie React: viele Ressourcen, eine große Community, Standards, Best Practices...
Mir hat der Artikel gefallen. Mein einziger Vorschlag ist, den Namen React aus dem Titel zu entfernen. Sicherlich ist der Artikel dazu gedacht, sich mit JavaScript-Frameworks im Allgemeinen zu befassen, nicht mit React?
"Das manuelle Handhaben des DOM ist wahrscheinlich die größte Ursache für Spaghetti-Code." - richtig gesagt. Aber nur, wenn Ihre Webanwendung komplex ist. Ich sehe Leute, die über React, Angular und moderne Technologien für einfache Webseiten sprechen.
Zu verstehen, wo man welche Technologien einsetzt, erfordert viel Lernaufwand.