🚨 2026-11-10 托管变更:
*.autional.cn已迁出 Vercel —— 改为 mf01 构建(node:24-alpine + 钉版 pnpm)→ 香港自建托管。.cn的构建 env 由 workspaceshared/infra-ops/sites/sites.manifest.json注入;push 后由 mf01 cron(约 10 分钟)构建发布,不经 Vercel。*.autional.com仍在 Vercel —— 本文中涉及 Vercel 的构建/部署描述对.com仍然成立。 现行口径:workspacedocs/AUTIONAL-CN-SITES-SELF-HOST.md。
Stack: Astro 7 SSG + React 19 + Tailwind 4
Regions: www.autional.cn(zh)/ www.autional.com(en)——同一份源代码、两个区域项目(.com = Vercel,.cn = 香港自建),差异全部由构建期区域环境注入(B1 单源双区)。
构建期环境变量注入(.com 由 Vercel 项目 env;.cn 由 shared/infra-ops/sites/sites.manifest.json),astro.config.mjs 经 vite.define 内联为 PUBLIC_*(读取单点:src/lib/site-env.ts;落点表见工作区仓 workspace/docs/positioning/22-b1-execution-card.md §4.1 —— 该文档不在本仓,代码注释里的 docs/positioning/22 均为该文件的简写):
| Var | cn 项目 | com 项目 |
|---|---|---|
REGION |
cn |
com |
SITE_URL |
https://www.autional.cn |
https://www.autional.com |
DEFAULT_LANG |
zh |
en |
FALLBACK_LANG |
zh |
en |
CDN_HOST |
https://cdn.autional.cn |
https://cdn.autional.com |
本地 dev 无 env 时兜底 cn 值。站点域名 / CDN / 兄弟站 / GitHub 口径一律从 src/lib/site-env.ts 派生,禁止在页面里散落区域字面量。
pnpm install
pnpm dev # http://localhost:13118
pnpm build # 构建前跑 gen-static + check-i18n,产物在 dist/
pnpm typechecksrc/i18n/en-US.json/zh-CN.json:对称单键空间(嵌套键;数组长度 / 对象键集一致),页面文案全部键化;- 语言中立的结构数据(图标、日期、端口、路径等)留在页面代码里;
- 守卫脚本:
node scripts/check-i18n.mjs(G1 嵌套键 / G2 键集对称 / G3 递归非空 / G4 形状对称); - 各页面渲染语言 = 本区
DEFAULT_LANG;顶栏/页脚 chrome 支持就地语言切换(同一份资源)。
blog 与 cases 都走 Astro Content Layer(src/content.config.ts + glob() loader)。条目 id 形如 <lang>/<slug>(如 zh/novel),页面用 render(entry) 渲染。
| 规则 | 说明 |
|---|---|
只用 glob() loader |
禁止 type: 'content'(旧式集合) |
| 语言分目录 | src/content/<集合>/{zh,en}/;本区只读 DEFAULT_LANG 目录 |
| id → 路由 | postSlug(id) 去掉语言前缀(src/lib/content-lang.ts) |
⚠️ 旧式集合在 Astro 7 静默失效:type: 'content'集合被跳过(legacy.collectionsBackwardsCompat默认false)。构建不报错,只打[WARN] [content] The collection "x" does not exist or is empty。结果列表空、getStaticPaths0 条 ⇒ 详情页 404。2026-10-22/cases全空即此原因(见docs/vercel-deployment-notes.md)。
push 后:.cn 由 mf01 自动构建发布(约 10 分钟),.com 仍由 Vercel 构建(两项目共用本仓,靠上表 env 区分);构建期生成物(robots.txt / llms.txt / ai/skill.md / og 图)由 scripts/gen-static.mjs 按本区 env 落进 public/,不入库。
构建后守卫(postbuild → scripts/check-build.mjs,失败即构建失败,不发布):
| 断言 | 防的是什么 |
|---|---|
拒绝旧式 type: 'content' |
根因:Astro 7 静默跳过该集合 |
| 每个 verified 条目有详情页 + 被列表页链接 | 症状:列表空、详情 404 |
| sitemap 每个 URL 有产物文件 | 页面整体丢失 |
构建日志另需人工确认 [WARN] [content] 为 0 条(postbuild 读不到 build 的 stdout)。