@repage/renderer-react
Version:
55 lines (45 loc) • 1.5 kB
JavaScript
const assert = require('reassert');
const assert_usage = assert;
const assert_internal = assert;
const ReactDOMServer = require('react-dom/server');
const HtmlCrust = require('@brillout/html-crust');
const {loadData, get_views, get_initial_props} = require('./common');
module.exports = {
name: require('./package.json').name,
pageMixin: {
renderHtmlLoad: [
loadData,
],
renderHtmlApply: [
renderHtmlApply,
],
},
};
function renderHtmlApply ({page, renderHtmlContext, route}) {
const initial_props = get_initial_props(route, renderHtmlContext);
const views = get_views({page, initial_props});
assert_usage(
views.length<2,
page,
"The page printed above has more than one view. But multiple views only make sense in the browser."
);
assert_usage(
views.length>0,
page,
"The page printed above is missing a view."
);
const body_html = get_body_html(views);
const html = HtmlCrust.renderToHtml(Object.assign({}, page, {body: body_html}));
renderHtmlContext.html = html;
}
function get_body_html(views) {
if( views.length===0 ) {
return '';
}
const {react_element, container_id} = views[0];
assert_internal(react_element);
assert_internal(container_id);
let body_html = ReactDOMServer.renderToStaticMarkup(react_element);
body_html = '<div id="'+container_id+'">'+body_html+'</div>';
return body_html;
}