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.html

Tabela tras

MożliwośćPlikURL
Statycznaindex.ht.js/
Zagnieżdżonablog/index.ht.js/blog
Dynamicznablog/[slug].ht.js/blog/my-post
Wiele parametrówblog/[year]/[slug].ht.js/blog/2026/my-post
Catch-alldocs/[...path].ht.js/docs/api/auth
Opcjonalny catch-alldocs/[...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.

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))
  )

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.