19. Server-Side Rendering
По умолчанию Astro генерирует статические HTML-файлы при сборке. Но иногда нужны живые данные: персонализированный контент, аутентификация, формы. Для этого Astro поддерживает SSR — рендеринг страниц на сервере по запросу.
Думай о разнице так: статика — это книга, напечатанная один раз; SSR — это диктор, который читает текст заново для каждого слушателя.
Включение SSR
Заголовок раздела «Включение SSR»import { defineConfig } from 'astro/config';import node from '@astrojs/node';
export default defineConfig({ output: 'server', // 'static' | 'server' | 'hybrid' adapter: node({ mode: 'standalone', }),});Режимы:
'static'— всё статично (по умолчанию)'server'— всё через SSR, кроме явно помеченныхexport const prerender = true'hybrid'— всё статично, кроме явно помеченныхexport const prerender = false
Установка адаптера
Заголовок раздела «Установка адаптера»# Vercelnpx astro add vercel
# Netlifynpx astro add netlify
# Node.jsnpx astro add node
# Cloudflare Workersnpx astro add cloudflareКаждый адаптер настраивает вывод проекта под конкретную платформу деплоя.
Объект Astro.request
Заголовок раздела «Объект Astro.request»---// Доступен только в SSR-режиме (output: 'server')const { request, url, cookies, redirect } = Astro;
// Заголовки запросаconst userAgent = request.headers.get('user-agent');const lang = request.headers.get('accept-language');
// URL параметрыconst page = url.searchParams.get('page') ?? '1';
// IP клиента (через заголовок прокси)const ip = request.headers.get('x-forwarded-for');
// Метод запросаif (request.method === 'POST') { const data = await request.json();}---Cookies и сессии
Заголовок раздела «Cookies и сессии»---import { defineMiddleware } from 'astro:middleware';
// Чтение cookieconst theme = Astro.cookies.get('theme')?.value ?? 'dark';const sessionToken = Astro.cookies.get('session')?.value;
// Запись cookieAstro.cookies.set('theme', 'light', { httpOnly: false, secure: true, sameSite: 'strict', maxAge: 60 * 60 * 24 * 30, // 30 дней path: '/',});
// Удаление cookieAstro.cookies.delete('session', { path: '/' });---Аутентификация с SSR
Заголовок раздела «Аутентификация с SSR»---const session = Astro.cookies.get('session')?.value;
if (!session) { return Astro.redirect('/login?from=/dashboard', 302);}
const user = await validateSession(session);if (!user) { Astro.cookies.delete('session'); return Astro.redirect('/login', 302);}---
<h1>Привет, {user.name}!</h1>Streaming responses
Заголовок раздела «Streaming responses»---// Отправляем HTML частями по мере готовностиimport { renderToReadableStream } from 'react-dom/server';---
<html> <body> <h1>Загружаем данные...</h1> <!-- Astro автоматически стримит контент ниже --> {async function* () { const posts = await slowDatabase.getPosts(); for (const post of posts) { yield <article><h2>{post.title}</h2></article>; } }()} </body></html>