hapi-react-ssr
v0.1.4
Published
Render React isomorphically using react-router in hapi
Downloads
8
Readme
hapi-react-ssr
Render React isomorphically using react-router in hapi using a data store of your choice (e.g. MobX).
Installation
npm install hapi-react-ssr vision --save
Options
The plugin accepts the following options
:
routes
: The routes defined byreact-router
as a manifest.getInitialContext
: A function to initialise your store(s) and eventually pass on to the client as initial state.bootstrapAction
: The static function to call for server-side rendering from all React components that define it.rootElement
: The root React element.template
: The template file/path/name
to use for rendering the view. Internally usesreply.view
provided byvision
. The templating engine to use is up to you. See vision docs.visionOptions
: The options to pass on tovision
.params
: Additional params to pass to the template context object.componentRenderedToString
andcontext
are reserved for internal use (see below).renderToStaticMarkup
: Choose whether torenderToStaticMarkup
(valuetrue
) instead ofrenderToString
(valuefalse
, default).contextAsProps
: Choose whether to spread out the context object as separate props on the root element (valuetrue
) or to keep the context inside a singlecontext
prop (valuefalse
, default).
Example usage
Define your routes as a PlainRoute:
// routes.js
import App from './components/App';
import Homepage from './components/Homepage';
const routes = [
{
path: '/',
component: App,
indexRoute: { component: Homepage },
childRoutes: [...]
}
];
export default routes;
// server.js
import HapiReactSSR from "hapi-react-ssr";
import Vision from "vision";
import { Provider } from "mobx-react"; // or use any other Provider to pass context down to all children
...
const plugins = [
Vision,
{
register: HapiReactSSR,
options: {
routes,
getInitialContext: () => {
return {
state: new AppState(),
store: new AppStore()
}
},
bootstrapAction: 'fetchData',
rootElement: Provider,
template: './src/server/index',
params: {
env: process.env.NODE_ENV
}
}
},
// other plugins
];
server.register(plugins, (err) => {});
Notes
- This plugin uses
componentRenderedToString
prop to store the server-side rendered root React component, andcontext
to store the computed initial state from your data store. Include them appropriately in your template.
{{! handlebars example }}
<html>
<body>
<div id="react-root">{{{ componentRenderedToString }}}</div>
<script type="application/javascript">
window.__INITIAL_STATE__ = {{{ context }}};
</script>
</body>
</html>
- This plugin uses a catch-all hapi route to pass all incoming requests to the react-router. You will generally need to override this behaviour with other more specific routes in your app — to serve static files, for example.
License
MIT