跳到正文

面试追问 ​

状态:未准备;以下是答题提纲,需结合本人提交记录补具体改动。

1. 博客哪些是你做的,哪些来自模板? ​

  • 我的方案:先列出模板来源与继承能力,再指出本人新增 / 修改的组件和行为。
  • 选择理由:明确个人贡献,避免把依赖功能当作原创实现。
  • 替代方案与适用边界:从零开发可以更自由,但不应为了简历重写成熟基础能力。
  • 实际结果与证据:待补原模板对照、提交记录和页面截图。
  • 关联代码:相对源码根目录的 components/ArticleToc.tsx、components/GitHubContributionBoard.tsx。
  • 后续追问:为什么改这个组件?原先有什么问题?如何证明效果?

2. 目录为什么用 rAF,为什么不用 IntersectionObserver? ​

  • 我的方案:scroll 回调取消尚未执行的帧并重新调度,在帧回调中扫描标题位置更新活动项。
  • 选择理由:便于按顶部偏移定义当前章节;不是消除所有布局计算。
  • 替代方案与适用边界:IntersectionObserver 适合观察可见性,需要另行定义多个标题同时出现时的选择规则。
  • 实际结果与证据:行为和清理逻辑可阅读,运行与性能对比待做。
  • 关联代码:components/ArticleToc.tsx。
  • 后续追问:快速滚动会怎样?依赖变化如何清理?为什么设置 passive?

3. 服务端组件和客户端组件怎么分? ​

  • 我的方案:服务端组件请求贡献数据,客户端组件处理 SVG 动画和浏览器事件。
  • 选择理由:浏览器 API 放在客户端,网络请求和错误降级集中在服务端组件。
  • 替代方案与适用边界:客户端请求适合强交互刷新,但需要处理 loading、错误与缓存;服务端数据也可能过时。
  • 实际结果与证据:源码设置一小时再验证,页面隐藏时不推进动画;不是实测性能提升。
  • 关联代码:components/GitHubHeatmap.tsx、components/GitHubContributionBoard.tsx。
  • 后续追问:rAF 为何用 ref?隐藏页面时是否取消循环?减少动画偏好如何响应?

4. 文章如何从 MDX 变成页面? ​

  • 我的方案:Contentlayer 提取字段与目录、执行插件,App Router 按 slug 选择文章和布局。
  • 选择理由:适合本地文件写作与类型化读取。
  • 替代方案与适用边界:多人编辑可以引入 CMS;当前并非在线编辑后台。
  • 实际结果与证据:生成的静态参数、元数据和 HTML 待运行检查;模板能力与个人改动分开说明。
  • 关联代码:contentlayer.config.ts、app/blog/[...slug]/page.tsx。
  • 后续追问:草稿怎么过滤?未知 slug 如何处理?SEO 与性能分别怎样验证?

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