SolidJS supports Server-Side Rendering (SSR) with multiple rendering modes:
Basic SSR Setup:
javascript// entry-server.jsx import { renderToString } from 'solid-js/web'; import App from './App'; export function render(url) { return renderToString(() => <App url={url} />); } // entry-client.jsx import { hydrate } from 'solid-js/web'; import App from './App'; hydrate(() => <App />, document);
Rendering Modes:
- Static Site Generation (SSG):
javascriptimport { renderToStringAsync } from 'solid-js/web'; export async function getStaticPaths() { return ['/about', '/contact']; } export default async function Page({ params }) { return renderToStringAsync(() => <Component />); }
- Server-Side Rendering (SSR):
javascriptimport { StartServer, createHandler } from '@solidjs/start/server'; export default createHandler(() => ( <StartServer document={({ assets, children }) => ( <html> <head>{assets}</head> <body>{children}</body> </html> )} /> ));
- Streaming Rendering:
javascriptimport { renderToStream } from 'solid-js/web'; app.get('*', async (req, res) => { const stream = renderToStream(() => <App />); stream.pipe(res); });
Data Fetching:
javascript// Using createResource for async data const [data] = createResource(fetchData, { initialValue: null, deferStream: true // Supports streaming }); // Server-side data prefetch export async function getData() { return await fetchData(); }
Isomorphic Application:
javascript// Code that runs on both server and client function Component() { const isServer = useIsServer(); return ( <div> {isServer() ? 'Server' : 'Client'} </div> ); }
Performance Optimization:
- Use
deferStreamfor lazy loading - Prefetch critical data
- Optimize hydration process
- Use Suspense boundaries