2637 字
13 分钟
页面浏览--访问次数--
返回首页
Shirone 改造记(六):这个站由哪些零件拼起来

第一篇里说过双仓分离是为什么。这篇说它长什么样。

我把两份目录树完整列一遍,每个文件夹、每个顶层文件是干什么的,最后给一张速查表。你要是刚把主题拉下来、不知道从哪下手,看完这篇应该能少翻几遍文档。

先记住:这个站是两个仓库#

仓放什么改动频率
代码仓 Shirone主题源码、构建脚本、测试、文档一年动几次
内容仓 shirone-content文章、说说、配置、图片天天动

两个仓并排放:

E:\jisuanji\PycharmProjects\
├── Shirone\ 代码仓
└── shirone-content\ 内容仓

代码仓根目录里放一个清单文件,告诉构建内容在哪:

shirone.content.json
{
"schemaVersion": 1,
"source": {
"type": "path",
"path": "../shirone-content"
}
}

有了它,pnpm dev 和 pnpm build 会先把内容仓物化到代码仓的对应位置,再开始构建。物化关系是固定的:

内容仓物化到代码仓说明
content/src/content/直接拷贝
data/src/data/直接拷贝
assets/src/assets/直接拷贝,构建期参与图片优化
public/public/直接拷贝,原样进 dist/
config/编译进 src/user/user-config.ts不拷贝,YAML 编译成 TypeScript 再和默认值深合并

代码仓:主题和构建都在这#

顶层#

代码仓 Shirone/
  • astro.config.mjs构建总开关:集成、插件、Vite、字体
  • src主题源码,唯一的正文
  • scripts构建辅助脚本(图标、字体、图片、内容同步)
  • public原样拷贝的静态文件
  • tests端到端测试(Playwright)
  • docs主题开发文档,26 篇
  • rules硬规矩:无障碍、性能、组件 API、常见陷阱
  • artifacts检查产物(Lighthouse 报告)
  • .github/workflowsCI 与部署流水线
  • shirone.content.json指向内容仓
  • content.lock.json上次同步的锁定记录(源 commit + 各挂载点文件数)
  • package.json脚本入口
  • pnpm-lock.yaml依赖锁定
  • svelte.config.jsSvelte 编译器配置
  • tsconfig.jsonTypeScript 配置
  • biome.json代码检查与格式化规则
  • frontmatter.json编辑器扩展 Front Matter 的配置(可视化改 frontmatter 用)
  • pagefind.yml离线全文搜索的索引配置
  • playwright.config.ts端到端测试配置
  • lighthouserc.cjs性能检查的阈值配置
  • vercel.json部署平台配置(主题自带,本项目没用)
  • AGENTS.md给 AI 助手的项目说明
  • DESIGN.md设计规范
  • INDEX.md部署分层索引
  • README.md / CONTRIBUTING.md / LICENSE

src/:主题源码#

代码仓 src/
  • config27 个配置域,注释即文档
  • pages一个文件 = 一个网址
  • layouts页面骨架
  • components按原子化分层:atoms / molecules / organisms / content / system
  • pluginsMarkdown 扩展(提示框、图片网格、剧透、Mermaid……)
  • utils工具模块,69 个
  • styles全局样式与设计令牌
  • i18n界面文案,10 种语言
  • integration内容分离与配置叠加的集成逻辑
  • constants常量与图标名映射
  • types类型定义
  • content.config.ts集合与 frontmatter 字段定义
  • content← 内容仓物化来的文章
  • data← 内容仓物化来的数据
  • user← 内容仓物化来的配置(user-config.ts)
  • generated图标清单(local-icon-collections.ts)
  • assets← 内容仓物化来的图片

后面四个打箭头的,是生成物,全都在 .gitignore 里。这意味着一件事:

纯内容改动(写文章、改配置、换图)在代码仓里不需要提交任何东西。

只有动 src/ 里的主题源码才需要提交,因为那是唯一真正属于代码仓的部分。

src/config/:27 个配置域#

这是我最常用到的一个目录。主题把所有可配的东西拆成 27 个领域,每个领域一个文件,注释即文档。

文件管什么
siteConfig.ts站点核心:标题、语言、主题色、横幅、目录、进度条、favicon
profileConfig.ts博主资料:头像、昵称、简介、社交链接
navBarConfig.ts顶部导航与下拉子菜单
sidebarConfig.ts侧栏布局与组件编排
postListConfig.ts文章列表的分页大小与排版(列表 / 网格)
articleConfig.ts文章详情页:更新提示、延伸阅读、分享与海报
categoryConfig.ts分类的展示顺序
permalinkConfig.ts文章永久链接格式
commentConfig.ts评论系统(Twikoo / Giscus),默认关
umamiConfig.ts访问统计,默认关
musicConfig.ts侧栏音乐播放器,默认关
animeConfig.ts追番页数据源(本地 / Bangumi / Bilibili)
fontConfig.ts全站正文、中文、等宽字体
openingAnimationConfig.ts首页开场动画,默认关
footerConfig.ts页脚自定义 HTML 注入开关
announcementConfig.ts侧栏公告栏,显示与否由 sidebarConfig 控制
licenseConfig.ts文章底部版权协议
expressiveCodeConfig.ts代码块高亮主题
contextMenuConfig.ts桌面端右键菜单
fabConfig.ts右下角悬浮按钮
imageBloomConfig.ts图片加载时的色调辉光占位
skillsConfig.ts / projectsConfig.ts / timelineConfig.ts / devicesConfig.ts四个数据页的展示规则
llmsConfig.ts/llms.txt 与 /llms-full.txt 的生成
index.ts统一出口,消费方一律从 @/config 导入

