部署指南

构建产物是纯静态文件:跑一次 pnpm exec vite build,build.outDir(本站为 dist)里就是完整站点。任何能托管静态文件的服务都能部署,运行时不需要 Node,也没有服务器端渲染或 API 依赖。

产物结构

text
dist/
├── index.html                 # 每页一个独立 .html,目录即路由
├── guide/
│   ├── index.html             # 目录索引页
│   └── getting-started.html
├── assets/
│   ├── ...                    # 客户端 js/css(主题 chrome + islands runtime)
│   └── img/                   # 正文图片,内容 hash 命名
├── rss.xml                    # 最新 20 篇文章的订阅源
├── sitemap.xml                # 全部路由
├── robots.txt
├── 404.html                   # 未命中路径的回退页(完全内联、noindex)
└── _headers                   # 默认产出:Cloudflare Pages / Netlify 的缓存头

hostname 与子路径

hostname 是站点的规范 origin(不带尾斜杠),用于 canonical/og meta、RSS、sitemap 与 robots.txt 里的绝对链接,上线前务必配成真实域名:

ts
defineSiteConfig({ hostname: 'https://absolute-docs.pages.dev' });

页面内部资源与站内链接全部使用按页面深度生成的相对前缀(根页面 '',一级子目录 '../',依此类推),代码里不存在绝对路径假设。因此站点部署在域名根路径还是子路径(如 https://example.com/blog/)行为完全一致,换部署位置零配置改动。

各主机部署要点

产物没有服务器端要求,主流平台都是零配置或近零配置:

缓存策略建议:assets/ 内的文件名带内容 hash(图片是 名称.8位hash.扩展名),可以放心长缓存(assets/* 的 immutable 长缓存已由默认产出的 _headers 在 Cloudflare Pages / Netlify 上落地);.html 与 rss.xml / sitemap.xml 用短缓存或协商缓存,保证发布后立即生效。

构建即校验

构建过程自带两类检查,CI 里跑一次构建就能拦下大部分上线事故:

把构建命令接进 CI(或直接用托管平台的构建流水线)即可获得这两道闸门;本站的 vite.config.ts 就是一个可直接参考的完整配置。

持续集成建议

一个最小可行的发布流程:

sh
pnpm verify                                  # 格式/静态检查/单测
pnpm exec vite build                         # 或 docs 专用配置
pnpm exec playwright test                    # e2e(自起 preview 服务)

git 历史决定每页的「最后编辑时间」,CI 必须拉取完整历史再构建。GitHub Actions 的 actions/checkout 默认 fetch-depth: 1(浅克隆),整个历史只剩一个提交,所有文章的更新时间会塌缩成构建触发时刻(构建日志会给出浅克隆警告):

yaml
- uses: actions/checkout@v5
  with:
    fetch-depth: 0

托管平台绑定仓库后,把「构建命令」与「输出目录」填成上面的构建与产物目录即可;换域名只改站点配置里的 hostname 一处,rss.xml / sitemap.xml / robots.txt 下次构建自动跟随。