Using react-loadable with renderToNodeStream

301 views Asked by At

I'm new to the react-loadable library. I am wondering if it is possible to use React's renderToNodeStream instead of renderToString on the server.

server index.js:

/* code... */
  const appWithRouter = (
    <Loadable.Capture report={moduleName => modules.push(moduleName)}>
      <Provider store={store}>
        <StaticRouter location={req.path} context={context}>
          <div>{renderRoutes(Routes)}</div>
        </StaticRouter>
      </Provider>
    </Loadable.Capture>
  );


  let bundles = getBundles(stats, modules);

  const htmlStream = renderToNodeStream(appWithRouter);

  res.status(200).write(renderHeader(htmlStream)); /* wrong ??? */

  htmlStream.pipe(res, { end: false });
  htmlStream.on('end', () => {
    res.write( renderFooter(store, bundles) );
    res.end();
  });

});


Loadable.preloadAll().then(() => {
  app.listen(PORT, () => console.log(`listening on port: ${PORT}`));
});

render.js file imported into index.js:

export const renderHeader = (content) => {
  console.log('content in renderHeader: ', content);
  return `
  <!DOCTYPE html>
      <html lang="en">
      <head>
        <meta charset="UTF-8">
        <link rel="stylesheet" href="/styles.css">
        <title>Title</title>
      </head>
      <body>

      <div id="app">${content}</div>`;
}

export const renderFooter = (store, bundles) => {
  return `<script>
            window.INITIAL_STATE = ${JSON.stringify(store.getState())}
          </script>

          <script src="/vendor.js"></script>
          ${bundles.map(bundle => {
            return `<script src="/${bundle.file}"></script>`}).join('\\n')}
          <script src="/app.js"></script>

        </body>
      </html>
  `;
}

I have not found any examples or patterns the use the renderToNodeStream only renderToString. Is this close or way off? I would like to be able to use renderToNodeStream to get a faster response.

0

There are 0 answers