Czy są to 2 oddzielne sposoby tworzenia aplikacji, czy mogą być używane razem?
Mogą być używane razem.
Jeśli możemy go używać razem, jak to zrobić - czy musimy powielać te same elementy po stronie serwera i klienta? A może możemy po prostu zbudować statyczne części naszej aplikacji na serwerze, a dynamiczne części po stronie klienta, bez żadnego połączenia z serwerem, który został już wstępnie wyrenderowany?
Lepiej jest renderować ten sam układ, aby uniknąć operacji ponownego malowania i ponownego malowania, mniej migotania / migania, a Twoja strona będzie gładsza. Jednak to nie jest ograniczenie. Możesz bardzo dobrze buforować SSR html (coś, co robi Electrode , aby skrócić czas odpowiedzi) / wysłać statyczny html, który zostanie nadpisany przez CSR (renderowanie po stronie klienta).
Jeśli dopiero zaczynasz od SSR, polecam zacząć od prostego, SSR może bardzo szybko się skomplikować. Budowanie html na serwerze oznacza utratę dostępu do obiektów takich jak okno, dokument (masz je na kliencie), utratę możliwości włączenia operacji asynchronicznych (po wyjęciu z pudełka) i ogólnie wiele edycji kodu w celu uzyskania kompatybilności z SSR kodu ( ponieważ do spakowania pliku bundle.js będziesz musiał użyć pakietu webpack). Rzeczy takie jak import CSS, wymagają vs import nagle zaczynają Cię gryźć (nie ma to miejsca w domyślnej aplikacji React bez pakietu webpacka).
Ogólny wzorzec SSR wygląda następująco. Serwer Express obsługujący żądania:
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));
}
Moja sugestia dla osób zaczynających od SSR to wyświetlanie statycznego html. Możesz pobrać statyczny html, uruchamiając aplikację CSR SPA:
document.getElementById('root').innerHTML
Nie zapominaj, że jedynymi powodami, dla których warto używać SSR, powinny być:
- SEO
- Szybsze ładowanie (zdyskontowałbym to)
Hack: https://medium.com/@gagan_goku/react-and-server-side-rendering-ssr-444d8c48abfc