外观
架构与核心流程
系统组成与边界
源码根目录:blog。路径均相对该目录。
- 本地内容 →
contentlayer.config.ts定义文档、slug、目录和内容转换。 - 页面与元数据 →
app/page.tsx、app/blog/[...slug]/page.tsx、app/sitemap.ts、app/robots.ts。 - 阅读布局 →
layouts/,可交互组件位于components/。 - 贡献数据 →
components/GitHubHeatmap.tsx在服务端请求第三方贡献 API,再交给客户端 SVG 组件渲染。 - 本次未发现需要写入简历的独立 Go 业务服务。Next.js 服务端组件与路由不等同于 Go 后端经历。
核心请求流程
- 写入或修改内容,Contentlayer 按配置构建类型化内容数据及派生字段。
- 文章路由根据 slug 查找非草稿文章,生成静态参数与页面元数据,未找到则返回
notFound()。 - MDX 内容经布局组件呈现,文章目录在浏览器监听滚动并更新活动项。
- 服务端获取贡献数据,配置
revalidate: 3600;失败时返回提示 UI,成功时交给客户端组件显示。 - 贡献动画使用 requestAnimationFrame;页面隐藏时不推进动画状态,减少动画偏好开启时不启动动画。
数据模型与接口
- 内容侧重点:slug、draft、title、summary、date、toc 等;字段与派生逻辑见
contentlayer.config.ts。 - 文章侧:
generateStaticParams、generateMetadata,同时输出文章结构化数据;不等同于搜索排名或收录结果。 - 贡献侧:日期、贡献次数、level、total;请求包含一小时再验证配置,不宣称每个访问都实时同步 GitHub。
- 搜索与评论等扩展要核对配置启用状态;配置里有 provider 不能直接当成已上线功能。
验证与证据
- 本地检查:文章标题、目录锚点、草稿过滤、未知 slug、移动端折叠目录、主题切换。
- 第三方失败:模拟贡献 API 非 2xx 和网络失败,核对错误 UI。
- 部署结果待确认;本次只做静态阅读,未执行构建或浏览器验证。