这里有个规律值得单独说,主题在文档里反复强调:配置管行为,数据管内容。

拿技能页举例。skillsConfig.ts 决定这个页面长什么样、分组按什么顺序展示;而具体有哪些技能、熟练度多少,在内容仓的 data/skills.ts 里。两个文件分在两个仓,各管各的。

src/pages/:一个文件就是一个网址#

不用配路由。文件路径就是 URL。

代码仓 src/pages/
  • index(由 […page].astro 承担)/
  • […permalink].astro自定义永久链接的出口
  • posts文章详情
  • archive.astro/archive/
  • categories.astro / tags.astro
  • about.astro / friends.astro / friends/apply.astro
  • albums.astro / moments.astro / skills.astro / projects.astro
  • compass.astro / devices.astro / timeline.astro / anime.astro
  • wip.astro一个占位页,彩蛋性质
  • rss.xml.ts / atom.xml.ts订阅源
  • llms.txt.ts / llms-full.txt.ts给 AI 读的纯文本版本
  • robots.txt.ts
  • 404.astro

内容仓:你天天要动的都在这#

内容仓 shirone-content/
  • config26 个 YAML,只有 7 个在生效(下面解释)
  • content
    • posts文章
    • moments说说
    • spec独立页面的正文,如 about.md
    • snippets可被文章引用的片段
  • data友链、项目、技能、时间线、设备、追番、音乐、罗盘
  • assets会被优化的图片
  • public原样拷贝的静态资源
  • .github/workflows/trigger-build.yml推送后通知代码仓重新构建
  • 小不悔个人博客改造我自己的工作笔记,不参与物化
  • README.md仓库地图(不参与物化)

config/:26 个 YAML,只有 7 个在生效#

状态文件
生效中site.yaml、profile.yaml、nav-bar.yaml、sidebar.yaml、category.yaml、opening-animation.yaml、skills.yaml
参考清单其余 19 个,全文注释状态,不覆盖任何默认值

这不是偷懒,是有意的。主题的设计是「只写想改的键,其余跟随默认值」,这样主题升级时新的默认值能自动生效。把所有键写死,等于把配置冻结在当前版本,以后主题的改进就进不来了。

参考清单的作用是当备忘:想开评论,就去 comment.yaml 删掉行首的 # ,填上自己的参数。文件头写了两行说明,照着做就行。

content/:文章与说说#

目录放什么
posts/文章,.md 或 .mdx。支持子目录归类,posts/guide/x.md 的网址就是 /posts/guide/x/
moments/说说,短内容,时间流展示
spec/独立页面正文,about.md 对应「关于」页
snippets/可被文章引用的公共片段

我现在的文章按分类分了四层目录:guides/、examples/、musings/、blog-rework-diary/。文件名全用拼音,这样 URL 里全是 ASCII。

data/:页面数据实体#

这里放具体条目,对应的 config/*.yaml 只管页面开关和排序。

文件内容
friends.ts友情链接
projects.ts开源项目
skills.ts技能清单与熟练度
timeline.ts大事记
devices.ts设备清单
anime.ts本地番剧清单
music.ts本地曲目
compass.ts / compass-other.ts罗盘(导航)条目
custom-icons.ts图标登记表,写 YAML 图标时必须同步这里

每个文件顶部都有中文注释,照着已有条目复制改就行。

assets/ 和 public/ 的区别#

assets/public/
物化到代码仓 src/assets/代码仓 public/
构建处理会压缩、生成响应式尺寸原样拷贝
引用方式相对路径或 import/ 开头的绝对路径
适合放头像、首页横幅、音乐封面相册图、说说配图、favicon

我想改 X,应该去哪#

我想……去哪
改站点标题 / 副标题 / 语言 / 时区内容仓 config/site.yaml
改主题色、背景纹理、首页横幅内容仓 config/site.yaml
改昵称 / 头像 / 签名 / 社交链接内容仓 config/profile.yaml
写文章内容仓 content/posts/ 新建文件
发说说内容仓 content/moments/ 新建文件
改「关于」页内容仓 content/spec/about.md
加友链内容仓 data/friends.ts
加项目 / 技能 / 时间线 / 设备内容仓 data/ 下对应文件
换横幅图、头像图内容仓 assets/images/
换相册图、说说配图内容仓 public/images/
改侧栏组件内容仓 config/sidebar.yaml
改导航菜单内容仓 config/nav-bar.yaml
改分类顺序内容仓 config/category.yaml
开评论 / 统计 / 音乐内容仓 config/ 下对应文件,取消注释
改页面固定文案(“阅读更多”这类)代码仓 src/i18n/
改组件结构、布局、CSS代码仓 src/(改之前先想清楚)

小结#

  • 两份仓库,一张 shirone.content.json 把它们接起来。日常只在内容仓里干活。
  • 内容仓里 config/ 管行为、data/ 管内容、content/ 管文字、assets/ 和 public/ 管图。
  • 代码仓的 src/config/ 是配置的默认值说明书,注释即文档,查某个键什么意思去那里。
  • src/content/、src/data/、src/user/、src/generated/、src/assets/ 是生成产物,别手改,也不进版本库。

改造记到这里就写完了。前面几篇讲怎么把别人的站改成自己的,这篇讲改完之后它到底长什么样。后面如果还有想写的,大概是部署上线那一段的事。

Shirone 改造记(六):这个站由哪些零件拼起来
https://xiaobuhui.xyz/posts/blog-rework-diary/shirone-gaizaoji-6/
作者
xiaobuhui
发布于
2026-10-15
许可协议
CC BY-NC-SA 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续阅读

沿着主题读

基于共同的标签与分类

换条路线

从其他文章中稳定抽取