Skip to content

Instantly share code, notes, and snippets.

@appellation
Created July 22, 2019 17:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save appellation/6006ced1499d35335adcd44ca9a80c09 to your computer and use it in GitHub Desktop.
Save appellation/6006ced1499d35335adcd44ca9a80c09 to your computer and use it in GitHub Desktop.
Basic React SSR
import React from 'react';
import { hydrate } from 'react-dom';
import { BrowserRouter as Router } from 'react-router-dom';
import App from './App';
hydrate(<Router><App /></Router>, document.getElementById('app'));
import React from 'react';
import { renderToNodeStream } from 'react-dom/server';
import Helmet from 'react-helmet';
import { StaticRouter as Router } from 'react-router-dom';
import { createServer, IncomingMessage, ServerResponse } from 'http';
import { join } from 'path';
import { createReadStream } from 'fs';
import { getType } from 'mime';
import App from '../src/App';
const server = createServer((req: IncomingMessage, res: ServerResponse): void => {
if (req.url && req.url.startsWith('/assets')) {
const localPath = join('dist', req.url.replace('/', ''));
res.setHeader('Content-Type', getType(localPath) || 'text/plain');
createReadStream(localPath).pipe(res);
return;
}
const context: { url?: string } = {};
const helmet = Helmet.renderStatic();
const html =
<html lang="en" {...helmet.htmlAttributes.toComponent()}>
<head>
<meta content="text/html;charset=utf-8" httpEquiv="Content-Type"></meta>
<meta content="utf-8" httpEquiv="encoding"></meta>
{helmet.title.toComponent()}
{helmet.meta.toComponent()}
{helmet.link.toComponent()}
<link href="/assets/main.css" type="text/css" rel="stylesheet"></link>
</head>
<body {...helmet.bodyAttributes.toComponent()}>
<div id="app">
<Router location={req.url} context={context}><App /></Router>
</div>
<script src="/assets/main.js" type="text/javascript"></script>
</body>
</html>;
if (context.url) {
res.statusCode = 300;
res.setHeader('Location', context.url);
res.end();
return;
}
res.setHeader('Content-Type', 'text/html');
res.write('<!doctype html>\n');
renderToNodeStream(html).pipe(res);
});
server.listen(3000);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment