Einer der größten Vorteile von React.js soll das serverseitige Rendern sein . Das Problem ist, dass die Schlüsselfunktion React.renderComponentToString()
synchron ist, wodurch es unmöglich wird, asynchrone Daten zu laden, wenn die Komponentenhierarchie auf dem Server gerendert wird.
Angenommen, ich habe eine universelle Komponente zum Kommentieren, die ich praktisch überall auf der Seite ablegen kann. Es hat nur eine Eigenschaft, eine Art Bezeichner (z. B. die ID eines Artikels, unter dem die Kommentare platziert sind), und alles andere wird von der Komponente selbst verwaltet (Laden, Hinzufügen, Verwalten von Kommentaren).
Ich mag die Flux- Architektur sehr, weil sie viele Dinge viel einfacher macht und ihre Geschäfte perfekt sind, um den Status zwischen Server und Client zu teilen. Sobald mein Geschäft mit Kommentaren initialisiert ist, kann ich es einfach serialisieren und vom Server an den Client senden, wo es leicht wiederhergestellt werden kann.
Die Frage ist, wie ich meinen Laden am besten bevölkern kann. In den letzten Tagen habe ich viel gegoogelt und bin auf einige Strategien gestoßen, von denen keine wirklich gut schien, wenn man bedenkt, wie sehr diese Funktion von React "beworben" wird.
Meiner Meinung nach ist es am einfachsten, alle meine Geschäfte zu füllen, bevor das eigentliche Rendern beginnt. Das heißt, irgendwo außerhalb der Komponentenhierarchie (zum Beispiel an meinen Router angeschlossen). Das Problem bei diesem Ansatz ist, dass ich die Seitenstruktur ziemlich zweimal definieren müsste. Stellen Sie sich eine komplexere Seite vor, beispielsweise eine Blog-Seite mit vielen verschiedenen Komponenten (tatsächlicher Blog-Beitrag, Kommentare, verwandte Beiträge, neueste Beiträge, Twitter-Stream ...). Ich müsste die Seitenstruktur mithilfe von React-Komponenten entwerfen und dann an einer anderen Stelle den Prozess des Auffüllens jedes erforderlichen Speichers für diese aktuelle Seite definieren. Das scheint mir keine gute Lösung zu sein. Leider sind die meisten isomorphen Tutorials so konzipiert (zum Beispiel dieses großartige Flux-Tutorial ).
Reagieren Sie asynchron . Dieser Ansatz ist perfekt. Ich kann einfach in einer speziellen Funktion in jeder Komponente definieren, wie der Status initialisiert werden soll (egal ob synchron oder asynchron), und diese Funktionen werden aufgerufen, wenn die Hierarchie in HTML gerendert wird. Es funktioniert so, dass eine Komponente erst gerendert wird, wenn der Status vollständig initialisiert ist. Das Problem ist, dass Fasern erforderlich sindSoweit ich weiß, handelt es sich um eine Node.js-Erweiterung, die das Standardverhalten von JavaScript ändert. Obwohl mir das Ergebnis wirklich gefällt, scheint es mir immer noch, dass wir, anstatt eine Lösung zu finden, die Spielregeln geändert haben. Und ich denke, wir sollten nicht dazu gezwungen werden, um diese Kernfunktion von React.js zu nutzen. Ich bin mir auch nicht sicher über die allgemeine Unterstützung dieser Lösung. Ist es möglich, Fibre auf Standard-Webhosting von Node.j zu verwenden?
Ich habe ein wenig alleine nachgedacht. Ich habe nicht wirklich über die Implementierungsdetails nachgedacht, aber die allgemeine Idee ist, dass ich die Komponenten ähnlich wie React-async erweitern und dann wiederholt React.renderComponentToString () für die Stammkomponente aufrufen würde. Während jedes Durchgangs sammelte ich die erweiterten Rückrufe und rief sie dann am und des Durchgangs an, um die Geschäfte zu füllen. Ich würde diesen Schritt wiederholen, bis alle für die aktuelle Komponentenhierarchie erforderlichen Speicher gefüllt sind. Es gibt viele Dinge zu lösen und ich bin mir über die Leistung besonders unsicher.
Habe ich etwas verpasst? Gibt es einen anderen Ansatz / eine andere Lösung? Im Moment denke ich darüber nach, asynchron zu reagieren / Fasern zu gehen, bin mir aber nicht ganz sicher, wie im zweiten Punkt erläutert.
Verwandte Diskussion auf GitHub . Anscheinend gibt es keinen offiziellen Ansatz oder gar eine Lösung. Vielleicht ist die eigentliche Frage, wie die React-Komponenten verwendet werden sollen. Wie eine einfache Ansichtsebene (so ziemlich mein Vorschlag Nummer eins) oder wie echte unabhängige und eigenständige Komponenten?