Gibt es zwei verschiedene Möglichkeiten, um die Anwendung zu erstellen, oder können sie zusammen verwendet werden?
Sie können zusammen verwendet werden.
Wenn wir es zusammen verwenden können, wie geht das? Müssen wir auf Server- und Client-Seite dieselben Elemente duplizieren? Oder können wir einfach die statischen Teile unserer Anwendung auf dem Server und die dynamischen Teile auf der Clientseite erstellen, ohne eine Verbindung zur Serverseite herzustellen, die bereits vorgerendert wurde?
Es ist besser, dasselbe Layout zu rendern, um Reflow- und Repaint-Vorgänge zu vermeiden. Weniger Flimmern / Blinken, Ihre Seite wird glatter. Dies ist jedoch keine Einschränkung. Sie können das SSR-HTML sehr gut zwischenspeichern (etwas, das Electrode tut, um die Antwortzeit zu verkürzen) / ein statisches HTML senden, das vom CSR überschrieben wird (clientseitiges Rendern).
Wenn Sie gerade erst mit SSR beginnen, würde ich empfehlen, einfach zu starten. SSR kann sehr schnell sehr komplex werden. Wenn Sie HTML auf dem Server erstellen, verlieren Sie den Zugriff auf Objekte wie Fenster, Dokumente (Sie haben diese auf dem Client), verlieren die Fähigkeit, asynchrone Vorgänge zu integrieren (sofort einsatzbereit) und im Allgemeinen viele Code-Änderungen, um Ihren Code SSR-kompatibel zu machen ( da du webpack verwenden musst, um deine bundle.js zu packen). Dinge wie CSS-Importe, erfordern vs Import beginnen plötzlich, Sie zu beißen (dies ist nicht der Fall in der Standard-React-App ohne Webpack).
Das allgemeine Muster von SSR sieht so aus. Ein Express-Server, der Anforderungen bedient:
const app = Express();
const port = 8092;
// This is fired every time the server side receives a request
app.use(handleRender);
function handleRender(req, res) {
const fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl;
console.log('fullUrl: ', fullUrl);
console.log('req.url: ', req.url);
// Create a new Redux store instance
const store = createStore(reducerFn);
const urlToRender = req.url;
// Render the component to a string
const html = renderToString(
<Provider store={store}>
<StaticRouter location={urlToRender} context={{}}>
{routes}
</StaticRouter>
</Provider>
);
const helmet = Helmet.renderStatic();
// Grab the initial state from our Redux store
const preloadedState = store.getState();
// Send the rendered page back to the client
res.send(renderFullPage(helmet, html, preloadedState));
}
Mein Vorschlag an Leute, die mit SSR beginnen, wäre, statisches HTML bereitzustellen. Sie können das statische HTML erhalten, indem Sie die CSR SPA-App ausführen:
document.getElementById('root').innerHTML
Vergessen Sie nicht, die einzigen Gründe für die Verwendung von SSR sollten sein:
- SEO
- Schnellere Ladungen (ich würde dies rabattieren)
Hack: https://medium.com/@gagan_goku/react-and-server-side-rendering-ssr-444d8c48abfc