跳到正文

架构与核心流程 ​

系统组成与边界 ​

源码根目录: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 后端经历。

核心请求流程 ​

  1. 写入或修改内容,Contentlayer 按配置构建类型化内容数据及派生字段。
  2. 文章路由根据 slug 查找非草稿文章,生成静态参数与页面元数据,未找到则返回 notFound()。
  3. MDX 内容经布局组件呈现,文章目录在浏览器监听滚动并更新活动项。
  4. 服务端获取贡献数据,配置 revalidate: 3600;失败时返回提示 UI,成功时交给客户端组件显示。
  5. 贡献动画使用 requestAnimationFrame;页面隐藏时不推进动画状态,减少动画偏好开启时不启动动画。

数据模型与接口 ​

  • 内容侧重点:slug、draft、title、summary、date、toc 等;字段与派生逻辑见 contentlayer.config.ts。
  • 文章侧:generateStaticParams、generateMetadata,同时输出文章结构化数据;不等同于搜索排名或收录结果。
  • 贡献侧:日期、贡献次数、level、total;请求包含一小时再验证配置,不宣称每个访问都实时同步 GitHub。
  • 搜索与评论等扩展要核对配置启用状态;配置里有 provider 不能直接当成已上线功能。

验证与证据 ​

  • 本地检查:文章标题、目录锚点、草稿过滤、未知 slug、移动端折叠目录、主题切换。
  • 第三方失败:模拟贡献 API 非 2xx 和网络失败,核对错误 UI。
  • 部署结果待确认;本次只做静态阅读,未执行构建或浏览器验证。

理解机制,讲清取舍,用复盘检验掌握。