本章要回答的问题: 站点从哪里开始构建,静态 _headers 和 robots.txt 又怎样参与发布后的行为?
输入是 site 目录中的 package manifest 和两个 public 文件;输出分成两部分:pnpm/Node/Astro 的构建命令链,以及部署平台可能转换成 HTTP 响应提示和爬虫规则的静态文本。它们都不启动登录系统,也不改变 runtime。
1. package.json 连接准备、生成和 QA
site/package.json · L1–L16 · 打开完整源码
{
"name": "pysolate-spine-site",
"private": true,
"type": "module",
"packageManager": "pnpm@10.30.3",
"scripts": {
"build": "node scripts/prepare.mjs && astro build && node scripts/verify.mjs",
"test": "node scripts/prepare.mjs && node scripts/excerpts.test.mjs && node scripts/go-patterns.test.mjs && node scripts/lessons.test.mjs && node scripts/research.test.mjs",
"dev": "node scripts/prepare.mjs && astro dev",
"preview": "astro preview",
"deploy": "bash scripts/deploy.sh"
},
"dependencies": {
"astro": "7.2.4"
}
}
根对象先声明站点包名、private、ES module 模式和预期的 pnpm 版本。private: true 防止把站点包发布到公共 registry;type: module 让脚本使用 import;packageManager 记录工具版本,减少不同环境解释脚本的差异。
scripts.build 是整条数据流的入口:
node scripts/prepare.mjs
→ astro build
→ node scripts/verify.mjs
shell 的 && 让每一步都依赖前一步成功。准备阶段先写 .generated/,Astro 再把内容和源码数据渲染成 dist,验证器最后检查静态产物。准备或 Astro 失败时不会运行后续阶段;验证失败时 pnpm build 仍然返回失败。
dev 先准备同一份生成数据再启动 Astro 开发服务;preview 只预览已有构建,不重新准备或构建;deploy 把发布委托给 scripts/deploy.sh,manifest 只声明入口,不展开托管细节。依赖区当前声明 Astro 7.2.4,它影响内容 loader、静态路径和 Code 组件的构建行为。
因此,“运行 pnpm preview”不等于“拿到最新源码”:需要先重新执行 build,或明确运行准备阶段。
2. _headers 描述响应级搜索和浏览器策略
site/public/_headers · L1–L5 · 打开完整源码
/*
X-Robots-Tag: noindex, nofollow, noarchive, nosnippet
Referrer-Policy: no-referrer
X-Content-Type-Options: nosniff
Cache-Control: no-cache
_headers 是部署平台约定的静态配置:第一行 /* 让规则匹配所有路径;其余行声明:
X-Robots-Tag与 HTML meta 保持 noindex、nofollow、noarchive、nosnippet;Referrer-Policy: no-referrer不向后续请求发送来源 URL;X-Content-Type-Options: nosniff防止浏览器随意猜测媒体类型;Cache-Control: no-cache要求缓存重新验证,而不是承诺永不存储。
这些文本只有被支持该约定的托管平台解析并写入 HTTP 响应后才真正生效。本地仓库文件不会自动成为浏览器响应头,验证器也只检查文本契约,不替托管层做线上回读。
3. robots.txt 让 crawler 看见 noindex
site/public/robots.txt · L1–L4 · 打开完整源码
# Crawlers must be able to read the noindex meta/header.
# Disallowing all crawling could hide noindex and leave URL-only search listings.
User-agent: *
Allow: /
前两行注释说明设计原因:如果直接禁止所有抓取,crawler 可能看不到页面里的 noindex,只留下只有 URL 的搜索条目。User-agent: * 将规则应用于所有 crawler,Allow: / 允许它们读取站点路径。
这不是“请求许可”的设置。网络、托管平台、网关或鉴权系统决定谁能请求文件;robots 给 crawler 的是爬取建议;HTML meta 与 X-Robots-Tag 才是索引提示。三者分工不同,Allow: / 不能推出站点私有,noindex 也不能阻止知道 URL 的人访问。
4. 配置如何接回构建验收
pnpm build 会把 public/ 内容复制到 dist,所以 _headers 与 robots.txt 成为验证器可以读取的产物。verify.mjs 检查 headers 的全路径规则和 X-Robots-Tag,检查 robots 的 User-agent: *、Allow: / 以及不存在根路径 Disallow。这样至少能发现文件被漏复制或文本意图被改写。
它仍不能证明目标托管平台解析了 _headers,也不能证明 crawler 的实际行为,更不提供访问鉴权。要沿完整交接继续读 站点构建管线 与 构建后 QA;要看 meta 怎样进入 HTML,读 页面外壳。
读完本章,应能回答:为什么 build 的三个脚本必须串行?robots.txt 为什么允许读取却仍然配合 noindex?哪些配置只在部署平台解析后才具有 HTTP 效果?