<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>younisekai</title><description>异世界手记</description><link>https://kazeyouni.pages.dev/</link><language>zh_CN</language><item><title>你好，younisekai</title><link>https://kazeyouni.pages.dev/posts/hello-younisekai/</link><guid isPermaLink="true">https://kazeyouni.pages.dev/posts/hello-younisekai/</guid><description>本站的第一篇文章。说说这个模板到底是什么、目录长什么样，以及怎样在十分钟内发出属于你自己的第一篇。</description><pubDate>Sun, 01 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;欢迎来到这里。这是本站的第一篇文章，也是这套模板的自我介绍。&lt;/p&gt;
&lt;p&gt;如果你刚刚把项目克隆下来，&lt;code&gt;npm install&lt;/code&gt; 之后还不知道从哪下手，那么读完这一篇，你应该就能写出并发出自己的第一篇内容了。&lt;/p&gt;
&lt;h2&gt;younisekai 是什么&lt;/h2&gt;
&lt;p&gt;一句话：&lt;strong&gt;一个「写完 Markdown 就能发」的静态博客模板&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;它用 &lt;a href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt; 做构建，用 Tailwind CSS 排版，用 Svelte 写交互组件，最终产出的是一堆纯静态文件——没有数据库，没有运行时服务端，&lt;code&gt;dist/&lt;/code&gt; 目录丢到任何静态托管上就能跑。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;内容是文件&lt;/strong&gt;：文章是 Markdown，项目、技能、历程、日记、相册是 JSON，全部放在 &lt;code&gt;src/content/&lt;/code&gt; 里，可以用 Git 管理、可以随时整体迁移。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自带后台&lt;/strong&gt;：接上内容管理系统之后，可以在浏览器里直接写文章、改数据，不用装编辑器。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;该有的细节都有&lt;/strong&gt;：暗色模式、全站搜索、无限级目录树、代码高亮与折叠、文章加密、复制保护、阅读进度与字数统计。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;零后端依赖&lt;/strong&gt;：搜索索引在构建时生成，文章加密在浏览器端完成，评论等外部服务默认关闭、需要时再打开。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::tip
这套模板是移植并改造自开源项目 &lt;a href=&quot;https://github.com/Spr-Aachen/Twilight&quot;&gt;Spr-Aachen/Twilight&lt;/a&gt;（MIT 许可），在此基础上重新设计了中文内容结构、数据集合页面与示例文档。协议与致谢写在&lt;a href=&quot;/about/&quot;&gt;关于页面&lt;/a&gt;里。
:::&lt;/p&gt;
&lt;h2&gt;目录结构&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;项目根目录/
├── public/                     # 直接拷贝进产物的静态资源
│   └── assets/images/          # 封面、头像、占位图、壁纸
├── src/
│   ├── components/             # 组件（卡片、侧栏挂件、评论……）
│   ├── content/                # 所有内容与数据
│   │   ├── posts/              # 文章（Markdown）
│   │   ├── projects/           # 项目（JSON + 封面图）
│   │   ├── skills/             # 技能（JSON）
│   │   ├── timeline/           # 历程（JSON）
│   │   ├── diary/              # 日记（JSON + 配图）
│   │   ├── albums/             # 相册（JSON + 图片）
│   │   ├── friends/            # 友链（JSON）
│   │   ├── about.md            # 「关于」页正文
│   │   └── friends.md          # 「友链」页正文
│   ├── layouts/                # 页面骨架
│   ├── pages/                  # 路由：文件即页面
│   ├── styles/                 # 样式与主题变量
│   └── utils/                  # 读取与整理内容的工具函数
├── astro.config.mjs            # 构建与插件配置
└── younisekai.config.yaml      # 站点、主题、侧栏、评论等总配置
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;内容集合速查&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;想改什么&lt;/th&gt;
&lt;th&gt;去哪里改&lt;/th&gt;
&lt;th&gt;一个文件对应&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;一篇文章&lt;/td&gt;
&lt;td&gt;&lt;code&gt;src/content/posts/*.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;一篇文章&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;一个项目&lt;/td&gt;
&lt;td&gt;&lt;code&gt;src/content/projects/&amp;lt;目录&amp;gt;/intro.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;一个项目卡片&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;一项技能&lt;/td&gt;
&lt;td&gt;&lt;code&gt;src/content/skills/*.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;一张技能卡&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;一段历程&lt;/td&gt;
&lt;td&gt;&lt;code&gt;src/content/timeline/*.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;时间线上的一个节点&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;一条日记&lt;/td&gt;
&lt;td&gt;&lt;code&gt;src/content/diary/&amp;lt;目录&amp;gt;/*.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;一条带图的短动态&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;一本相册&lt;/td&gt;
&lt;td&gt;&lt;code&gt;src/content/albums/&amp;lt;目录&amp;gt;/*.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;一个相册与其中的照片&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;一个友链&lt;/td&gt;
&lt;td&gt;&lt;code&gt;src/content/friends/*.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;友链页上的一张卡片&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;关于 / 友链页正文&lt;/td&gt;
&lt;td&gt;&lt;code&gt;src/content/about.md&lt;/code&gt;、&lt;code&gt;src/content/friends.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;一个单页&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;:::note
页面是按目录约定生成的，所以&lt;strong&gt;文件名就是数据的一部分&lt;/strong&gt;：文章的文件名决定它的网址，数据文件的名字决定它在列表里的 id。取名时用英文小写加连字符，最省心。
:::&lt;/p&gt;
&lt;h2&gt;十分钟发出第一篇&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;安装依赖&lt;/strong&gt;：在项目根目录执行 &lt;code&gt;npm install&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;新建文件&lt;/strong&gt;：在 &lt;code&gt;src/content/posts/&lt;/code&gt; 下建一个 Markdown 文件，例如 &lt;code&gt;my-first-note.md&lt;/code&gt;——文件名会成为网址的一部分。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;写 frontmatter&lt;/strong&gt;：文件开头两行 &lt;code&gt;---&lt;/code&gt; 之间填写标题、日期、分类等信息，最少写 &lt;code&gt;title&lt;/code&gt;、&lt;code&gt;published&lt;/code&gt;、&lt;code&gt;description&lt;/code&gt; 就够。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;写正文&lt;/strong&gt;：常规 Markdown 语法即可，需要图表、提示框、数学公式时参考&lt;a href=&quot;/posts/markdown-showcase/&quot;&gt;排版速查&lt;/a&gt;与&lt;a href=&quot;/posts/diagrams-and-math/&quot;&gt;图表与公式&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本地预览&lt;/strong&gt;：&lt;code&gt;npm run dev&lt;/code&gt;，打开终端提示的地址，文章位于 &lt;code&gt;/posts/my-first-note/&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;构建发布&lt;/strong&gt;：&lt;code&gt;npm run build&lt;/code&gt;，把生成的 &lt;code&gt;dist/&lt;/code&gt; 上传到任意静态托管即可。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;接下来看什么&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;想先把环境和部署跑通：&lt;a href=&quot;/posts/guide/getting-started/&quot;&gt;快速上手：从本地到线上&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;想搞清楚每个 frontmatter 字段：&lt;a href=&quot;/posts/guide/writing-guide/&quot;&gt;写作指南：frontmatter 全解析&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;想知道正文能用哪些语法：&lt;a href=&quot;/posts/markdown-showcase/&quot;&gt;排版速查表&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;想换主题色、改侧栏挂件：&lt;a href=&quot;/posts/theme-configuration/&quot;&gt;主题与站点配置&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;写博客最难的一步从来不是技术，而是「打开编辑器」。既然第一篇已经在这里了，第二篇就顺手写掉吧。&lt;/p&gt;
</content:encoded><category>站点公告</category><category>Astro</category><category>静态站点</category><category>入门</category></item><item><title>从一个静态博客的样式混乱，聊到一套撑得住的前端样式体系</title><link>https://kazeyouni.pages.dev/posts/long-article/</link><guid isPermaLink="true">https://kazeyouni.pages.dev/posts/long-article/</guid><description>一篇偏长的实践笔记：设计变量怎么收进一层、断点为什么不该太多、组件样式该守哪几条纪律，以及暗色模式收尾时最容易漏掉的两件事。</description><pubDate>Thu, 20 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这篇文章记录的是一次真实的返工：一个已经上线、文章也写了几十篇的静态站点，因为样式越改越乱，被迫停下来重新梳理整套前端样式体系。整个过程花了两周，其中一周在拆自己以前写的代码。&lt;/p&gt;
&lt;p&gt;如果你也遇到过「改一个按钮的颜色，结果列表页的边框变了」这种事，这篇大概对你有用。&lt;/p&gt;
&lt;h2&gt;样式为什么会先崩&lt;/h2&gt;
&lt;p&gt;样式问题从来不是突然出现的，它有三个非常典型的前兆。&lt;/p&gt;
&lt;h3&gt;症状一：同一个颜色有四种写法&lt;/h3&gt;
&lt;p&gt;打开样式表，会看到 &lt;code&gt;#7C3AED&lt;/code&gt;、&lt;code&gt;#7c3aed&lt;/code&gt;、&lt;code&gt;rgb(124 58 237)&lt;/code&gt; 和 &lt;code&gt;hsl(262 83% 58%)&lt;/code&gt; 同时存在，都表示同一个紫。它们最初都来自同一个设计稿，只是每个人复制的时候顺手改了写法。&lt;/p&gt;
&lt;h3&gt;症状二：间距靠感觉&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;margin: 14px&lt;/code&gt;、&lt;code&gt;padding: 13px&lt;/code&gt;、&lt;code&gt;gap: 1.1rem&lt;/code&gt; 散落在各个组件里。数值本身不算错，但它们之间没有关系，所以页面上到处是「差两像素」的错位。&lt;/p&gt;
&lt;h3&gt;症状三：改一处影响一片&lt;/h3&gt;
&lt;p&gt;这是最危险的：某个类名被多个页面复用，但复用的方式各不相同。改动它就像拆炸弹——你永远不知道谁会跟着炸。&lt;/p&gt;
&lt;p&gt;:::note
前两个症状只是难看，第三个症状才是必须重构的信号。&lt;strong&gt;当一个改动的影响范围无法预测时，样式体系就已经失效了。&lt;/strong&gt;
:::&lt;/p&gt;
&lt;h2&gt;第一步：把设计变量收进一层&lt;/h2&gt;
&lt;p&gt;重构的第一步不是删代码，而是&lt;strong&gt;把所有裸值收进一层变量&lt;/strong&gt;。原则很简单：组件里只允许出现变量，不允许出现具体的颜色值和尺寸值。&lt;/p&gt;
&lt;h3&gt;色板：一层色相加明度阶梯&lt;/h3&gt;
&lt;p&gt;与其定义二十个命名颜色，不如定义「一个色相 + 一套明度阶梯」。这样换主题时只改一个色相数值，整站配色会一起跟着走：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:root {
    /* 主色：一个色相，若干明度 */
    --primary-hue: 255;
    --primary: hsl(var(--primary-hue) 70% 55%);
    --primary-hover: hsl(var(--primary-hue) 70% 48%);
    --primary-light: hsl(var(--primary-hue) 70% 92%);

    /* 中性色：同一色相、低饱和度，比纯灰更耐看 */
    --text-90: hsl(var(--primary-hue) 12% 12%);
    --text-75: hsl(var(--primary-hue) 10% 30%);
    --text-50: hsl(var(--primary-hue) 8% 50%);
    --line-divider: hsl(var(--primary-hue) 12% 88%);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;关键在于中性色也带上色相：纯灰（&lt;code&gt;hsl(0 0% 50%)&lt;/code&gt;）放在有色调的界面上会显得脏，而带一点点主色相的中性色会自然很多。&lt;/p&gt;
