本站构建
这一页记录这个网站是怎么做出来、怎么维护的。它本身也是一个小工程,有些取舍值得写下来。
静态优先
整站用 Astro 生成静态 HTML。作品页里需要交互的部分用 React 渲染,只在需要的地方加载脚本;文章页基本是纯 HTML 和 CSS。没有服务端程序,也就没有需要打补丁的运行时。
一份资料,多处使用
个人简介、经历、论文、专利和联系方式只在一个 JSON 文件里维护,首页、关于页、论文页和结构化数据都由它生成。生成出来的快照不允许手改,检查脚本会比对哈希,避免不同页面说法不一致。
先批准,再发布
写作目录里同时放着公开文章和私人笔记,目录位置不代表可以公开。只有正文哈希登记在发布白名单里的文章,才会进入构建、搜索索引和 RSS。文章改过一个字,哈希就变了,必须重新审核才能再次公开。构建之后,还有一道独立检查扫描产物,确认没有未批准的内容和附件混进去。
搜索、订阅与分享
站内搜索用 Pagefind 在构建时生成索引,在浏览器里本地检索,不调用外部服务。RSS 提供每篇文章的摘要。每篇文章和每个作品都会在构建时生成自己的分享卡片。
不追踪访客
页面里没有第三方统计、广告或社交插件脚本。内容安全策略只允许本站脚本执行,内联脚本逐个登记哈希。
排版
中文标题用思源宋体(Noto Serif SC),正文用思源黑体(Noto Sans SC),英文用 Inter,代码用 JetBrains Mono,都按 SIL Open Font License 使用,并裁成子集以减小体积。
发布
每次发布前都要跑完一组检查:类型检查、单元测试、隐私回归、构建产物校验、性能与体积预算和浏览器测试。通过之后把产物冻结成一个包,记录哈希,再上传到服务器,出问题可以回滚到上一个包。