From 40d411e516efee5531404725b45ab89d97172ce8 Mon Sep 17 00:00:00 2001 From: Vitaly Takmazov Date: Fri, 28 Oct 2022 00:14:01 +0300 Subject: Initial SSR --- vnext/server/middleware/renderer.js | 48 +++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 vnext/server/middleware/renderer.js (limited to 'vnext/server/middleware/renderer.js') diff --git a/vnext/server/middleware/renderer.js b/vnext/server/middleware/renderer.js new file mode 100644 index 00000000..8edb5f57 --- /dev/null +++ b/vnext/server/middleware/renderer.js @@ -0,0 +1,48 @@ +import ReactDOMServer from 'react-dom/server'; +import cookie from 'cookie'; + +// import our main App component +import App from '../../src/App'; + +import { getLinks } from '../sape'; +import { StaticRouter } from 'react-router-dom'; + +const path = require('path'); +const fs = require('fs'); + +const serverRenderer = async (req, res, next) => { + + // point to the html file created by CRA's build tool + const filePath = path.resolve(__dirname, '..', '..', 'dist', 'index.html'); + + // links + const cookies = cookie.parse(req.headers.cookie || ''); + + const links = await getLinks(req.originalUrl, cookies['sape_cookie']); + console.log(`URL: ${req.originalUrl} LINKS: ${links.join(' ')}`); + fs.readFile(filePath, 'utf8', (err, htmlData) => { + if (err) { + console.error('err', err); + return res.status(404).end(); + } + + const routerContext = {}; + + // render the app as a string + const html = ReactDOMServer.renderToString( + + + + ); + + // inject the rendered app into our html and send it + return res.send( + htmlData.replace( + '
', + `
${html}
` + ) + ); + }); +}; + +export default serverRenderer; -- cgit v1.2.3