EdgeOne Pages React Router Starter - SSR
Server-side rendering on every request with always-fresh data.
Perfect for dynamic, personalized content requiring real-time data and full SEO support.
SSR: Server-Side Rendering
This route always renders on the server for each request, fetching fresh data every time. Refresh the page to see updated timestamps and values.
Request Time: 2025-12-02T02:09:21.983Z
Server Time: 2025-12-02T02:09:21.983Z
Data Fetch Time: 2025-12-02T02:09:21.983Z
Real-time Value: 959
Timestamp: 1764641361983
Server Hash: i2pobd
Features
• Server-Side Rendering: Each request is rendered on the server with fresh data
• Dynamic Content: Content is always up-to-date and can be personalized
• Full SEO Support: Search engines receive fully rendered HTML with real-time content
• Server Processing: Requires server computation for each request
• Client Hydration: Server HTML becomes interactive after client-side hydration
• Flexible Routing: Supports both server-side and client-side navigation
SSR vs Pre-render Comparison
Rendering Mode
Data in SSR Mode
Data in Non-SSR
Performance
Server Load
Best For
🔄 Key Difference: SSR routes always render on the server per request. Pre-render routes can work in both SSR mode (fresh data) and non-SSR mode (static build-time data). Visit the Pre-render page to explore both behaviors!
export async function loader({}: Route.LoaderArgs) {
// This function runs on the server for EVERY request
const data = await fetch('https://api.example.com/real-time-data', {
cache: 'no-store' // Disable cache - ensures fresh data every time
});
const jsonData = await data.json();
return { data: jsonData };
}
export default function SSRPage({ loaderData }: Route.ComponentProps) {
const { data } = loaderData;
return (
<div>
<h2>SSR: Server-Side Rendering</h2>
<p>This page is rendered on the server for every request.</p>
<p>Request Time: {new Date().toISOString()}</p>
<p>Server Time: {new Date().toISOString()}</p>
<p>Real-time Data: {data.value}</p>
</div>
);
}