koa-isomorphic-relay
Koa middleware for isomorphic React + Relay rendering and routing.
This middleware implements basic server side pre-rendering, which is required for isomorphic rendering.
Components
react
+ react-dom
for renderingreact-helmet
for document head managementrelay
for data fetching and managementisomorphic-relay
to make Relay isomorphic (see facebook/relay#136 and facebook/relay#558)react-router
for routingreact-router-relay
to add support for Relay to the routerisomorphic-relay-router
to make Relay Router isomorphic
Installation
$ npm install koa-isomorphic-relay
Usage
Server side
import Koa from 'koa';
import renderServer from 'koa-isomorphic-relay';
const app = new Koa();
app.use(renderServer({
graphqlUrl: 'http://localhost:8080/graphql',
routes: routes,
render: async (reactOutput, preloadedData, helmet) => {
return `
<!DOCTYPE>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
${helmet.title.toString()}
${helmet.meta.toString()}
${helmet.link.toString()}
</head>
<body>
<div id="root">${reactOutput}</div>
<script id="preloaded-data" type="application/json">${preloadedData}</script>
<script src="/app.js"></script>
</body>
</html>
`;
}
}));
Client side
import ReactDOM from 'react-dom';
import {browserHistory} from 'react-router';
import IsomorphicRelay from 'isomorphic-relay';
import IsomorphicRouter from 'isomorphic-relay-router';
const data = JSON.parse(document.getElementById('preloaded-data').textContent);
IsomorphicRelay.injectPreparedData(data);
const rootElement = document.getElementById('root');
ReactDOM.render(
<IsomorphicRouter.Router routes={routes} history={browserHistory} />,
rootElement
);