ReactJS serverseitiges Rendering für Einzelseitenanwendungen

8

Was ich bereits getan habe

  • Ich habe ein Frontend, das komplett mit React.JS erstellt wurde.
  • Die gesamte Geschäftslogik wird von Django verarbeitet und von Django REST Framework über eine API bereitgestellt.
  • Ich kann für verschiedene mobile Umgebungen (Android und iOS über Cordova)
  • bauen
  • Die Webanwendung ist über mein Django-Projekt zugänglich (dasselbe, das die API freigibt), das Frontend ist derselbe ReactJS-Code, der über das Webpack gebündelt wird.
  • Die App hat einen einzigen Einstiegspunkt, main.js, der eine gebündelte Version meiner Komponenten und Abhängigkeiten von react.js ist. Daher sieht meine index.html normalerweise so aus:

    %Vor%

Was ich tun möchte

  • Ich möchte ein serverseitiges Rendering meiner Webanwendung bereitstellen, damit Web-Crawler meine App im Web korrekt indizieren können (ich suche kein serverseitiges Rendering für mobile Builds)

Wie kann ich damit umgehen, wenn ich bedenke, dass meine App eine Single Page Application ist? Ich möchte weder das Rad neu erfinden noch meinen Code duplizieren. Welche Art von node.js Server muss ich schreiben, um dieses automatische serverseitige Rendering zu erreichen? Gibt es eine Möglichkeit, das serverseitige Rendering direkt in Django bereitzustellen (über einige Tools, die die endgültigen Ergebnisse der Seite, wie sie auf der Client-Seite angezeigt werden, lesen und interpretieren und dieses rohe HTML zurückgeben?)

    
Pcriulan 30.07.2015, 15:55
quelle

1 Antwort

2

Sie haben Ihr Problem wahrscheinlich schon gelöst, aber ich wollte meine Lösung dafür teilen.

Ich habe ein sehr ähnliches Setup und habe etwas, das bisher ziemlich gut funktioniert. Ich habe im Grunde eine Django w / DRF Backend API und isomorphe React / Flux Javascript App. Ich betreibe auch einen Node-Server neben dem Python-Backend-Server, der nur als 'Template-Rendering-Dienst' fungiert. Ersetzen Sie im Wesentlichen die Funktion django render .

Also ersetze ich einfach den django View durch einen speziellen IsoView , der über http zum Knotenserver abruft und den gerenderten HTML-Code zurückgibt.

%Vor%

Und benutze es so:

%Vor%

Dies setzt auch eine Django-Vorlage voraus, die so etwas verwendet

%Vor%

Damit wird der HTML-Code zurückgegeben, der vom Knoten im body-Tag zurückgegeben wird. Außerdem werden die JSON-Daten, die zum Starten der App auf dem Client im Objekt window.data benötigt werden, ausgegeben.

Dies ist eine wirklich vereinfachte Version des Systems, aber es sollte funktionieren. Sie sollten vorsichtig mit XSS-Angriffen auf das window.data -Bit sein, also stellen Sie sicher, dass Sie alle Ihre json-Daten umgehen, aber ansonsten sollten Sie alle gut sein.

Dann sieht der Knotenvorlagen-Server sehr ähnlich zu den Online-Lernprogrammen aus, die Sie für die serverseitige Reaktion finden können. Nur eine einfache Express-App.

Alternativ müssen Sie sich auch nicht mit Django-Vorlagen herumschlagen, wenn Sie den vollständigen ... im Knoten rendern und diesen als String zurückgeben.

Ich hoffe, das hilft.

    
Peter Matev 06.10.2015 12:04
quelle