getStaticPaths()
Astro genera sitios estáticos por defecto: cada ruta tiene que existir como archivo HTML ya armado en build, no se resuelve en cada visita. Para una ruta fija (about.astro) eso es automático. Para una ruta dinámica ([slug].astro) Astro no tiene forma de adivinar solo cuántas páginas hacen falta ni con qué valores — por eso el archivo tiene que exportar getStaticPaths(), una función que corre en build y devuelve la lista exacta de páginas a generar. Este mismo sitio lo usa en src/pages/[type]/[...slug].astro para generar la página de cada entrada de contenido.
Lo mínimo
Sección titulada «Lo mínimo»params define el valor de cada segmento dinámico del nombre de archivo.
---export async function getStaticPaths() { return [ { params: { slug: "primer-post" } }, { params: { slug: "segundo-post" } } ]}
const { slug } = Astro.params---props — Pasar datos sin meterlos en la URL
Sección titulada «props — Pasar datos sin meterlos en la URL»Lo que no forma parte de la URL va en props, no en params. Evita tener que volver a buscar la entrada dentro del componente.
---import { getCollection } from "astro:content"
export async function getStaticPaths() { const posts = await getCollection("blog") return posts.map((post) => ({ params: { slug: post.id }, props: { post } }))}
const { post } = Astro.props---Paginación con paginate()
Sección titulada «Paginación con paginate()»getStaticPaths recibe paginate como argumento cuando el archivo se llama [...page].astro. Genera automáticamente una página por bloque de pageSize items.
---export async function getStaticPaths({ paginate }) { const posts = await getCollection("blog") return paginate(posts, { pageSize: 10 })}
const { page } = Astro.props---
<p>Página {page.currentPage} de {page.lastPage}</p>{page.data.map((post) => <a href={`/blog/${post.id}`}>{post.data.title}</a>)}{page.url.prev && <a href={page.url.prev}>Anterior</a>}{page.url.next && <a href={page.url.next}>Siguiente</a>}API en una mirada
Sección titulada «API en una mirada»| Campo | Qué es |
|---|---|
params | Valores de los segmentos dinámicos del nombre de archivo (deben coincidir exacto) |
props | Cualquier otro dato que la página necesite, fuera de la URL |
paginate(items, { pageSize }) | Divide un array en páginas, requiere [...page].astro |
page.data / page.currentPage / page.url.prev / page.url.next | Lo que devuelve paginate(), disponible en Astro.props.page |
Escala, cobertura y errores
Sección titulada «Escala, cobertura y errores»getStaticPaths()corre en build, no en el navegador — no tiene acceso aAstro.requestni a nada que dependa de la petición real.- Los valores de
paramsdeben ser strings (oundefinedpara un segmento opcional en[[slug]]) — un número hay que convertirlo conString(). - En modo
output: 'server', las rutas dinámicas no necesitangetStaticPaths(): se resuelven en cada request, como en Next.js con rutas dinámicas singenerateStaticParams.