Maltose:15 天重构博客,先写了 29 份 ADR 才敢写代码

💡 原文中文,约3900字,阅读约需10分钟。
📝

内容提要

作者用15天将博客从WordPress重构为Astro+React架构,并撰写了29份ADR文档。过程中遇到浏览量计数因WPGraphQL对象类型错误导致500、安全审查发现CORS全开、XSS漏洞及JWT类型不严谨等问题,评论系统经过8次提交打磨。核心经验是ADR工作流有助于记录决策和避免重复错误,安全审查是底线。

🔎

延伸解读

ADR 的价值:防失忆的决策记录

作者在重构中踩坑后,发现 80% 的问题源于“上次改的时候没想到”。因此从第 2 天起,每个决策都写成 ADR,记录背景、决策、备选方案及未选原因。29 份 ADR 并非流程合规,而是给自己留的防失忆保险,帮助避免重复错误,并在复杂架构中保持清晰思路。

GraphQL 的隐藏陷阱:类型与对象模型

在 WPGraphQL 中注册字段时,resolve 函数的参数是 WPGraphQL 的 Model 对象,而非原生 WP_Post,直接使用会导致 500 错误。这提醒开发者:GraphQL 字段的签名可能与你预期不同,需仔细阅读文档或调试,避免因对象类型不匹配而踩坑。

安全审查:博客虽小,风险不小

作者通过模拟攻击发现多个漏洞:CORS 全开、评论 XSS、JWT 类型不严谨、信任 User-Agent。这些看似小问题,却可能被恶意利用。安全审查不是 KPI,而是底线。即使博客访问量低,也应重视基础安全,如白名单、消毒、类型归一化、服务端解析等。

缓存设计的反思:简单优于复杂

作者最初设计了三层缓存与主动失效机制,但一周内多次被自己打脸,最终推倒重来,改用全局 network-only。这启示:复杂的缓存失效机制可能带来更多维护成本,不如想清楚谁才配拥有缓存,有时简单直接的方式更可靠。

Q&A

作者为什么在重构博客时写了29份ADR文档?

作者在重构博客过程中踩了很多坑,其中80%都是因为“上次改的时候没想到”。为了记录决策、避免重复犯错,从第2天起每个决策都写成ADR,包括背景、决策、备选方案及未选原因。29份ADR是给自己留的防失忆保险。

博客重构中浏览量计数遇到了什么坑?如何解决的?

浏览量计数最初通过WPGraphQL注册viewCount字段,但resolve函数中误将WPGraphQL的Model对象当作WP_Post使用,导致500错误。修复方法是使用array_map包装一层Model。后来因缓存失效复杂,最终放弃缓存,改为全局network-only策略。

安全审查中发现了哪些漏洞?分别如何修复?

发现四个漏洞:1) CORS配置为*,修复为白名单;2) 评论内容XSS,使用DOMPurify消毒;3) JWT中用户ID类型不严谨,统一用String()归一化;4) 信任浏览器User-Agent,改为服务端解析并只存设备类型。

评论系统打磨了哪些细节?

评论系统经过8次提交打磨,包括气泡样式对齐shadcn的Message架构、头像顶部对齐、配色映射到主题色板、头像加载失败回退、嵌套回复弹窗导航、提及颜色可读性、提及自动注入到第一条评论等。

博客重构后的技术架构是什么?

博客从WordPress重构为Astro 7 + React 19的headless架构,包管理器从npm换成pnpm,项目名为Maltose。

作者从这次重构中总结的核心经验是什么?

核心经验是ADR工作流有助于记录决策和避免重复错误,安全审查是底线。此外,与其设计复杂的缓存失效机制,不如想清楚谁才配拥有缓存。

🏷️

标签

➡️

继续阅读