/** * This is the entry for static-site-generation(ssg)'s server side render. * Used in: "ssr mode" * ("ssr" is used in many places in this project to refer to "ssg". Should have called it ssg mode...) */ import React from 'react' import ReactDOM from 'react-dom/server' import { StaticRouter } from 'react-router-dom/server' import App from '../App' import { dataCacheCtx } from '../ctx' import type { PagesLoaded, SSRPlugin } from '../../../clientTypes' import ssrData from '/@react-pages/ssrData' export { ssrData } // put all page data in cache, so that we don't need to load it in ssr const dataCache: PagesLoaded = ssrData export function renderToString(url: string, ssrPlugins?: SSRPlugin[]) { let ssrApp: React.ReactNode = const extractStyleArr: (() => string)[] = [] ssrPlugins?.forEach((ssrPlugin) => { const { app, extractStyle } = ssrPlugin.prepare(ssrApp) if (extractStyle) extractStyleArr.push(extractStyle) if (app) ssrApp = app }) const contentText = ReactDOM.renderToString(ssrApp) const styles = extractStyleArr .map((extractStyle) => { return extractStyle() }) .filter(Boolean) const styleText = styles.join('\n') return { contentText, styleText, } } function SSRApp({ url }: { url: string }) { return ( ) }