&lt;h3&gt;间距与圆角：给一套有限的台阶&lt;/h3&gt;
&lt;p&gt;间距不要自由取值，给一套 6–8 个台阶就够，所有间距从台阶里挑：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;变量&lt;/th&gt;
&lt;th&gt;数值&lt;/th&gt;
&lt;th&gt;典型用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--space-1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;4px&lt;/td&gt;
&lt;td&gt;图标与文字的间隙&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--space-2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;8px&lt;/td&gt;
&lt;td&gt;标签内边距&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--space-3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;12px&lt;/td&gt;
&lt;td&gt;卡片内元素间距&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--space-4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;16px&lt;/td&gt;
&lt;td&gt;卡片内边距&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--space-6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;24px&lt;/td&gt;
&lt;td&gt;区块之间的间距&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--space-8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;32px&lt;/td&gt;
&lt;td&gt;页面大区块间距&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--space-12&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;48px&lt;/td&gt;
&lt;td&gt;首屏与页脚&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;圆角同理：&lt;code&gt;--radius-sm&lt;/code&gt;（6px）、&lt;code&gt;--radius-md&lt;/code&gt;（10px）、&lt;code&gt;--radius-lg&lt;/code&gt;（14px）、&lt;code&gt;--radius-full&lt;/code&gt;。&lt;strong&gt;台阶之外不允许出现新数值&lt;/strong&gt;，这条纪律比变量本身更重要。&lt;/p&gt;
&lt;h3&gt;在 Tailwind 里落地&lt;/h3&gt;
&lt;p&gt;用 Tailwind 的话，不必放弃实用类，只要把变量接到主题配置里：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// tailwind.config 里的关键部分
export default {
    theme: {
        extend: {
            colors: {
                primary: &quot;var(--primary)&quot;,
                &quot;primary-hover&quot;: &quot;var(--primary-hover)&quot;,
            },
            spacing: {
                // 把台阶映射成 Tailwind 的间距刻度
                13: &quot;var(--space-13, 3.25rem)&quot;,
            },
            borderRadius: {
                lg: &quot;var(--radius-lg)&quot;,
            },
        },
    },
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样写有两个好处：组件里仍然用 &lt;code&gt;bg-primary p-4 rounded-lg&lt;/code&gt; 这样直观的类名；颜色的真实来源只有一个变量，换主题时不必全站替换。&lt;/p&gt;
&lt;h2&gt;第二步：断点与栅格&lt;/h2&gt;
&lt;h3&gt;断点不是越多越好&lt;/h3&gt;
&lt;p&gt;见过最夸张的项目定义了九个断点，结果每个断点都要单独调一次布局，维护成本直接翻倍。实际上大部分内容型站点只需要三到四个：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;断点&lt;/th&gt;
&lt;th&gt;宽度&lt;/th&gt;
&lt;th&gt;覆盖的设备&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;默认&lt;/td&gt;
&lt;td&gt;0 起&lt;/td&gt;
&lt;td&gt;手机竖屏&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;640px&lt;/td&gt;
&lt;td&gt;手机横屏、小平板&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;768px&lt;/td&gt;
&lt;td&gt;平板竖屏&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lg&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1024px&lt;/td&gt;
&lt;td&gt;桌面&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;再往上通常不需要新的断点，只需要限制内容的最大宽度——让正文宽度保持在 65–75 个字符之间，比给他加断点更有效。&lt;/p&gt;
&lt;h3&gt;内容优先的调整顺序&lt;/h3&gt;
&lt;p&gt;调整布局时，按这个顺序改，返工最少：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;先让内容能读&lt;/strong&gt;：正文行宽、行高、段落间距；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;再让结构能站&lt;/strong&gt;：栅格换列、侧栏折叠；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最后调装饰&lt;/strong&gt;：圆角、阴影、动效。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;反过来先调阴影和圆角，内容一改就又得重来。&lt;/p&gt;
&lt;p&gt;:::tip
测试时不要只拖浏览器宽度，一定要在真机上看一遍。手机上最常见的两个问题是：横向滚动条（多半是某个固定宽度元素溢出）和被虚拟键盘顶起来的输入框。
:::&lt;/p&gt;
&lt;h2&gt;第三步：组件样式的三条纪律&lt;/h2&gt;
&lt;h3&gt;纪律一：组件内不写魔法数字&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;/* 不好：14px 是从哪来的？没人知道 */
.card__title {
    margin-bottom: 14px;
}

/* 好：来自间距台阶，改台阶就能全站同步 */
.card__title {
    margin-bottom: var(--space-3);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;纪律二：状态成组出现&lt;/h3&gt;
&lt;p&gt;一个交互元素至少有四种状态：默认、悬停、激活、禁用；如果它是链接，还有访问过；如果支持键盘，还要有焦点态。&lt;strong&gt;写样式时把这几种状态一次写完&lt;/strong&gt;，不要等出问题再补：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.button {
    background: var(--primary);
    color: white;
    transition: background-color 150ms ease;
}

.button:hover { background: var(--primary-hover); }
.button:active { transform: translateY(1px); }
.button:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
.button:disabled { opacity: .5; cursor: not-allowed; }
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;纪律三：样式随组件走&lt;/h3&gt;
&lt;p&gt;样式写在组件文件里（scoped style），而不是在全局样式表里按类名遥控组件的内部结构。全局样式表只应该做三件事：定义变量、重置默认样式、处理跨组件的排版规则（例如 Markdown 正文）。&lt;/p&gt;
&lt;h2&gt;第四步：暗色模式怎么收尾&lt;/h2&gt;
&lt;p&gt;暗色模式做起来快，做对慢。核心思路是&lt;strong&gt;用变量推导，而不是逐个元素覆盖&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;只在变量层切换&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;:root {
    --card-bg: hsl(var(--primary-hue) 30% 99%);
    --text-90: hsl(var(--primary-hue) 12% 12%);
}

.dark {
    --card-bg: hsl(var(--primary-hue) 18% 10%);
    --text-90: hsl(var(--primary-hue) 10% 92%);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样一来，组件层完全不需要知道当前是哪种模式。&lt;/p&gt;
&lt;h3&gt;两件最容易漏的事&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;对比度&lt;/strong&gt;：暗色模式下把深色文字换成浅色文字时，很容易忽略「次级文字」——它在浅色模式下是 60% 灰，直接搬到暗色背景上会低到看不清。次级文字的对比度建议不低于 4.5:1。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;媒体素材&lt;/strong&gt;：纯白背景的图片、透明度为 1 的壁纸、亮色主题的代码高亮，都会在暗色模式下显得刺眼。处理方式是给图片容器加一层极淡的遮罩、给壁纸加上可配置的不透明度，代码高亮则直接切换主题。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:::caution
不要用 CSS 滤镜去「反色」处理图片——肤色、品牌色和截图里的 UI 都会变得诡异。宁可给图片加遮罩，也不要整体反色。
:::&lt;/p&gt;
&lt;h2&gt;维护：让体系活下来&lt;/h2&gt;
&lt;p&gt;重构完成只是开始，体系能不能撑住要看后面几个月的维护。&lt;/p&gt;
&lt;h3&gt;每周一次的样式巡检&lt;/h3&gt;
&lt;p&gt;花十分钟做三件事，收益极高：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;搜一遍裸色值（&lt;code&gt;#&lt;/code&gt; 开头的十六进制）与裸像素值，看有没有新出现的漏网之鱼；&lt;/li&gt;
&lt;li&gt;检查是否有新的类名重复定义（同一组件两处样式互相覆盖）；&lt;/li&gt;
&lt;li&gt;在暗色模式下把主要页面点一遍，重点是表格、代码块和表单。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;什么时候该重构&lt;/h3&gt;
&lt;p&gt;出现下面任意一条，就该安排重构了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;改一个样式需要同时动三处以上；&lt;/li&gt;
&lt;li&gt;无法回答「这个颜色变量到底影响哪些页面」；&lt;/li&gt;
&lt;li&gt;新页面的样式要靠复制旧页面再删改来产出；&lt;/li&gt;
&lt;li&gt;每次改完都要在四个断点、两种主题下手工检查一遍。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;重构不等于重写。这次我做的是「先建立变量层、再逐页替换」，全程没有推翻任何页面结构，也就没有出现长期无法发布的分支。&lt;strong&gt;能小步走的重构，不要用大爆炸的方式做。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;回头看，样式问题本质上是&lt;strong&gt;约定问题&lt;/strong&gt;：变量只有一个来源、间距只有一套台阶、状态一次写完、样式跟着组件走。这四条守住之后，代码量其实差不多，但改动的可预测性完全不同——你终于能回答「改这里会影响什么」这个问题了。&lt;/p&gt;
</content:encoded><category>技术笔记 / 前端</category><category>前端</category><category>Tailwind CSS</category><category>排版</category></item><item><title>复制保护四种开关</title><link>https://kazeyouni.pages.dev/posts/copy-protection/</link><guid isPermaLink="true">https://kazeyouni.pages.dev/posts/copy-protection/</guid><description>blockSelection、blockClipboard、blockContextMenu、blockDevTools 四项复制保护各自做什么、怎么验证、什么时候不该开。</description><pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;你正在看的这一页，四项复制保护&lt;strong&gt;全部开启&lt;/strong&gt;。可以顺手试一下：拖选这段文字、按 &lt;code&gt;Ctrl+C&lt;/code&gt;、点右键、按 &lt;code&gt;F12&lt;/code&gt;——四种操作都会被拦下来。&lt;/p&gt;
&lt;h2&gt;怎么配置&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;copyProtection:
    blockSelection: true      # 禁止选中文本
    blockClipboard: true      # 拦截复制、剪切、粘贴
    blockContextMenu: true    # 禁止右键菜单
    blockDevTools: true       # 屏蔽 F12、Ctrl+U、Ctrl+S
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;四个开关&lt;strong&gt;互相独立&lt;/strong&gt;，默认全部为 &lt;code&gt;false&lt;/code&gt;。按需要逐项开启，比「一键全开」更好：全开之后读者想复制一段代码示例都做不到，体验会明显变差。&lt;/p&gt;
&lt;h2&gt;四项开关分别做什么&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;开关&lt;/th&gt;
&lt;th&gt;实际行为&lt;/th&gt;
&lt;th&gt;生效方式&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;blockSelection&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;全站禁用文本选中（&lt;code&gt;user-select: none&lt;/code&gt;），但输入框与文本域保持可选中&lt;/td&gt;
&lt;td&gt;注入一条全局样式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;blockClipboard&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;拦截 &lt;code&gt;copy&lt;/code&gt;、&lt;code&gt;cut&lt;/code&gt;、&lt;code&gt;paste&lt;/code&gt; 三个事件并阻止默认行为&lt;/td&gt;
&lt;td&gt;注册事件监听&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;blockContextMenu&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;拦截 &lt;code&gt;contextmenu&lt;/code&gt; 事件，右键不再弹出菜单&lt;/td&gt;
&lt;td&gt;注册事件监听&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;blockDevTools&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;拦截 &lt;code&gt;F12&lt;/code&gt;，以及按下 &lt;code&gt;Ctrl&lt;/code&gt; 时的 &lt;code&gt;U&lt;/code&gt;（查看源代码）与 &lt;code&gt;S&lt;/code&gt;（保存页面）&lt;/td&gt;
&lt;td&gt;注册键盘监听&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;:::note
这些保护都是&lt;strong&gt;浏览器端&lt;/strong&gt;的。只要愿意关掉 JavaScript，或者直接在源码层面抓取，任何前端限制都能被绕过。它的定位是「提高随手复制的成本」，而不是「防止内容被拿走」。
:::&lt;/p&gt;
&lt;h2&gt;逐项验证&lt;/h2&gt;
&lt;p&gt;打开本页后可以按下面的方式自检：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;选中&lt;/strong&gt;：试着用鼠标拖选这段话（包括代码块与表格），选中高亮不会出现；但页面上的搜索框仍可正常输入与选中。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;复制&lt;/strong&gt;：按 &lt;code&gt;Ctrl+C&lt;/code&gt; 不会把内容写进剪贴板；&lt;code&gt;Ctrl+X&lt;/code&gt;、&lt;code&gt;Ctrl+V&lt;/code&gt; 同样被拦截。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;右键&lt;/strong&gt;：右键单击页面任意位置都不会出现菜单。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开发者工具&lt;/strong&gt;：按 &lt;code&gt;F12&lt;/code&gt;、&lt;code&gt;Ctrl+U&lt;/code&gt;、&lt;code&gt;Ctrl+S&lt;/code&gt; 都不会触发对应动作。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;// 被拦截的就是这三类事件，核心只有几行
document.addEventListener(&quot;copy&quot;, (e) =&amp;gt; e.preventDefault());
document.addEventListener(&quot;contextmenu&quot;, (e) =&amp;gt; e.preventDefault());
document.addEventListener(&quot;keydown&quot;, (e) =&amp;gt; {
    if (e.key === &quot;F12&quot;) e.preventDefault();
});
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;该不该开&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;场景&lt;/th&gt;
&lt;th&gt;建议&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;原创长文、连载小说、需要防搬运的稿件&lt;/td&gt;
&lt;td&gt;可以开 &lt;code&gt;blockClipboard&lt;/code&gt; 与 &lt;code&gt;blockContextMenu&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;教读者复制代码的技术文章&lt;/td&gt;
&lt;td&gt;只开 &lt;code&gt;blockContextMenu&lt;/code&gt;，&lt;strong&gt;不要&lt;/strong&gt;开 &lt;code&gt;blockClipboard&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;加密后的私人笔记&lt;/td&gt;
&lt;td&gt;四项全开，配合 &lt;code&gt;encrypted&lt;/code&gt; 使用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;想让内容被引用、被分享的公开文章&lt;/td&gt;
&lt;td&gt;保持默认全关，复制与引用都是好事&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;:::tip
开了 &lt;code&gt;blockSelection&lt;/code&gt; 之后，读者的浏览体验影响最大——没法选取文字，就没法用翻译插件、也没法做笔记。如果不是明确不想被复制的内容，建议保留默认值。
:::&lt;/p&gt;
&lt;h2&gt;与加密的分工&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;加密（&lt;code&gt;encrypted&lt;/code&gt; + &lt;code&gt;password&lt;/code&gt;）&lt;/strong&gt;：管「能不能读」，正文在解锁前是密文；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;复制保护（&lt;code&gt;copyProtection&lt;/code&gt;）&lt;/strong&gt;：管「读了之后能不能带走」，作用于整个页面。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;两者可以叠加，也可以只用一种。加密的用法与注意事项见&lt;a href=&quot;/posts/encrypted-note/&quot;&gt;给文章加一把锁&lt;/a&gt;。&lt;/p&gt;
</content:encoded><category>主题定制</category><category>复制保护</category><category>站点配置</category></item><item><title>主题与站点配置：改一个 YAML 就够了</title><link>https://kazeyouni.pages.dev/posts/theme-configuration/</link><guid isPermaLink="true">https://kazeyouni.pages.dev/posts/theme-configuration/</guid><description>站点信息、主题色相、壁纸模式、导航菜单、侧栏挂件、文章卡片与评论，全部集中在一个配置文件里，这里逐项说明怎么改。</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这套模板的设计原则是：&lt;strong&gt;日常调整不碰源码&lt;/strong&gt;。站点长什么样、导航有几级、侧栏放哪些卡片、要不要开评论，都由项目根目录下的一个 YAML 文件决定。&lt;/p&gt;
&lt;h2&gt;配置文件在哪&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;文件位置&lt;/td&gt;
&lt;td&gt;项目根目录的 &lt;code&gt;younisekai.config.yaml&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;谁在读它&lt;/td&gt;
&lt;td&gt;&lt;code&gt;src/config.ts&lt;/code&gt; 用 &lt;code&gt;?raw&lt;/code&gt; 读入，做归一化后导出给页面与组件使用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;生效时机&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;构建时&lt;/strong&gt;读取，改完请重启开发服务器（或重新构建），热更新不会重新解析 YAML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;敏感信息&lt;/td&gt;
&lt;td&gt;不放这里。后台登录用的 GitHub OAuth 凭据走 &lt;code&gt;.env&lt;/code&gt;（见 &lt;code&gt;.env.example&lt;/code&gt;），YAML 只放可以公开的站点配置&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;:::warning
不要在 YAML 里随意增删层级。每一项的位置都是有意义的，写错层级时要么该字段被忽略，要么直接抛出配置错误。
:::&lt;/p&gt;
&lt;h2&gt;站点基础信息&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;字段&lt;/th&gt;
&lt;th&gt;示例值&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site.siteURL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://younisekai.example.com/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;站点根地址，&lt;strong&gt;必须以斜杠结尾&lt;/strong&gt;；RSS、Atom、站点地图与分享卡片都依赖它，部署前务必改成自己的域名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site.title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;younisekai&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;站点标题，显示在导航栏左上角与浏览器标签页&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site.subtitle&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;异世界手记&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;站点副标题，用于默认描述与页脚&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site.lang&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;zh_CN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;站点语言，可选 &lt;code&gt;en&lt;/code&gt; / &lt;code&gt;ja&lt;/code&gt; / &lt;code&gt;zh_hans&lt;/code&gt; / &lt;code&gt;zh_hant&lt;/code&gt;；&lt;code&gt;zh_CN&lt;/code&gt;、&lt;code&gt;zh_TW&lt;/code&gt; 这类地区写法会自动归一化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site.keywords&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;字符串数组&lt;/td&gt;
&lt;td&gt;站点关键词，用于生成 &lt;code&gt;&amp;lt;meta name=&quot;keywords&quot;&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site.timeZone&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;UTC 偏移小时数（-12 ~ 12），用于「几小时前」这类相对时间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site.defaultTheme&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dark&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;默认主题：&lt;code&gt;system&lt;/code&gt; 跟随系统、&lt;code&gt;light&lt;/code&gt; 浅色、&lt;code&gt;dark&lt;/code&gt; 深色&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site.favicon&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;见下&lt;/td&gt;
&lt;td&gt;站点图标数组，留空则使用内置默认图标&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;字体与图标的写法：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;site:
    font:
        # 标识会用于生成 .font-&amp;lt;标识&amp;gt; 工具类，请勿包含空格
        NotoSansSC:
            src: &quot;https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;500;700&amp;amp;display=swap&quot;
            family: &quot;Noto Sans SC&quot;
    favicon:
        - src: &quot;/favicon/icon-light.svg&quot;   # 路径相对 /public 目录
          theme: &quot;light&quot;                   # 适用主题：light / dark
          sizes: &quot;any&quot;                     # SVG 矢量图写 any
        - src: &quot;/favicon/icon-dark.svg&quot;
          theme: &quot;dark&quot;
          sizes: &quot;any&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;主题色：只改一个色相&lt;/h2&gt;
&lt;p&gt;整套配色由 &lt;code&gt;site.themeColor.hue&lt;/code&gt; 一个数字推导出来，取值 0–360：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;色相&lt;/th&gt;
&lt;th&gt;大致观感&lt;/th&gt;
&lt;th&gt;适合的站点气质&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;红&lt;/td&gt;
&lt;td&gt;强烈、有攻击性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;30&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;橙&lt;/td&gt;
&lt;td&gt;温暖、有食欲&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;150&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;绿&lt;/td&gt;
&lt;td&gt;自然、平静&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;200&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;青&lt;/td&gt;
&lt;td&gt;清爽、偏科技&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;265&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;蓝紫&lt;/td&gt;
&lt;td&gt;冷静、偏理性（本站默认值）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;300&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;紫&lt;/td&gt;
&lt;td&gt;神秘、偏创作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;345&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;粉&lt;/td&gt;
&lt;td&gt;柔和、偏生活&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;site:
    themeColor:
        hue: 265
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;明度与饱和度由主题在 CSS 变量层统一处理，浅色与暗色模式都会自动得到可用的对比度，不需要你手调具体颜色值。&lt;/p&gt;
&lt;h2&gt;壁纸与首屏&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;字段&lt;/th&gt;
&lt;th&gt;可选值&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site.wallpaper.mode&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;banner&lt;/code&gt; / &lt;code&gt;fullscreen&lt;/code&gt; / &lt;code&gt;none&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;横幅、全屏壁纸、纯色背景&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site.wallpaper.src.desktop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;路径或数组&lt;/td&gt;
&lt;td&gt;桌面壁纸，路径相对 &lt;code&gt;/public&lt;/code&gt;；&lt;strong&gt;数组长度大于 1 时自动轮播&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site.wallpaper.src.mobile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;路径或数组&lt;/td&gt;
&lt;td&gt;移动端壁纸，规则同上&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site.wallpaper.position&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;top&lt;/code&gt; / &lt;code&gt;center&lt;/code&gt; / &lt;code&gt;bottom&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;壁纸的裁切重心&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site.wallpaper.carousel.enable&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;布尔&lt;/td&gt;
&lt;td&gt;是否轮播；关闭时多图会随机显示一张&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site.wallpaper.carousel.interval&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;秒&lt;/td&gt;
&lt;td&gt;轮播间隔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site.wallpaper.carousel.kenBurns&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;布尔&lt;/td&gt;
&lt;td&gt;缓慢推近的 Ken Burns 效果&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site.wallpaper.banner.homeText.enable&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;布尔&lt;/td&gt;
&lt;td&gt;是否只在首页显示横幅文字&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site.wallpaper.banner.homeText.title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;字符串&lt;/td&gt;
&lt;td&gt;横幅大标题&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site.wallpaper.banner.homeText.subtitle&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;字符串或数组&lt;/td&gt;
&lt;td&gt;副标题，数组会依次轮播&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site.wallpaper.banner.homeText.typewriter.enable&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;布尔&lt;/td&gt;
&lt;td&gt;副标题打字机效果（含 &lt;code&gt;speed&lt;/code&gt;、&lt;code&gt;deleteSpeed&lt;/code&gt;、&lt;code&gt;pauseTime&lt;/code&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site.wallpaper.banner.credit.enable&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;布尔&lt;/td&gt;
&lt;td&gt;是否显示横幅图片来源（&lt;code&gt;text&lt;/code&gt;、&lt;code&gt;url&lt;/code&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site.wallpaper.banner.navbar.transparentMode&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;semi&lt;/code&gt; / &lt;code&gt;full&lt;/code&gt; / &lt;code&gt;semifull&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;导航栏透明策略：半透明加圆角、完全透明、滚动时动态变化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site.wallpaper.banner.waves.enable&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;布尔&lt;/td&gt;
&lt;td&gt;横幅底部水波纹效果；&lt;code&gt;performanceMode&lt;/code&gt; 可简化动画以省性能&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site.wallpaper.fullscreen.opacity&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0–1&lt;/td&gt;
&lt;td&gt;全屏壁纸模式下内容面板的不透明度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site.wallpaper.fullscreen.blur&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;像素&lt;/td&gt;
&lt;td&gt;全屏壁纸的模糊程度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;site.wallpaper.fullscreen.zIndex&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;整数&lt;/td&gt;
&lt;td&gt;全屏壁纸的层级&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;首屏加载页由 &lt;code&gt;site.loadingOverlay&lt;/code&gt; 控制：&lt;code&gt;enable&lt;/code&gt; 开关、&lt;code&gt;waitForFonts&lt;/code&gt;（等字体加载）、&lt;code&gt;waitForImages&lt;/code&gt;（等首图解码）、&lt;code&gt;maxWait&lt;/code&gt;（最长等待秒数），标题与转圈动画各自有 &lt;code&gt;enable&lt;/code&gt; 与 &lt;code&gt;interval&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;导航菜单&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;navbar.links&lt;/code&gt; 是一个数组，每一项可以是&lt;strong&gt;预设名&lt;/strong&gt;（字符串），也可以是自定义对象。&lt;/p&gt;
&lt;p&gt;可用的预设名：&lt;code&gt;Home&lt;/code&gt;、&lt;code&gt;Archive&lt;/code&gt;、&lt;code&gt;Projects&lt;/code&gt;、&lt;code&gt;Skills&lt;/code&gt;、&lt;code&gt;Timeline&lt;/code&gt;、&lt;code&gt;Diary&lt;/code&gt;、&lt;code&gt;Albums&lt;/code&gt;、&lt;code&gt;Friends&lt;/code&gt;、&lt;code&gt;About&lt;/code&gt;（定义在 &lt;code&gt;src/constants/link-presets.ts&lt;/code&gt;）。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;navbar:
    links:
        - &quot;Home&quot;                 # 一级：预设
        - &quot;Archive&quot;
        - # 一级：自定义，点击后进入中转页
          name: &quot;展览&quot;
          url: &quot;/exhibition/&quot;
          icon: &quot;material-symbols:person&quot;
          description: &quot;收藏我的创作、技能与旅途片段&quot;
          children:              # 子链接可以是预设名，也可以是自定义对象，层级不限
              - &quot;Projects&quot;
              - &quot;Skills&quot;
              - &quot;Timeline&quot;
              - &quot;Diary&quot;
              - &quot;Albums&quot;
        - &quot;Friends&quot;
        - &quot;About&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;自定义字段&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;导航显示名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;url&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;目标地址；填 &lt;code&gt;/exhibition/&lt;/code&gt; 这类站内地址时会自动生成一个中转页，点击后进入卡片式入口&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;icon&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Iconify 图标名，例如 &lt;code&gt;material-symbols:person&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;中转页卡片上的说明文字&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;external&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;是否为站外链接（站外会在新标签页打开）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;children&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;子链接数组，可继续嵌套&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;:::caution
预设名写错（多一个空格、大小写不一致、引用了不存在的预设）会在启动时直接抛出 &lt;code&gt;Unknown LinkPreset&lt;/code&gt; 并中断构建。改完导航先用 &lt;code&gt;npm run dev&lt;/code&gt; 跑一次最保险。
:::&lt;/p&gt;
&lt;h2&gt;侧边栏挂件&lt;/h2&gt;
&lt;p&gt;侧栏分左右两栏，每一栏都是一个挂件数组。可用类型：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;code&gt;type&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;th&gt;常用附加字段&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;directory&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;按内容集合自动生成的目录树&lt;/td&gt;
&lt;td&gt;&lt;code&gt;position&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;categories&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文章分类树&lt;/td&gt;
&lt;td&gt;&lt;code&gt;depth&lt;/code&gt;（展开层数）、&lt;code&gt;responsive.collapseThreshold&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tags&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;标签云&lt;/td&gt;
&lt;td&gt;&lt;code&gt;responsive.collapseThreshold&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;toc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;当前文章的目录&lt;/td&gt;
&lt;td&gt;&lt;code&gt;depth&lt;/code&gt;（1–6）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;statistics&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;站点统计&lt;/td&gt;
&lt;td&gt;&lt;code&gt;visibility&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;profile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;资料卡（内容来自 &lt;code&gt;profile&lt;/code&gt; 段）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;visibility&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;announcement&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;公告卡（内容来自 &lt;code&gt;announcement&lt;/code&gt; 段）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;visibility&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;每一项都支持下面三个通用字段：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sidebar:
    components:
        left:
            - type: &quot;categories&quot;
              position: &quot;sticky&quot;        # top 跟随内容顶部 | sticky 吸顶
              depth: 3                  # 展开到第三层
              responsive:
                  collapseThreshold: 5  # 超过 5 项时默认折叠
        right:
            - type: &quot;profile&quot;
              position: &quot;top&quot;
              visibility:
                  mode: &quot;exclude&quot;       # include 只在匹配页面显示 / exclude 只在非匹配页面显示
                  paths: [&quot;^/posts/&quot;, &quot;^/archive&quot;]   # 正则字符串
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::tip
&lt;code&gt;visibility.paths&lt;/code&gt; 里填的是&lt;strong&gt;正则字符串&lt;/strong&gt;：&lt;code&gt;^/$&lt;/code&gt; 表示只在首页显示，&lt;code&gt;^/posts/&lt;/code&gt; 表示所有文章页。想让某个挂件只在文章页出现，用 &lt;code&gt;mode: include&lt;/code&gt; 配合 &lt;code&gt;[&quot;^/posts/&quot;]&lt;/code&gt;。
:::&lt;/p&gt;
&lt;h2&gt;资料卡与公告&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;profile:
    avatar: &quot;/assets/images/avatar.svg&quot;        # 相对 /public 目录
    name: &quot;younisekai&quot;
    bio: &quot;在异世界的间隙里，写点代码，也写点故事。&quot;
    links:
        - name: &quot;GitHub&quot;
          icon: &quot;fa6-brands:github&quot;
          url: &quot;https://github.com/yourname/younisekai&quot;
        - name: &quot;RSS&quot;
          icon: &quot;fa6-solid:rss&quot;
          url: &quot;/rss.xml&quot;

announcement:
    title: &quot;异世界公告&quot;
    content: &quot;欢迎来到 younisekai，这里记录着我的代码、文字与旅途。&quot;
    closable: true          # 允许访客关闭公告
    link:
        enable: true
        text: &quot;了解更多&quot;
        url: &quot;/about/&quot;
        external: false
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;资料卡的社交链接支持站内地址（如 &lt;code&gt;/rss.xml&lt;/code&gt;）与站外地址，图标同样是 Iconify 名称。&lt;/p&gt;
&lt;h2&gt;文章卡片、许可与评论&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;字段&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.card.cover.side&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;列表卡片里封面的位置：&lt;code&gt;left&lt;/code&gt; 或 &lt;code&gt;right&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.card.cover.width&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;封面占卡片宽度的比例&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.card.cover.showContent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;封面上是否叠加标题、标签与摘要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.card.cover.showDefaultCover&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文章没写封面时是否显示默认封面&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.card.titleSize&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;卡片标题字号，Tailwind 文本类，例如 &lt;code&gt;text-2xl&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.showLastModified&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;是否显示「最后编辑」卡片&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.expressiveCode.theme&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;代码高亮主题&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.license.enable&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;是否在文章底部显示版权卡片&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.license.name&lt;/code&gt; / &lt;code&gt;url&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;全站默认许可协议，可被文章的 &lt;code&gt;licenseName&lt;/code&gt; / &lt;code&gt;licenseUrl&lt;/code&gt; 覆盖&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.comment.enable&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;评论总开关&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.comment.provider&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;waline&lt;/code&gt; 或 &lt;code&gt;twikoo&lt;/code&gt;；留空则自动选择已填好必填项的那个&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.comment.waline.serverURL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Waline 服务端地址&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.comment.twikoo.envId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Twikoo 环境 ID&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;:::note
评论是唯一依赖外部服务的功能：要么把服务端地址与 &lt;code&gt;enable&lt;/code&gt; 一起配好，要么保持关闭。关闭时页面上不会留下任何占位区域。
:::&lt;/p&gt;
&lt;h2&gt;其它开关&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;配置段&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;footer.enable&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;是否注入自定义页脚 HTML（备案号之类），内容写在 &lt;code&gt;footer.customHtml&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;particle.enable&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;背景粒子：&lt;code&gt;particleNum&lt;/code&gt; 数量、&lt;code&gt;size&lt;/code&gt; / &lt;code&gt;opacity&lt;/code&gt; / &lt;code&gt;speed&lt;/code&gt; 的取值范围、&lt;code&gt;limitTimes&lt;/code&gt; 越界次数、&lt;code&gt;zIndex&lt;/code&gt; 层级&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;改配置的推荐流程&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;只改 YAML，不动 &lt;code&gt;src/&lt;/code&gt; 里的源码&lt;/strong&gt;——升级模板时会轻松很多。&lt;/li&gt;
&lt;li&gt;改完先 &lt;code&gt;npm run dev&lt;/code&gt; 看效果，再 &lt;code&gt;npm run build&lt;/code&gt; 验证一次构建。&lt;/li&gt;
&lt;li&gt;站点地址、站点标题、导航、侧栏这四项是「先定下来」的配置项，越早改越省事。&lt;/li&gt;
&lt;li&gt;用 Git 记录每次配置改动，出问题能一键回退。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;配置之外的东西（新增挂件类型、改配色算法、加新页面）属于源码级定制，建议单独开分支，并在提交信息里写清动机，方便日后与上游对照。&lt;/p&gt;
</content:encoded><category>主题定制</category><category>主题定制</category><category>站点配置</category></item><item><title>图表与数学公式：Mermaid 与 KaTeX</title><link>https://kazeyouni.pages.dev/posts/diagrams-and-math/</link><guid isPermaLink="true">https://kazeyouni.pages.dev/posts/diagrams-and-math/</guid><description>用 Mermaid 画流程图、时序图、状态图、甘特图和饼图，用 KaTeX 写行内与独立公式，全部是可复制的纯文本写法。</description><pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;图表和公式是「技术文章值得写下来」的重要原因之一：一张图能替掉三段解释，一个公式能让「大概是这样」变成「就是这样」。&lt;/p&gt;
&lt;h2&gt;为什么用文本画图&lt;/h2&gt;
&lt;p&gt;Mermaid 的输入是纯文本，输出由浏览器现场渲染。好处很实际：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;图可以进 Git，改动可 diff、可回溯；&lt;/li&gt;
&lt;li&gt;换主题、换配色不用重画；&lt;/li&gt;
&lt;li&gt;不用打开任何绘图软件，写文章时顺手就画了。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;写法就是在代码块上标注 &lt;code&gt;mermaid&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;```mermaid
graph LR
    A[写作] --&amp;gt; B[构建]
```
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;流程图&lt;/h2&gt;
&lt;p&gt;从写作到上线，这条链路值得画出来——它解释了为什么「本地能跑」和「线上能跑」是两件事。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;graph TD
    A[写 Markdown] --&amp;gt; B{frontmatter 是否合法}
    B --&amp;gt;|否| C[构建报错并指出字段]
    B --&amp;gt;|是| D[渲染正文与扩展语法]
    D --&amp;gt; E[生成页面与数据集合页]
    E --&amp;gt; F[生成 Pagefind 搜索索引]
    F --&amp;gt; G{是否生产构建}
    G --&amp;gt;|是| H[跳过 draft 文章]
    G --&amp;gt;|否| I[草稿也一起预览]
    H --&amp;gt; J[输出 dist 目录]
    I --&amp;gt; J
    J --&amp;gt; K[部署到静态托管]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::tip
节点文字里出现 &lt;code&gt;{}&lt;/code&gt; &lt;code&gt;[]&lt;/code&gt; &lt;code&gt;()&lt;/code&gt; 时要用引号包起来，例如 &lt;code&gt;A[&quot;带括号的 (文字)&quot;]&lt;/code&gt;，否则 Mermaid 会把括号当成形状语法。
:::&lt;/p&gt;
&lt;h2&gt;时序图&lt;/h2&gt;
&lt;p&gt;带交互的功能适合用时序图说清楚「谁在什么时候做了什么」。以访问一篇加密文章为例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sequenceDiagram
    participant U as 读者
    participant B as 浏览器
    participant S as 静态页面

    U-&amp;gt;&amp;gt;B: 打开文章地址
    B-&amp;gt;&amp;gt;S: 请求页面
    S--&amp;gt;&amp;gt;B: 返回加密后的正文（密文）
    B--&amp;gt;&amp;gt;U: 显示密码输入框
    U-&amp;gt;&amp;gt;B: 输入密码并解锁
    B-&amp;gt;&amp;gt;B: 本地 AES 解密
    alt 密码正确
        B--&amp;gt;&amp;gt;U: 展开正文并渲染图表
    else 密码错误
        B--&amp;gt;&amp;gt;U: 提示「密码不正确」
    end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;关键结论写在图里了：&lt;strong&gt;解密发生在浏览器本地&lt;/strong&gt;，服务端从头到尾只发密文。&lt;/p&gt;
&lt;h2&gt;状态图&lt;/h2&gt;
&lt;p&gt;文章的「一生」其实是个状态机，用状态图画出来，&lt;code&gt;draft&lt;/code&gt; 与 &lt;code&gt;updated&lt;/code&gt; 的作用就一目了然：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;stateDiagram-v2
    [*] --&amp;gt; Draft
    state &quot;草稿&quot; as Draft
    state &quot;待发布&quot; as Ready
    state &quot;已发布&quot; as Published
    state &quot;已更新&quot; as Updated
    Draft --&amp;gt; Ready : 补全 frontmatter
    Ready --&amp;gt; Published : draft 改为 false
    Published --&amp;gt; Updated : 修改正文并更新 updated
    Updated --&amp;gt; Published : 重新构建
    Published --&amp;gt; Draft : 撤回修改
    Published --&amp;gt; [*] : 删除文件
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;甘特图&lt;/h2&gt;
&lt;p&gt;给内容排期的时候，甘特图比待办清单直观：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gantt
    title 站点内容建设排期
    dateFormat YYYY-MM-DD
    axisFormat %m/%d

    section 基础设施
    目录与数据集合           :done, a1, 2026-03-01, 10d
    搜索索引接入             :done, a2, after a1, 6d

    section 内容
    示例文章与写作指南       :active, b1, 2026-03-12, 20d
    图表与公式专题           :b2, after b1, 8d
    长文示例与归档整理       :b3, after b2, 10d

    section 收尾
    上线前检查               :c1, after b3, 5d
    正式上线                 :milestone, after c1, 0d
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;饼图&lt;/h2&gt;
&lt;p&gt;数据占比这种一眼就懂的东西，交给饼图：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pie title 文章分类占比（示例数据）
    &quot;内容创作&quot; : 4
    &quot;主题定制&quot; : 3
    &quot;入门指南&quot; : 1
    &quot;站点公告&quot; : 1
    &quot;技术笔记&quot; : 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以放心的是，Mermaid 支持的类型远不止这五种，类图、实体关系图、思维导图、时间线都能写，语法都是同一套「文字描述结构」的思路。&lt;/p&gt;
&lt;h2&gt;数学公式&lt;/h2&gt;
&lt;p&gt;行内公式写在单个美元符号之间，例如质能方程 $E = mc^2$、求根公式 $x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}$，或者站点里更常见的阅读时长估算 $t = \lceil w / 300 \rceil$。&lt;/p&gt;
&lt;p&gt;独立成行的公式用两个美元符号，会居中并单独占一行：&lt;/p&gt;
&lt;p&gt;$$
\text{阅读时长（分钟）} = \left\lceil \frac{\text{正文字数}}{300} \right\rceil
$$&lt;/p&gt;
&lt;h3&gt;多行对齐&lt;/h3&gt;
&lt;p&gt;用 &lt;code&gt;aligned&lt;/code&gt; 环境可以让等号对齐，推导过程会好读很多：&lt;/p&gt;
&lt;p&gt;$$
\begin{aligned}
S(n) &amp;amp;= \sum_{i=1}^{n} i \
&amp;amp;= \frac{n(n+1)}{2} \
&amp;amp;= \frac{n^2 + n}{2}
\end{aligned}
$$&lt;/p&gt;
&lt;h3&gt;矩阵与分段函数&lt;/h3&gt;
&lt;p&gt;$$
A = \begin{pmatrix}
a_{11} &amp;amp; a_{12} \
a_{21} &amp;amp; a_{22}
\end{pmatrix}
\qquad
f(x) =
\begin{cases}
x^2, &amp;amp; x \ge 0 \
-x,  &amp;amp; x &amp;lt; 0
\end{cases}
$$&lt;/p&gt;
&lt;h3&gt;常用符号速查&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;想要的效果&lt;/th&gt;
&lt;th&gt;写法&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;分式&lt;/td&gt;
&lt;td&gt;&lt;code&gt;\frac{a}{b}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;求和、连乘&lt;/td&gt;
&lt;td&gt;&lt;code&gt;\sum_{i=1}^{n}&lt;/code&gt;、&lt;code&gt;\prod_{i=1}^{n}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;积分&lt;/td&gt;
&lt;td&gt;&lt;code&gt;\int_{0}^{\infty} e^{-x}\,dx&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;极限&lt;/td&gt;
&lt;td&gt;&lt;code&gt;\lim_{x \to 0}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;希腊字母&lt;/td&gt;
&lt;td&gt;&lt;code&gt;\alpha \beta \gamma \Delta \Omega&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;上下标&lt;/td&gt;
&lt;td&gt;&lt;code&gt;x_i^2&lt;/code&gt;、&lt;code&gt;a_{n+1}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;向量与范数&lt;/td&gt;
&lt;td&gt;&lt;code&gt;\vec{v}&lt;/code&gt;、&lt;code&gt;\lVert v \rVert&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;文本混排&lt;/td&gt;
&lt;td&gt;&lt;code&gt;\text{说明文字}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;例如把上面几个符号拼起来：&lt;/p&gt;
&lt;p&gt;$$
\lim_{n \to \infty} \prod_{k=1}^{n} \left(1 + \frac{1}{k}\right)^{k} \quad \text{与} \quad \int_{0}^{1} x^{\alpha-1}(1-x)^{\beta-1},dx = B(\alpha, \beta)
$$&lt;/p&gt;
&lt;h3&gt;几个容易踩的坑&lt;/h3&gt;
&lt;p&gt;:::warning
&lt;strong&gt;美元符号会被当成公式定界符。&lt;/strong&gt; 想写出「价格 100 美元」这种句子时，请写 &lt;code&gt;100 美元&lt;/code&gt; 而不是 &lt;code&gt;100$&lt;/code&gt;，否则后面的文字会被解析成公式。
:::&lt;/p&gt;
&lt;p&gt;:::note
公式里的反斜杠在 Markdown 中是转义字符，命令行之类的场合请放到行内代码里（&lt;code&gt;`\frac`&lt;/code&gt;），不要直接裸写。
:::&lt;/p&gt;
&lt;h2&gt;组合建议&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;一篇文章最多两三张图&lt;/strong&gt;，超过就说明结构需要重新组织。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公式能简就简&lt;/strong&gt;：能一句话说清的结论，不必写成三重积分。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;图表要给标题或上下文&lt;/strong&gt;，脱离正文的图对读者和搜索引擎都不友好。&lt;/li&gt;
&lt;li&gt;图和公式都是纯文本，&lt;strong&gt;改动时优先改文字&lt;/strong&gt;，别去调整间距——渲染效果由主题统一控制。&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><category>内容创作</category><category>Mermaid</category><category>KaTeX</category><category>排版</category></item><item><title>排版速查表：Markdown 能写成什么样</title><link>https://kazeyouni.pages.dev/posts/markdown-showcase/</link><guid isPermaLink="true">https://kazeyouni.pages.dev/posts/markdown-showcase/</guid><description>把标题、列表、引用、表格、代码块、脚注、图片和本站扩展语法全部演示一遍，写文章时可以直接照着抄。</description><pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这一页是写给自己的备忘录：需要哪种排版，直接从这里复制写法。文中所有示例都是&lt;strong&gt;真实渲染&lt;/strong&gt;的，不是截图。&lt;/p&gt;
&lt;h2&gt;标题层级&lt;/h2&gt;
&lt;p&gt;正文用 &lt;code&gt;##&lt;/code&gt; 起步比较合适——文章标题本身已经占掉了最高一级。&lt;/p&gt;
&lt;h3&gt;三级标题&lt;/h3&gt;
&lt;h4&gt;四级标题&lt;/h4&gt;
&lt;p&gt;标题会自动生成锚点，鼠标悬停时右侧出现 &lt;code&gt;#&lt;/code&gt;，侧栏目录也会按层级同步展开。&lt;/p&gt;
&lt;h2&gt;文本与强调&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;加粗&lt;/strong&gt;、&lt;em&gt;斜体&lt;/em&gt;、&lt;s&gt;删除线&lt;/s&gt;、&lt;code&gt;行内代码&lt;/code&gt;、&lt;a href=&quot;https://astro.build/&quot;&gt;普通链接&lt;/a&gt;、上标式写法如 H~2~O 与 x^2^（部分语法取决于渲染器，不保证全部生效）。&lt;/p&gt;
&lt;p&gt;需要打断行时，行尾两个空格即可，例如这一行结尾有两个空格，&lt;br /&gt;
所以这一句出现在了新的一行。&lt;/p&gt;
&lt;h2&gt;列表&lt;/h2&gt;
&lt;p&gt;无序列表：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一项&lt;/li&gt;
&lt;li&gt;第二项
&lt;ul&gt;
&lt;li&gt;嵌套一层&lt;/li&gt;
&lt;li&gt;再嵌套一层&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第三项&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;有序列表：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;收集素材&lt;/li&gt;
&lt;li&gt;写出草稿&lt;/li&gt;
&lt;li&gt;通读一遍并删掉三分之一&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;任务列表（GitHub 风格）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[x] 建好目录结构&lt;/li&gt;
&lt;li&gt;[x] 接入搜索&lt;/li&gt;
&lt;li&gt;[ ] 补齐示例内容&lt;/li&gt;
&lt;li&gt;[ ] 换个自己的域名&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;引用&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;引用适合放别人的观点、规范原文或需要特别强调的一段话。&lt;/p&gt;
&lt;p&gt;引用内部同样支持&lt;strong&gt;行内样式&lt;/strong&gt;与列表：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个要点&lt;/li&gt;
&lt;li&gt;另一个要点&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2&gt;表格&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;列名&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;字符串&lt;/td&gt;
&lt;td&gt;左对齐是默认值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pinned&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;布尔&lt;/td&gt;
&lt;td&gt;居中对齐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;published&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;日期&lt;/td&gt;
&lt;td&gt;右对齐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;表格支持对齐语法（&lt;code&gt;:---&lt;/code&gt;、&lt;code&gt;:---:&lt;/code&gt;、&lt;code&gt;---:&lt;/code&gt;），单元格里可以用行内代码与链接。&lt;/p&gt;
&lt;h2&gt;代码块&lt;/h2&gt;
&lt;h3&gt;多语言示例&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// JavaScript：把文章按发布时间倒序排列
export function sortByPublished(posts) {
    return [...posts].sort((a, b) =&amp;gt; new Date(b.published) - new Date(a.published));
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;// TypeScript：给内容集合的字段加上类型
interface PostFrontmatter {
    title: string;
    published: Date;
    tags: string[];
    pinned?: boolean;
}

export function isPinned(post: PostFrontmatter): boolean {
    return post.pinned === true;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# Python：粗略统计每个标签出现的次数
from collections import Counter

def tag_cloud(posts):
    counter = Counter(tag for post in posts for tag in post[&quot;tags&quot;])
    return counter.most_common(10)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;title&quot;: &quot;示例条目&quot;,
    &quot;tags&quot;: [&quot;Markdown&quot;, &quot;排版&quot;],
    &quot;visible&quot;: true
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;/* CSS：给引用块加一条左侧色带 */
blockquote {
    border-inline-start: 3px solid var(--primary);
    padding-inline-start: 1rem;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# 构建并在本地预览产物
npm run build
npm run preview
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;标题、行号与文本高亮&lt;/h3&gt;
&lt;p&gt;给代码块加上 &lt;code&gt;title&lt;/code&gt; 会显示文件名栏，&lt;code&gt;showLineNumbers=true&lt;/code&gt; 打开行号，&lt;code&gt;ins&lt;/code&gt; / &lt;code&gt;del&lt;/code&gt; / &lt;code&gt;mark&lt;/code&gt; 可以标记新增、删除与重点行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;```js title=&quot;sort-posts.js&quot; showLineNumbers=true ins={4} del={2} mark={6}
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;渲染效果如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function sortPosts(posts) {
    return posts.sort((a, b) =&amp;gt; a.date - b.date);
    const items = [...posts];
    return items.sort((a, b) =&amp;gt; new Date(b.published) - new Date(a.published));
    // 下面这一行是这次改动的重点
    console.log(&quot;排序完成&quot;, items.length);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;可折叠代码段&lt;/h3&gt;
&lt;p&gt;内容很长的代码块可以折叠起来，读者点一下「展开」再看细节。语法是在代码块信息串里写 &lt;code&gt;collapse={起始行-结束行}&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;```ts collapse={2-6}
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;实际效果：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export const siteMeta = {
    name: &quot;younisekai&quot;,
    version: &quot;1.0.0&quot;,
    generator: &quot;Astro&quot;,
    search: &quot;pagefind&quot;,
    comments: false,
};

export function describe() {
    return `${siteMeta.name} v${siteMeta.version}`;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;脚注&lt;/h2&gt;
&lt;p&gt;脚注适合放补充说明和引用出处&lt;a href=&quot;%E8%BF%99%E6%98%AF%E4%B8%80%E4%B8%AA%E8%84%9A%E6%B3%A8%EF%BC%8C%E7%82%B9%E5%8F%B3%E4%B8%8A%E8%A7%92%E7%9A%84%E5%BA%8F%E5%8F%B7%E5%8F%AF%E4%BB%A5%E8%B7%B3%E5%9B%9E%E6%AD%A3%E6%96%87%E3%80%82&quot;&gt;^1&lt;/a&gt;。定义可以写在文章任意位置，渲染时会自动收到文末[^docs]。&lt;/p&gt;
&lt;p&gt;[^docs]: 官方文档通常是最靠得住的参考资料，例如 &lt;a href=&quot;https://docs.astro.build/&quot;&gt;Astro 文档&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;链接与图片&lt;/h2&gt;
&lt;p&gt;行内链接：&lt;a href=&quot;https://docs.astro.build/&quot;&gt;Astro 官方文档&lt;/a&gt;、&lt;a href=&quot;https://pagefind.app/&quot;&gt;Pagefind 搜索&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;图片可以直接引用 &lt;code&gt;public&lt;/code&gt; 目录下的占位图：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://kazeyouni.pages.dev/assets/images/placeholders/p-01.svg&quot; alt=&quot;一张渐变占位图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;也可以引用与文章放在一起的图片，写法是 &lt;code&gt;./路径&lt;/code&gt;（相对于当前 Markdown 文件）：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://kazeyouni.pages.dev/_astro/relative-image-demo.BXGg3a8x_IKsGD.webp&quot; alt=&quot;与文章放在一起的示例图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::tip
相对路径（&lt;code&gt;./xxx.png&lt;/code&gt;）适合会跟着文章一起搬家的素材；&lt;code&gt;public&lt;/code&gt; 目录下的绝对路径（&lt;code&gt;/assets/...&lt;/code&gt;）适合全站复用的封面与头像。注意相对路径引用的是图片&lt;strong&gt;文件本身&lt;/strong&gt;，构建时会被一并处理；一旦路径写错，构建会直接报 &lt;code&gt;ImageNotFound&lt;/code&gt; 而不是静默跳过。
:::&lt;/p&gt;
&lt;h2&gt;GitHub 仓库卡片&lt;/h2&gt;
&lt;p&gt;写一行指令就能得到一张会实时拉取数据的仓库卡片：&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;withastro/astro&quot;}&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;::github{repo=&quot;withastro/astro&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
卡片里的 star 数、协议、语言等信息由访客浏览器现场请求 GitHub API 获取，所以第一次打开时会短暂显示「Waiting...」。仓库名必须写成 &lt;code&gt;作者/仓库&lt;/code&gt; 的格式。
:::&lt;/p&gt;
&lt;h2&gt;提示框&lt;/h2&gt;
&lt;h3&gt;五种类型&lt;/h3&gt;
&lt;p&gt;:::note
note：需要读者留意、但即使跳读也不该错过的信息。
:::&lt;/p&gt;
&lt;p&gt;:::tip
tip：能让人少走弯路的可选建议。
:::&lt;/p&gt;
&lt;p&gt;:::important
important：完成某件事所必需的关键信息。
:::&lt;/p&gt;
&lt;p&gt;:::warning
warning：存在风险、需要立刻注意的内容。
:::&lt;/p&gt;
&lt;p&gt;:::caution
caution：某个操作可能带来的负面后果。
:::&lt;/p&gt;
&lt;p&gt;如上所示，写法是三个冒号包住一段内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::note
需要读者留意的信息。
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;自定义标题&lt;/h3&gt;
&lt;p&gt;在类型后面接方括号即可覆盖默认标题：&lt;/p&gt;
&lt;p&gt;:::note[这里的标题是我自己写的]
标题支持中英文与行内样式，正文部分照常支持 Markdown。
:::&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::note[这里的标题是我自己写的]
标题支持中英文与行内样式。
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;GitHub 风格提示框&lt;/h3&gt;
&lt;p&gt;习惯 GitHub 写法的话，用引用块加类型标记也可以：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
这种写法在 GitHub 上能正确渲染，在本站同样会被识别成提示框。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; [!TIP]
&amp;gt; 这种写法在本站同样会被识别成提示框。
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;隐藏文本&lt;/h3&gt;
&lt;p&gt;需要防剧透或者放一点小彩蛋时，用行内指令：&lt;/p&gt;
&lt;p&gt;这段内容的结论是 :spoiler[其实答案就在下一段，但我先藏起来了]。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;这段内容的结论是 :spoiler[其实答案就在这里]。
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;组合使用的建议&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;少即是多&lt;/strong&gt;：一篇文章里提示框超过五个，读者就会开始忽略它们。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码块给语言名&lt;/strong&gt;：&lt;code&gt;bash&lt;/code&gt;、&lt;code&gt;json&lt;/code&gt;、&lt;code&gt;ts&lt;/code&gt; 这些标记不仅有配色，也让复制按钮与语言角标更准确。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;长代码折叠&lt;/strong&gt;：超过 20 行的示例，用 &lt;code&gt;collapse&lt;/code&gt; 折叠，把注意力留给结论。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;图片要写替代文本&lt;/strong&gt;：方括号里的描述对无障碍阅读与 RSS 都很重要，别留空。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;语法速查就到这里。图表与公式见&lt;a href=&quot;/posts/diagrams-and-math/&quot;&gt;图表与数学公式&lt;/a&gt;。&lt;/p&gt;
</content:encoded><category>内容创作</category><category>Markdown</category><category>排版</category></item><item><title>写作指南：frontmatter 全解析</title><link>https://kazeyouni.pages.dev/posts/guide/writing-guide/</link><guid isPermaLink="true">https://kazeyouni.pages.dev/posts/guide/writing-guide/</guid><description>逐项解释文章开头的每个 frontmatter 字段，并说清草稿、分类、标签、封面与复制保护到底是怎么生效的。</description><pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;一篇文章的开头两行 &lt;code&gt;---&lt;/code&gt; 之间，就是 frontmatter：它不参与正文排版，却决定了文章出现在哪里、长什么样、给谁看。&lt;/p&gt;
&lt;h2&gt;一篇文章的最小结构&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;---
title: 我的第一篇笔记
published: 2026-03-18
description: 一句话说清这篇写的是什么。
---

正文从这里开始。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;只写这三个字段就能发布。其余字段按需添加，全部缺省值都是「不启用」。&lt;/p&gt;
&lt;h2&gt;字段总览&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;字段&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;默认值&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;字符串&lt;/td&gt;
&lt;td&gt;必填&lt;/td&gt;
&lt;td&gt;文章标题，同时用于列表页、RSS 与浏览器标题&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;directoryTitle&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;字符串&lt;/td&gt;
&lt;td&gt;空&lt;/td&gt;
&lt;td&gt;侧栏目录树中显示的名字；留空时回退为 &lt;code&gt;title&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;published&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;日期&lt;/td&gt;
&lt;td&gt;空&lt;/td&gt;
&lt;td&gt;发布日期，用于排序；留空时回退到文件的 Git 首次提交时间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;updated&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;日期&lt;/td&gt;
&lt;td&gt;空&lt;/td&gt;
&lt;td&gt;更新日期；填写后会显示「上次编辑」卡片与文章底部的差异信息&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;字符串&lt;/td&gt;
&lt;td&gt;空&lt;/td&gt;
&lt;td&gt;摘要，显示在列表卡片、分享卡片与搜索结果里&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cover&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;字符串&lt;/td&gt;
&lt;td&gt;空&lt;/td&gt;
&lt;td&gt;封面图，见下方「封面怎么填」&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;coverInContent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;布尔&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;是否在正文顶部再渲染一次封面大图&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;category&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;字符串或数组&lt;/td&gt;
&lt;td&gt;空&lt;/td&gt;
&lt;td&gt;分类，数组即嵌套分类&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tags&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;数组或逗号分隔字符串&lt;/td&gt;
&lt;td&gt;空&lt;/td&gt;
&lt;td&gt;标签，用于标签云与归档筛选&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lang&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;字符串&lt;/td&gt;
&lt;td&gt;空&lt;/td&gt;
&lt;td&gt;内容语言，例如 &lt;code&gt;zh_CN&lt;/code&gt;；用于 RSS 与 HTML 的语言标记&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pinned&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;布尔&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;是否置顶到文章列表最前&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;author&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;字符串&lt;/td&gt;
&lt;td&gt;空&lt;/td&gt;
&lt;td&gt;作者名，显示在版权卡片里；留空则用站点资料页的名字&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sourceLink&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;字符串&lt;/td&gt;
&lt;td&gt;空&lt;/td&gt;
&lt;td&gt;原文或来源链接，填写后版权卡片会指向它&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;licenseName&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;字符串&lt;/td&gt;
&lt;td&gt;空&lt;/td&gt;
&lt;td&gt;本篇文章的许可协议名称，例如 &lt;code&gt;CC BY 4.0&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;licenseUrl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;字符串&lt;/td&gt;
&lt;td&gt;空&lt;/td&gt;
&lt;td&gt;许可协议链接&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;comment&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;布尔&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;这篇文章是否允许评论；实际是否显示还取决于站点配置里的评论总开关&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;布尔&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;草稿标记，生产构建会跳过草稿&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;encrypted&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;布尔&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;是否对正文加密&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;password&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;字符串&lt;/td&gt;
&lt;td&gt;空&lt;/td&gt;
&lt;td&gt;解锁密码，与 &lt;code&gt;encrypted: true&lt;/code&gt; 配对使用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;copyProtection&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;对象&lt;/td&gt;
&lt;td&gt;全部 &lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;页面级复制保护开关，见下文&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;routeName&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;字符串&lt;/td&gt;
&lt;td&gt;空&lt;/td&gt;
&lt;td&gt;额外的自定义地址（不替换默认地址）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;:::tip
&lt;code&gt;prevTitle&lt;/code&gt;、&lt;code&gt;prevSlug&lt;/code&gt;、&lt;code&gt;nextTitle&lt;/code&gt;、&lt;code&gt;nextSlug&lt;/code&gt; 这四个字段由构建过程自动填充，用来生成文章底部的上一篇/下一篇跳转，&lt;strong&gt;不要在 frontmatter 里手写&lt;/strong&gt;。
:::&lt;/p&gt;
&lt;h2&gt;日期怎么写&lt;/h2&gt;
&lt;p&gt;推荐 ISO 8601 的 &lt;code&gt;YYYY-MM-DD&lt;/code&gt;，需要精确到时间就写 &lt;code&gt;YYYY-MM-DDTHH:mm:ss&lt;/code&gt;。&lt;code&gt;published&lt;/code&gt; 决定排序，&lt;code&gt;updated&lt;/code&gt; 只影响「最后修改于多久之前」的展示：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;published: 2026-03-18
updated: 2026-05-06
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
没有写 &lt;code&gt;published&lt;/code&gt; 时，构建会依次尝试读取该文件的 Git 首次提交时间、文件创建时间。为了排序稳定，公开发布的文章建议都显式写上日期。
:::&lt;/p&gt;
&lt;h2&gt;分类与标签&lt;/h2&gt;
&lt;p&gt;分类是「树」，标签是「云」，两者用途不同：分类回答「这篇属于哪个板块」，标签回答「这篇讲到了哪些点」。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 单层分类
category: 内容创作

# 嵌套分类：写在数组里，用「 / 」连接展示
category: [技术笔记, 前端]

# 标签可以写成数组
tags: [Markdown, 排版]

# 也可以写成逗号分隔的字符串，效果相同
tags: Markdown, 排版
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;嵌套分类在本站的表现：侧栏的「文章类别」会按层级展开，点击后跳转到归档页的筛选结果，地址形如 &lt;code&gt;/archive/?category=技术笔记%20%2F%20前端&lt;/code&gt;。也就是说嵌套分类是&lt;strong&gt;整体匹配&lt;/strong&gt;的，点「技术笔记 / 前端」只会筛出同时属于这两层的文章。&lt;/p&gt;
&lt;h2&gt;封面怎么填&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;cover&lt;/code&gt; 支持三种写法，按前缀区分：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cover: /assets/images/covers/cover-01.svg   # 以 / 开头：public 目录下的文件
cover: ./cover.svg                          # 以 ./ 开头：与文章同目录的文件
cover: https://example.com/cover.png        # 以 http 开头：网络图片
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;至于 &lt;code&gt;coverInContent&lt;/code&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;coverInContent: false&lt;/code&gt;（默认）：封面只出现在&lt;strong&gt;列表卡片&lt;/strong&gt;上，正文里不会再出现一次大图。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;coverInContent: true&lt;/code&gt;：封面额外渲染在&lt;strong&gt;正文标题与元信息之下&lt;/strong&gt;，形成「题图」效果，适合长文。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;两者可以同时给，也可以只给 &lt;code&gt;cover&lt;/code&gt;，甚至完全不给——没封面时列表卡片会使用默认封面。&lt;/p&gt;
&lt;h2&gt;草稿机制&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;draft: true
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;开发模式下草稿&lt;strong&gt;照常显示&lt;/strong&gt;，方便你边写边预览。&lt;/li&gt;
&lt;li&gt;生产构建（&lt;code&gt;npm run build&lt;/code&gt;）会跳过所有草稿，RSS、站点地图、搜索结果与侧栏目录树里都不会出现它们。&lt;/li&gt;
&lt;li&gt;想让人在看得到、但暂时不想进列表，可以用 &lt;code&gt;pinned&lt;/code&gt; + 不写 &lt;code&gt;description&lt;/code&gt; 之类的组合，不过那属于权宜之计，正式做法仍是草稿开关。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;加密与复制保护&lt;/h2&gt;
&lt;p&gt;正文加密只需要两个字段：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;encrypted: true
password: &quot;younisekai&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;构建时会把渲染好的正文用 AES 加密后写进页面，只有在访客输入正确密码时才会在浏览器端解密展开。演示与注意事项见&lt;a href=&quot;/posts/encrypted-note/&quot;&gt;给文章加一把锁&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;复制保护是四个互不影响的小开关：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;copyProtection:
    blockSelection: true      # 禁止选中文本
    blockClipboard: true      # 拦截复制、剪切、粘贴
    blockContextMenu: true    # 禁止右键菜单
    blockDevTools: true       # 屏蔽 F12、Ctrl+U、Ctrl+S
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;四项默认都是 &lt;code&gt;false&lt;/code&gt;，按需开启；每一项的具体行为见&lt;a href=&quot;/posts/copy-protection/&quot;&gt;复制保护四种开关&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;作者、来源与许可&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;author: 游音
sourceLink: https://example.com/original
licenseName: CC BY 4.0
licenseUrl: https://creativecommons.org/licenses/by/4.0/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;版权卡片会优先使用这里填的值，&lt;code&gt;licenseName&lt;/code&gt; 留空时则回落到站点配置里的默认协议。转载、翻译或引用他人内容时，把 &lt;code&gt;sourceLink&lt;/code&gt; 填上是最基本的礼貌。&lt;/p&gt;
&lt;h2&gt;被忽略的文件&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;src/content/posts/&lt;/code&gt; 下&lt;strong&gt;以 &lt;code&gt;_&lt;/code&gt; 开头的文件不会生成页面&lt;/strong&gt;，可以放心用来放模板、素材说明和草稿片段。本仓库里的 &lt;code&gt;_frontmatter-template.md&lt;/code&gt; 就是这么一份可直接复制的模板。&lt;/p&gt;
</content:encoded><category>内容创作</category><category>Markdown</category><category>写作技巧</category><category>排版</category></item><item><title>快速上手：从本地到线上</title><link>https://kazeyouni.pages.dev/posts/start/</link><guid isPermaLink="true">https://kazeyouni.pages.dev/posts/start/</guid><description>环境准备、本地开发、新建内容、构建与部署的完整流程，附常用脚本命令速查与上线前检查清单。</description><pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这一篇只讲「怎么把它跑起来并发布出去」。所有命令都在项目根目录执行。&lt;/p&gt;
&lt;h2&gt;环境准备&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;依赖&lt;/th&gt;
&lt;th&gt;版本要求&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;gt;= 20.3.0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;构建、脚本与 Astro 都依赖它，版本写在 &lt;code&gt;package.json&lt;/code&gt; 的 &lt;code&gt;engines&lt;/code&gt; 里&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;包管理器&lt;/td&gt;
&lt;td&gt;npm / pnpm / yarn 任选&lt;/td&gt;
&lt;td&gt;仓库内附带 &lt;code&gt;package-lock.json&lt;/code&gt;，用 npm 最省事&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Git&lt;/td&gt;
&lt;td&gt;任意较新版本&lt;/td&gt;
&lt;td&gt;文章的发布日期在缺省时会回退到文件的 Git 首次提交时间&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;:::note
搜索索引、图片处理这些都跑在本地构建阶段，不需要额外安装数据库或服务端环境。真正需要联网的只有两处：Mermaid 图表（运行时从 CDN 取库）与 GitHub 卡片（运行时请求 GitHub API）。
:::&lt;/p&gt;
&lt;h2&gt;安装与启动&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 1. 安装依赖
npm install

# 2. 启动本地开发服务器（默认 http://localhost:4321/）
npm run dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;开发服务器带热更新：改 Markdown、改 JSON、改样式，浏览器里会立刻反映出来。文章出现在 &lt;code&gt;/posts/&amp;lt;文件名&amp;gt;/&lt;/code&gt;，数据集合分别对应 &lt;code&gt;/projects/&lt;/code&gt;、&lt;code&gt;/skills/&lt;/code&gt;、&lt;code&gt;/timeline/&lt;/code&gt;、&lt;code&gt;/diary/&lt;/code&gt;、&lt;code&gt;/albums/&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;常用脚本速查&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;命令&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;npm run dev&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;生成图标数据后启动开发服务器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;npm run build&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;先生成图标数据，再执行 Astro 构建并调用 Pagefind 生成搜索索引&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;npm run preview&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;本地预览构建产物（建议每次发版前跑一遍）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;npm run check&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Astro 官方检查：内容集合 schema、组件引用、类型问题&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;npm run type-check&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;只跑 TypeScript 类型检查，不产出文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;npm run new-post -- &quot;文章标题&quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;按 schema 生成一篇带完整 frontmatter 的空文章&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;npm run assets&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;重新生成资源配置相关的产物&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;npm run check-stylus&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;检查内联 Stylus 样式能否正常编译&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;用脚本新建一篇文章&lt;/h2&gt;
&lt;p&gt;手写 frontmatter 容易漏字段，所以仓库里准备了一个小脚本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 在 posts 根目录建一篇文章
npm run new-post -- &quot;我的第一篇笔记&quot;

# 放在子目录里（目录不存在会自动创建）
npm run new-post -- &quot;guide/写作速查&quot;

# 顺便把标签也写好
npm run new-post -- &quot;读书笔记&quot; --tags 读书,随笔

# 也可以显式指定扩展名
npm run new-post -- &quot;随笔.mdx&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;脚本会把文件写到 &lt;code&gt;src/content/posts/&lt;/code&gt; 下，并填好与内容集合 schema 一致的全部字段，接着你只要改内容即可。&lt;/p&gt;
&lt;h2&gt;目录与命名约定&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;文章&lt;/strong&gt;：&lt;code&gt;src/content/posts/&lt;/code&gt; 下的 &lt;code&gt;.md&lt;/code&gt; 或 &lt;code&gt;.mdx&lt;/code&gt; 文件，&lt;strong&gt;文件名就是网址&lt;/strong&gt;。放在子目录里网址也会带上子目录，例如本文件位于 &lt;code&gt;posts/guide/getting-started.md&lt;/code&gt;，默认地址是 &lt;code&gt;/posts/guide/getting-started/&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据&lt;/strong&gt;：项目、技能、历程、日记、相册、友链各占一个目录，&lt;strong&gt;文件名就是条目的 id&lt;/strong&gt;，请保持唯一。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;以 &lt;code&gt;_&lt;/code&gt; 开头的文件会被忽略&lt;/strong&gt;：&lt;code&gt;src/content/posts/_草稿模板.md&lt;/code&gt; 不会生成页面，适合放模板、片段和素材说明。&lt;/li&gt;
&lt;li&gt;目录名与文件名建议用英文小写加连字符，避免网址里出现需要转义的中文。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;侧栏目录树里的显示名&lt;/h3&gt;
&lt;p&gt;侧栏目录树会用两种方式取名：&lt;strong&gt;目录节点&lt;/strong&gt;直接用目录名，&lt;strong&gt;文章节点&lt;/strong&gt;则优先用 frontmatter 里的 &lt;code&gt;directoryTitle&lt;/code&gt;，没写就回退到 &lt;code&gt;title&lt;/code&gt;。所以「目录名保持英文、显示名交给 &lt;code&gt;directoryTitle&lt;/code&gt;」是推荐做法：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: 快速上手：从本地到线上
directoryTitle: 快速上手
---
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;自定义文章地址&lt;/h3&gt;
&lt;p&gt;给文章加上 &lt;code&gt;routeName&lt;/code&gt; 之后，它在默认地址之外&lt;strong&gt;额外&lt;/strong&gt;多出一个更短的地址：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: 快速上手：从本地到线上
routeName: &quot;start&quot;
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上面这段配置会让这篇同时可以通过 &lt;code&gt;/posts/start/&lt;/code&gt; 访问（默认的 &lt;code&gt;/posts/guide/getting-started/&lt;/code&gt; 依然有效）。适合把常被引用的文章挂一个短地址，比如 &lt;code&gt;/posts/start/&lt;/code&gt;、&lt;code&gt;/posts/faq/&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;构建与部署&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;npm run build      # 产出 dist/，并在其中生成 pagefind/ 搜索索引
npm run preview    # 用本地服务器预览 dist/ 的实际效果
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;构建脚本会自动识别部署平台并把索引写进对应的产物目录：GitHub Actions、Cloudflare Pages、Netlify 用 &lt;code&gt;dist/&lt;/code&gt;，Vercel 用 &lt;code&gt;.vercel/output/static/&lt;/code&gt;。纯静态部署时，&lt;code&gt;dist/&lt;/code&gt; 整个目录丢到任意静态托管（对象存储 + CDN、Nginx、GitHub Pages 都行）即可。&lt;/p&gt;
&lt;p&gt;:::tip
如果部署平台支持缓存，记得把 &lt;code&gt;dist/pagefind/&lt;/code&gt; 一起上传。少了它，页面还在，但搜索框会一直转圈。
:::&lt;/p&gt;
&lt;p&gt;仓库里还带了 &lt;code&gt;Dockerfile&lt;/code&gt; 与 &lt;code&gt;docker-compose.yml&lt;/code&gt;，想自建服务器的话可以直接构建镜像运行。&lt;/p&gt;
&lt;h2&gt;上线前检查清单&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[ ] &lt;code&gt;npm run check&lt;/code&gt; 没有报错&lt;/li&gt;
&lt;li&gt;[ ] 站点的 &lt;code&gt;siteURL&lt;/code&gt; 已改成自己的域名（影响 RSS、站点地图与分享卡片）&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;npm run new-post&lt;/code&gt; 建的那几篇示例文章已替换成自己的内容&lt;/li&gt;
&lt;li&gt;[ ] 想隐藏的示例文章加上 &lt;code&gt;draft: true&lt;/code&gt;，或直接删掉文件&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;cover&lt;/code&gt; 指向的图片确实存在（本地相对路径用 &lt;code&gt;./xxx.svg&lt;/code&gt;，&lt;code&gt;public&lt;/code&gt; 目录里的用 &lt;code&gt;/assets/...&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;[ ] 需要加密的文章同时设置了 &lt;code&gt;encrypted: true&lt;/code&gt; 与 &lt;code&gt;password&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;[ ] 评论等外部服务要么配置好，要么在配置里显式关掉&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;常见问题&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;构建成功但文章不见了？&lt;/strong&gt;
先看 &lt;code&gt;draft&lt;/code&gt;。生产构建会跳过所有 &lt;code&gt;draft: true&lt;/code&gt; 的文章，开发模式则仍然显示，方便边写边看。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;封面图没显示？&lt;/strong&gt;
检查路径写法：以 &lt;code&gt;/&lt;/code&gt; 开头表示 &lt;code&gt;public&lt;/code&gt; 目录下的文件，以 &lt;code&gt;./&lt;/code&gt; 开头表示与文章同目录的文件，以 &lt;code&gt;http&lt;/code&gt; 开头表示网络图片。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;想换主题色、改侧栏组件顺序？&lt;/strong&gt;
这些都在站点总配置文件里，字段说明见&lt;a href=&quot;/posts/theme-configuration/&quot;&gt;主题与站点配置&lt;/a&gt;。&lt;/p&gt;
</content:encoded><category>入门指南</category><category>入门</category><category>Astro</category><category>站点配置</category></item></channel></rss>