路由
路由直接来自 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路由对照表
| 特性 | 文件 | URL |
|---|---|---|
| 静态 | index.ht.js | / |
| 嵌套 | blog/index.ht.js | /blog |
| 动态 | blog/[slug].ht.js | /blog/my-post |
| 多个参数 | blog/[year]/[slug].ht.js | /blog/2026/my-post |
| 全捕获 | docs/[...path].ht.js | /docs/api/auth |
| 可选全捕获 | docs/[...path]?.ht.js | /docs 及更深层 |
| 路由分组 | (admin)/users.ht.js | /users |
更具体的路由优先:静态胜过动态,动态胜过全捕获。两个文件生成同一个 URL 会导致构建报错。
generateStaticParams
动态路由声明构建时要产出哪些页面。在 sitelo(dev)中,动态路由仍会按需渲染,无需逐一列出参数。
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>
)
}取值可以是字符串、数字或布尔值 —— 它们会被转成字符串并做 URL 编码。全捕获参数接受数组({ path: ['a', 'b'] })或以斜杠分隔的字符串({ path: 'a/b' })。
没有生成任何路由的动态页面会打印一条警告,免得它从站点里悄无声息地消失。