# 穿山甲 · Pangolin 官网(Astro 纯静态 / SSG) 获客入口官网,从 `design/ui_kits/website/` 迁移到 **Astro 纯静态站点(零 SSR)**。 设计目标:极致加载性能 + **整站可秒级复制到任意备用域名**(灾备关键,doc/01 §1、doc/05)。 - 完全静态、无 API 依赖、无第三方统计/CDN(隐私承诺)。 - i18n 双路由单显:`/`(中文)、`/en/`(English),不并排(设计铁律 6)。 - 与后端全部任务解耦,可独立并行开发与部署。 --- ## 快速开始 ```bash cd web/website npm ci # 干净、可复现安装(含自托管字体 @fontsource、Astro、React) npm run dev # 本地预览 http://localhost:4321 npm run build # 产物到 dist/(含 token 同源生成 + CSP 哈希注入) npm run preview # 预览构建产物 ``` 要求 Node `^18.20.8 || ^20.3.0 || >=22.0.0`。 ### 常用脚本 | 命令 | 作用 | |---|---| | `npm run build` | 构建静态产物到 `dist/`(`prebuild` 生成令牌,`postbuild` 注入 CSP 哈希) | | `npm run lint` | `astro check` 类型检查 | | `npm run scan:redline` | 扫描 `dist/` 红线词(脱敏铁律 13) | | `npm run hash:dist` | 打印 `dist/` 确定性指纹(主站/镜像一致性比对) | | `npm test` | 一键:生成令牌 → 构建 → CSP 哈希 → 红线扫描 | --- ## 目录结构 ``` web/website/ ├─ src/ │ ├─ layouts/Site.astro 整页布局(按 lang 单显),两路由复用 │ ├─ pages/index.astro / → lang="zh" │ ├─ pages/en/index.astro /en/ → lang="en" │ ├─ components/ │ │ ├─ *.jsx 交互组件(React island,@astrojs/react): │ │ │ Header / AnnouncementBar / SignupForm / PricingPlans │ │ ├─ *.astro 纯展示块(构建期渲染,零运行时 JS) │ │ ├─ Icon.astro Lucide 图标 → 构建期内联 SVG(替代原型的 unpkg CDN) │ │ └─ Brand.astro 品牌「行走穿山甲」内联 SVG │ ├─ i18n/strings.ts 中/EN 字典(逐字沿用 ui_kits/website/site.js 脱敏文案) │ └─ styles/ │ ├─ tokens.gen.css 由 design/colors_and_type.css 生成(见下) │ ├─ website.css 逐字迁自 ui_kits/website/website.css │ └─ site-extra.css 仅承载「原型内联 style= → 等价 class」 ├─ public/_headers Cloudflare Pages 安全头(严格 CSP + HSTS) ├─ scripts/ │ ├─ build-tokens.mjs 令牌同源生成器 │ ├─ csp-hashes.mjs 构建后注入内联片段 sha256 到 CSP │ ├─ check-redline.mjs 红线词扫描 │ └─ dist-hash.mjs 产物指纹 └─ .gitea/workflows/website.yml CI:构建+校验 → 同时发布主站与镜像 ``` --- ## 关键决策(务必理解) ### 1. 令牌同源(单一真相源) 颜色/字体/圆角/阴影等令牌的唯一真相源是仓库根 **`design/colors_and_type.css`**(铁律 1)。 `scripts/build-tokens.mjs` 在每次构建前把它读入并写出 `src/styles/tokens.gen.css`, **只移除其中加载 Google Fonts 的 `@import url('https://fonts.googleapis.com/...')` 一行** (任务硬性要求:不引第三方字体 CDN)。**令牌数值一字未改**,仍是单一来源、可随时再生。 > 若只拷贝了 `web/website/` 子目录到干净环境(源文件缺失),生成器自动沿用已提交的 > `tokens.gen.css`,构建照常。 ### 2. 字体全部自托管 原型用 Google Fonts CDN;本站改为 **`@fontsource/*`** 本地打包 (Sora / Manrope / Noto Sans SC / JetBrains Mono),woff2 随 `npm ci` 落地、 经构建产出到 `dist/_astro/`,由站点自身提供(`font-src 'self'`)。 **无任何第三方 CDN 请求** —— 性能 + 隐私 + 可达性。 ### 3. 安全头(严格 CSP / HSTS) `public/_headers` 下发严格 CSP:`default-src 'self'`,`script-src`/`style-src`/`font-src`/ `img-src`/`connect-src` 全部收敛到 `self`(白名单仅 self + 自托管资源),外加 HSTS(含 preload)、 `X-Content-Type-Options`、`X-Frame-Options: DENY`、`Referrer-Policy`、`Permissions-Policy`。 Astro island 水合产生的少量**内联** `