第 11 / 11 章

站点壳、样式与改码地图

页眉页脚、分域样式、客户端边界注意点,以及按目标打开文件的完整对照表。

⏱ 4 分钟1147 字

站点壳与其它组件§

components/site/site-header.tsx§

客户端:用 usePathname 判断「文章 / 系列 / 标签」哪一项高亮;右侧嵌 ThemeToggle,并展示静态站状态点文案。

components/site/theme-toggle.tsx§

系统 / 浅色 / 深色三态,基于 useTheme()。同样有挂载门闩,避免主题未恢复时闪错图标。

列表与系列 UI§

组件用途
components/posts/post-card.tsx散篇卡片(可嵌 ReadingChip)
components/series/series-card.tsx小册卡片(首页 / /series)
components/series/series-toc.tsx小册首页大目录 + ChapterPager
components/series/series-chapter-rail.tsx章节页左侧本册导轨
components/series/series-chapter-strip-client.tsx窄屏横向切章(仅 import series-path)
components/reading/reading-chip.tsx按 progressKey 显示已读百分比

components/site/site-footer.tsx§

页脚链到系列小册与全部标签。

app/styles/:设计系统落在哪§

app/globals.css 只做聚合导入;样式按域拆在 app/styles/:

  1. tokens.css:@theme 与深/浅语义 RGB
  2. base.css:页面底色、选区等
  3. site.css:通用壳、系列三栏、入口动效、主题切换
  4. prose.css / code.css / reading.css / photos.css:对应领域组件类

系列三栏相关样式要点:

  • .series-chapter-frame 大屏三列;默认 stretch
  • .series-chapter-sticky:top: 5.5rem + max-height + 内部滚动
  • .series-rail*:本册导轨、当前章竖条高亮、册内进度条
  • .series-strip*:窄屏横向芯片(约 <1080px 显示,大屏隐藏)

颜色策略:朱红(accent)几乎只用于链接、焦点与进度;jade 用于在线状态点。

排版专题见散篇《建站四问》。

客户端边界(系列踩过的坑)§

会 fs.readFile 的 lib/series.ts 不能被 "use client" 模块直接引用。横向章节条只从 lib/series-path.ts 取 chapterHref / seriesHref。否则 Turbopack 会在打包客户端时报「不支持 external modules (node:fs)」。

scripts/ 与 types/§

  • scripts/screenshot.mjs、theme-shot.mjs:可选的 Playwright 截图巡检
  • types/prism*.d.ts:给 Prism 副作用导入补类型

设计取舍(对应到代码位置)§

  1. 文件即内容库——散篇 lib/posts.ts,小册 lib/series.ts;换 CMS 等于重写这两层。
  2. 散篇与系列并列目录——不用 frontmatter 硬塞「系列字段」,URL 与静态参数更直观。
  3. 目录 id 双端同源——extractToc 与 rehype-slug 共用 GitHub 风格 slug。
  4. 客户端下沉——页面主体仍是服务端组件;进度、代码块、主题、横向章节条等才标 "use client"。
  5. 进度只存历史——partialize 只持久化 history;系列用带前缀的 progressKey。
  6. 路径辅助与读盘拆分——series-path.ts 可进客户端;series.ts 只在服务端。
  7. 长文进系列——避免首页时间线被超长单篇淹没。
  8. 沙箱默认不给 same-origin——预览能跑脚本,不易直接碰父页面 DOM。

改功能时打开哪扇门§

你想改的事优先打开的文件
新增 / 修改散篇content/posts/*.mdx
新增一册小册content/series/{册}/series.json + 各章 .mdx
修改本册某一章content/series/{册}/*.mdx
字数算法、刊号lib/posts.ts
标签聚合(posts + series)lib/tags.ts
系列索引、章序、progressKeylib/series.ts
系列 URL 拼接(含客户端)lib/series-path.ts
MDX 插件顺序或编译入口lib/mdx.tsx
代码围栏合并、高亮写入 ASTlib/rehype.ts(概览见「rehype 源码」;rehypeCodeGroups 逐步执行见扩展篇)
支持更多高亮语言lib/prism.ts + lib/code-lang.ts
Callout、标题锚点、表格包裹components/mdx/index.tsx
Tab / 复制 / 沙箱components/mdx/code-block.tsx
顶部进度条手感components/reading/progress-bar.tsx
本章折线 / 手机目录components/reading/reading-path.tsx
进度存储策略components/reading/store.ts
继续阅读芯片时机components/reading/article-shell.tsx
本册左侧导轨components/series/series-chapter-rail.tsx
窄屏横向切章components/series/series-chapter-strip-client.tsx
小册列表卡片components/series/series-card.tsx
小册首页目录components/series/series-toc.tsx
章已读百分比components/reading/reading-chip.tsx
首页结构(含系列区块)app/page.tsx
散篇版式app/posts/[slug]/page.tsx
系列列表 / 小册封面app/series/page.tsx、app/series/[series]/page.tsx
章节三栏阅读台app/series/[series]/[chapter]/page.tsx
三栏 / 导轨 / 横条外观app/styles/site.css(搜索 series-chapter)
顶栏「系列」导航components/site/site-header.tsx
站点名、日期、站点 URLlib/site.ts
sitemap / robotsapp/sitemap.ts、app/robots.ts

本册是「对着仓库读」的地图,不是替代各专题散篇:代码围栏作者语法、进度动效动机、颜色与字体取舍,仍以对应散篇为准。系列版块的内容模型与 API 细节,以「系列小册」那一章为准;页面挂载与 sticky 约定,以「页面与路由」那一章为准。