Routing
Trasy biorą się wprost z systemu plików, spod src/.
src/
index.ht.js → /
about.ht.js → /about
blog/
index.ht.js → /blog
[slug].ht.js → /blog/:slug
docs/
[...path]?.ht.js → /docs, /docs/a, /docs/a/b, ...
(admin)/
users.ht.js → /users
404.ht.js → dist/404.htmlTabela tras
| Możliwość | Plik | URL |
|---|---|---|
| Statyczna | index.ht.js | / |
| Zagnieżdżona | blog/index.ht.js | /blog |
| Dynamiczna | blog/[slug].ht.js | /blog/my-post |
| Wiele parametrów | blog/[year]/[slug].ht.js | /blog/2026/my-post |
| Catch-all | docs/[...path].ht.js | /docs/api/auth |
| Opcjonalny catch-all | docs/[...path]?.ht.js | /docs + głębiej |
| Grupy tras | (admin)/users.ht.js | /users |
Wygrywają trasy bardziej szczegółowe: statyczna bije dynamiczną, dynamiczna bije catch-all. Dwa pliki generujące ten sam URL to błąd buildu.
generateStaticParams
Trasy dynamiczne deklarują, które strony wypuścić podczas buildu. W sitelo (dev) trasy dynamiczne nadal renderują się na żądanie, bez wyliczania każdego parametru.
export function generateStaticParams() {
return [
{ slug: 'hello-world' },
{ slug: 'my-first-post' },
]
}
export default ({ params }) => `
<html><body><h1>${params.slug}</h1></body></html>
`import { html, body, h1 } from 'javascript-to-html'
export function generateStaticParams() {
return [
{ slug: 'hello-world' },
{ slug: 'my-first-post' },
]
}
export default ({ params }) =>
html(
body(h1(params.slug))
)export function generateStaticParams() {
return [
{ slug: 'hello-world' },
{ slug: 'my-first-post' },
]
}
export default function Post({ params }) {
return (
<html>
<body>
<h1>{params.slug}</h1>
</body>
</html>
)
}Wartości mogą być ciągami znaków, liczbami albo wartościami logicznymi — są zamieniane na tekst i kodowane do URL-a. Parametry catch-all przyjmują tablice ({ path: ['a', 'b'] }) albo ciągi rozdzielone ukośnikami ({ path: 'a/b' }).
Strona dynamiczna, która generuje zero tras, wypisuje ostrzeżenie, więc nie może po cichu zniknąć z witryny.