<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss/feed.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>云酱の小窝</title><description>才不是傲娇雌小鬼！</description><link>https://www.fon1173.top</link><language>ko</language><item><title>从 Astro 5 到 Astro 6：astro-koharu 的一次完整迁移实录</title><link>https://www.fon1173.top/ko/post/astro-6-migration</link><guid isPermaLink="false">ko:astro-6-migration</guid><description>记录 astro-koharu 从 Astro 5.16.6 升级到 6.4.8 的完整过程，并解决历史文章、旧备份与下游仓库的一键迁移问题。</description><pubDate>Sun, 19 Jul 2026 19:50:03 GMT</pubDate><content:encoded>&lt;p&gt;这次升级看起来只是把 &lt;code&gt;astro&lt;/code&gt; 从 5.16.6 改成 6.x，实际却穿过了内容身份、Markdown 编译、Vite
预渲染、RSS 和第三方 integration 五条链路。更麻烦的是，astro-koharu 不是只有一个模板仓库：每位用户都有自己的
文章、永久链接、历史备份和生成资产。模板能构建，不等于用户升级后不会丢 URL，也不等于恢复一份旧备份后仍能构建。&lt;/p&gt;
&lt;p&gt;因此，真正困难的不是让 &lt;code&gt;pnpm build&lt;/code&gt; 变绿，而是同时证明两件事：升级前后的 URL、多语言 fallback、搜索索引和文章
HTML 没有悄悄改变；一份长期使用的下游仓库也能通过同一套工具安全迁移，而不需要用户逐篇修改 frontmatter。&lt;/p&gt;
&lt;p&gt;本文记录的是 astro-koharu 的真实迁移结果。最终版本为 Astro 6.4.8，没有启用 Content Collections legacy
兼容开关，也没有把实验特性留在生产配置中。迁移最终还补上了一条可 dry-run、自动备份且幂等的内容迁移命令，并用
376 篇真实历史文章的完整备份恢复验证了这条路径。&lt;/p&gt;
&lt;h2&gt;先定义成功，而不是先改版本号&lt;a href=&quot;#先定义成功而不是先改版本号&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.astro.build/en/guides/upgrade-to/v6/&quot;&gt;Astro 6 升级指南&lt;/a&gt;要求 Node.js 22.12+，并伴随 Zod 4、
Shiki 4 及 Vite 7 构建管线的变化。迁移时 npm 的 &lt;code&gt;astro@latest&lt;/code&gt; 已经进入 7.x，因此不能无版本约束地运行升级命令。
本次把 Astro 精确锁定在 &lt;code&gt;6.4.8&lt;/code&gt;，同时把 Node 边界和 pnpm 版本落到 &lt;code&gt;package.json&lt;/code&gt;：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;packageManager&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;pnpm@10.28.2&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;engines&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;&lt;/span&gt;&lt;span&gt;node&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&amp;gt;=22.12.0&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;dependencies&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;&lt;/span&gt;&lt;span&gt;astro&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;6.4.8&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;精确版本不只是为了重现本次构建。Koharu 的新版更新流程也会读取 &lt;code&gt;packageManager&lt;/code&gt;，并用声明的
pnpm 精确版本安装依赖，避免更新到新 lockfile 后又意外回落到调用者机器上的旧 pnpm。&lt;/p&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;Astro 5.16.6 基线&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;astro check&lt;/code&gt;&lt;/td&gt;&lt;td&gt;347 个文件，0 error / warning / hint&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Astro 静态页面&lt;/td&gt;&lt;td&gt;130&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pagefind 索引页面&lt;/td&gt;&lt;td&gt;134&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;dist/&lt;/code&gt; 路由产物&lt;/td&gt;&lt;td&gt;141&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Astro 报告的构建耗时&lt;/td&gt;&lt;td&gt;约 21.62 秒&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;成功标准不只是页面数相等，还包括四类不变式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;默认语言 URL 不带前缀，英文和日文继续使用 &lt;code&gt;/en/&lt;/code&gt;、&lt;code&gt;/ja/&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;frontmatter 的 &lt;code&gt;link&lt;/code&gt; 仍然可以覆盖公开 slug，未翻译页面的 canonical 仍指向默认语言；&lt;/li&gt;
&lt;li&gt;GFM、Shiki、KaTeX、Mermaid、Pagefind、RSS、sitemap 和 robots 继续生成。&lt;/li&gt;
&lt;li&gt;历史文章迁移前后保留相同公开 URL，旧备份恢复后不会混入新版模板自带的示例内容。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Fonts API、CSP、Live Content Collections、Rust compiler 和 queued rendering 都不在兼容迁移范围内。把新功能与
major upgrade 混在一起，会让故障定位和回滚都变得困难。&lt;/p&gt;
&lt;h2&gt;依赖升级不是全部追最新&lt;a href=&quot;#依赖升级不是全部追最新&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&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;code&gt;astro&lt;/code&gt;&lt;/td&gt;&lt;td&gt;5.16.6&lt;/td&gt;&lt;td&gt;6.4.8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;@astrojs/react&lt;/code&gt;&lt;/td&gt;&lt;td&gt;4.4.2&lt;/td&gt;&lt;td&gt;5.0.7&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;@astrojs/sitemap&lt;/code&gt;&lt;/td&gt;&lt;td&gt;3.7.0&lt;/td&gt;&lt;td&gt;3.7.3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;@astrojs/rss&lt;/code&gt;&lt;/td&gt;&lt;td&gt;4.0.14&lt;/td&gt;&lt;td&gt;4.0.19&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;shiki&lt;/code&gt;&lt;/td&gt;&lt;td&gt;3.22.0&lt;/td&gt;&lt;td&gt;4.3.1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;astro-mermaid&lt;/code&gt;&lt;/td&gt;&lt;td&gt;1.2.0&lt;/td&gt;&lt;td&gt;2.1.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;astro-pagefind&lt;/code&gt;&lt;/td&gt;&lt;td&gt;1.8.5&lt;/td&gt;&lt;td&gt;1.8.6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;astro-loading-indicator&lt;/code&gt;&lt;/td&gt;&lt;td&gt;0.7.1&lt;/td&gt;&lt;td&gt;0.9.0&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;这里最反直觉的是 &lt;code&gt;astro-pagefind&lt;/code&gt;。2.x 的确支持 Astro 6，但它同时把原来的搜索组件改成了 Web Component API。
直接升级会迫使现有搜索样式、键盘导航和本地化一起重写。1.8.6 已补上 Astro 6 peer 支持，又保留旧 UI，所以它才是
这次兼容迁移的合理目标。&lt;/p&gt;
&lt;p&gt;迁移的原则由此变得很明确：优先选择支持新框架且不扩大产品行为变化的最小版本，而不是把所有包机械地升到最新 major。&lt;/p&gt;
&lt;h2&gt;最核心的变化：Content Layer 身份模型&lt;a href=&quot;#最核心的变化content-layer-身份模型&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Astro 5 的旧内容配置位于 &lt;code&gt;src/content/config.ts&lt;/code&gt;，业务代码还在读取 &lt;code&gt;post.slug&lt;/code&gt; 并调用 &lt;code&gt;post.render()&lt;/code&gt;。
&lt;a href=&quot;https://docs.astro.build/en/guides/content-collections/&quot;&gt;Astro Content Collections 文档&lt;/a&gt;给出的新模型则要求显式 loader，
内容配置移到 &lt;code&gt;src/content.config.ts&lt;/code&gt;，Zod 从 &lt;code&gt;astro/zod&lt;/code&gt; 导入：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; defineCollection &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from&lt;/span&gt;&lt;span&gt; &apos;astro:content&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; glob &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from&lt;/span&gt;&lt;span&gt; &apos;astro/loaders&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; z &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from&lt;/span&gt;&lt;span&gt; &apos;astro/zod&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; blogCollection &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; defineCollection&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  loader&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; glob&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    pattern&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &apos;**/[^_]*.{md,mdx}&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    base&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &apos;./src/content/blog&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  schema&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // Other frontmatter fields...&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;真正需要保护的是“内部 ID”和“公开 slug”之间的边界：&lt;/p&gt;
&lt;pre&gt;flowchart LR
  F[Markdown 相对路径] --&amp;gt; I[Content entry ID]
  I --&amp;gt; L[语言识别]
  I --&amp;gt; S[派生公开 slug]
  O[frontmatter link] --&amp;gt; S
  S --&amp;gt; U[公开文章 URL]&lt;/pre&gt;
&lt;p&gt;例如 &lt;code&gt;en/tools/getting-started.md&lt;/code&gt; 的内容 ID 是 &lt;code&gt;en/tools/getting-started&lt;/code&gt;，但公开 URL 还要先移除 locale，
再考虑 &lt;code&gt;link&lt;/code&gt; override 和字符转写。项目里其他 DTO 也有名为 &lt;code&gt;slug&lt;/code&gt; 的字段，却表达公开路径；如果全仓替换
&lt;code&gt;slug&lt;/code&gt; 为 &lt;code&gt;id&lt;/code&gt;，搜索、相似文章和系列导航都会被破坏。&lt;/p&gt;
&lt;p&gt;所以迁移只替换 &lt;code&gt;CollectionEntry&amp;lt;&apos;blog&apos;&amp;gt;&lt;/code&gt; 的身份读取：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt; getPostLocale&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;post&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; BlogPost&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; string&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  return&lt;/span&gt;&lt;span&gt; getSlugLocaleInfo&lt;/span&gt;&lt;span&gt;(post&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;id)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;locale&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt; getPostSlug&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;post&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; BlogPost&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; string&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  return&lt;/span&gt;&lt;span&gt; post&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;link &lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;span&gt; transliterateSlug&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;getSlugLocaleInfo&lt;/span&gt;&lt;span&gt;(post&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;id)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;localeFreeSlug)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;路由也不再把整个 entry 当成旧式可渲染对象，而是传递内部 ID，再使用新的顶层 &lt;code&gt;render()&lt;/code&gt;：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; render &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from&lt;/span&gt;&lt;span&gt; &apos;astro:content&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; posts&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;map&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;post&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  params&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; slug&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; getPostSlug&lt;/span&gt;&lt;span&gt;(post) &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  props&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; postId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; post&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;id &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; post &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; await&lt;/span&gt;&lt;span&gt; getPostById&lt;/span&gt;&lt;span&gt;(postId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; locale)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;post) &lt;/span&gt;&lt;span&gt;throw&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; Error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`Post not found: &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;postId&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; Content &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; await&lt;/span&gt;&lt;span&gt; render&lt;/span&gt;&lt;span&gt;(post)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Astro 6 的 &lt;code&gt;body&lt;/code&gt; 类型允许为 &lt;code&gt;undefined&lt;/code&gt;，因此摘要和纯文本提取还需要显式兜底：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;extractTextFromMarkdown&lt;/span&gt;&lt;span&gt;(post&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;body &lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;span&gt; &apos;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; maxLength)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这不是为了掩盖缺失内容，而是因为集合还可能包含没有 Markdown body 的 entry；调用纯文本工具时应把该状态转换成空输入。&lt;/p&gt;
&lt;h3&gt;为什么旧文章里的 &lt;code&gt;slug&lt;/code&gt; 不能原样留下&lt;a href=&quot;#为什么旧文章里的-slug-不能原样留下&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;glob()&lt;/code&gt; loader 会用文件路径建立稳定的 entry ID，而旧内容里的顶层 &lt;code&gt;slug&lt;/code&gt; 又承载过自定义永久链接语义。继续让同一个字段
横跨两套身份模型，最危险的结果不是立刻报错，而是文章仍能生成、公开 URL 却变了。&lt;/p&gt;
&lt;p&gt;因此，新 schema 只把 &lt;code&gt;link&lt;/code&gt; 视为显式的公开 URL override。旧 &lt;code&gt;slug&lt;/code&gt; 不能简单删除，因为它可能是用户长期对外分享的地址；
也不能继续当成普通 frontmatter 原样保留。正确迁移必须先确定它过去代表的公开 URL，再把这层语义转移到 &lt;code&gt;link&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;历史文章不能靠用户手工迁移&lt;a href=&quot;#历史文章不能靠用户手工迁移&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;模板仓库里的示例文章很整齐，真实用户仓库却可能跨过多个版本：有些文章只有 &lt;code&gt;link&lt;/code&gt;，有些还保留 &lt;code&gt;slug&lt;/code&gt;，有些从未显式写过
永久链接，多语言对应文章也未必在同一时间创建。让用户做一次全局替换，既无法处理这些分支，也无法发现两篇文章即将撞到
同一个 URL。&lt;/p&gt;
&lt;p&gt;为此，Koharu CLI 增加了专门的迁移入口：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 只扫描并展示计划，不写文件&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; migrate&lt;/span&gt;&lt;span&gt; --dry-run&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 确认计划后，自动备份并执行&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; migrate&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;对从旧版 astro-koharu 升级的用户，实际入口仍然是更新前已经存在的旧 CLI。完整顺序是：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 先由旧 CLI 完成备份、拉取、合并和依赖安装&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; update&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 等上面的进程完全退出，再使用更新后的 CLI&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; migrate&lt;/span&gt;&lt;span&gt; --dry-run&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; migrate&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这个边界很重要：正在运行的 &lt;code&gt;update&lt;/code&gt; 进程加载的仍是升级前的代码，不能假设它已经拥有更新后才出现的
&lt;code&gt;migrate&lt;/code&gt; 子命令。等旧进程退出后重新调用 CLI，才能确保执行的是新版迁移逻辑。&lt;/p&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;URL 结果&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;只有 &lt;code&gt;link&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;link&lt;/code&gt; 和 &lt;code&gt;slug&lt;/code&gt;&lt;/td&gt;&lt;td&gt;保留 &lt;code&gt;link&lt;/code&gt;，移除冗余 &lt;code&gt;slug&lt;/code&gt;&lt;/td&gt;&lt;td&gt;继续以原 &lt;code&gt;link&lt;/code&gt; 为准&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;只有 &lt;code&gt;slug&lt;/code&gt;&lt;/td&gt;&lt;td&gt;原位把字段名改为 &lt;code&gt;link&lt;/code&gt;&lt;/td&gt;&lt;td&gt;精确保留旧 permalink&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;两者都没有&lt;/td&gt;&lt;td&gt;默认语言使用路径；非默认语言优先跟随默认语言链接，缺少默认语言对应文章时才复用其他译文的唯一 &lt;code&gt;link&lt;/code&gt;，否则使用路径&lt;/td&gt;&lt;td&gt;默认语言 URL 保持不变，译文尽量保持配对&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;同语言链接重复，或缺少默认语言对应文章且其他译文给出多个候选 &lt;code&gt;link&lt;/code&gt;&lt;/td&gt;&lt;td&gt;报错并阻止整批写入&lt;/td&gt;&lt;td&gt;不猜测、不产生半套 URL&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;这里有几个容易忽略的安全细节：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;扫描覆盖所有 &lt;code&gt;.md&lt;/code&gt; 与 &lt;code&gt;.mdx&lt;/code&gt;，不是只处理模板当前使用的目录层级；&lt;/li&gt;
&lt;li&gt;修改是针对顶层字段的局部编辑，不重新序列化整份 YAML，避免无意义地重排用户 frontmatter；&lt;/li&gt;
&lt;li&gt;任何解析错误、空链接或同语言 URL 冲突都会在写入前让整批迁移停止；&lt;/li&gt;
&lt;li&gt;博客内容只接受普通文件，遇到符号链接会直接阻止，避免跟随到内容目录外部；&lt;/li&gt;
&lt;li&gt;正式写入前会再次确认全部源文件、站点配置和文件集合与扫描时完全相同，避免用户并行编辑导致计划过期；&lt;/li&gt;
&lt;li&gt;单文件通过同目录临时文件和原子 rename 写入，保留原权限；后续写入失败时，已安装的变更会按逆序回滚；&lt;/li&gt;
&lt;li&gt;执行前自动创建基础备份；再次运行 dry-run 应得到 0 项变更，幂等性本身也是验收条件。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为了防止用户跳过这一步，&lt;code&gt;pnpm dev&lt;/code&gt; 和 &lt;code&gt;pnpm build&lt;/code&gt; 现在都会先运行 &lt;code&gt;pnpm koharu migrate --check&lt;/code&gt;。
这个模式只读扫描，不会自动改文章；发现待迁移项或无法安全处理的 frontmatter 时会以非零状态退出，
在 Astro 启动或构建前给出 dry-run 和正式迁移指引。&lt;/p&gt;
&lt;p&gt;多语言配对尤其不能只看文件名。假设默认语言文章已经把 &lt;code&gt;note/old-name&lt;/code&gt; 定制为 &lt;code&gt;my-stable-url&lt;/code&gt;，而英文对应文章没有
&lt;code&gt;link&lt;/code&gt;。如果英文文章机械地使用自身路径，它会与默认语言失去同一公开 slug。因此，非默认语言文章会优先跟随默认语言文章的
稳定链接；只有缺少默认语言对应文章时，才会复用其他译文的唯一候选，候选互相矛盾时宁可让用户决定。反过来，默认语言文章
没有显式链接时，路径本身就是已有的公开 URL，不能被译文的自定义链接覆盖，其他缺少链接的译文也应继续跟随这条路径。&lt;/p&gt;
&lt;p&gt;旧的 &lt;code&gt;pnpm save-slugs&lt;/code&gt; 仍保留为兼容入口，但新用户只需要记住 &lt;code&gt;pnpm koharu migrate&lt;/code&gt;。这样迁移规则、备份流程和 CLI
反馈位于同一个入口，后续再增加数据版本也不必继续堆一次性脚本。&lt;/p&gt;
&lt;h2&gt;恢复旧备份不能只是 &lt;code&gt;cp -r&lt;/code&gt;&lt;a href=&quot;#恢复旧备份不能只是-cp--r&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;内容字段迁完之后，还有一个更隐蔽的问题：旧恢复逻辑是把备份目录复制进新版本目录。如果新模板增加了一篇示例文章，而用户的
旧备份里没有它，普通目录合并会把这篇文章留下。对文件系统来说这是“合并成功”，对用户来说却是恢复后凭空多出了一篇文章。&lt;/p&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;code&gt;src/content/blog&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;public/img&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;src/pages/*.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;只替换根目录下的独立 Markdown 页面&lt;/td&gt;&lt;td&gt;删除旧自定义页面，同时保留新版 &lt;code&gt;.astro&lt;/code&gt; 路由&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;config/&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;summaries、similarities、LQIP&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;新备份 manifest 增加 &lt;code&gt;schemaVersion: 2&lt;/code&gt;，但缺少该字段的历史归档仍按 v1 读取。对“独立 Markdown 页面为空”的情况，
备份也会保留空目录标记，让恢复器能区分“用户当时确实没有独立页面”和“这类数据根本不在旧归档中”。前者应该清掉现有
Markdown 页面，后者则不应贸然删除任何东西。&lt;/p&gt;
&lt;p&gt;恢复前不只检查扩展名和 &lt;code&gt;manifest.json&lt;/code&gt;。CLI 会校验备份路径、manifest schema、声明的恢复项与归档实际内容，
拒绝符号链接、未声明条目和文件/目录类型不匹配。校验和解压使用同一份只读私有快照，避免原归档在两步之间被替换。
解压后也不会立即覆盖用户目录：恢复器会先在项目内准备候选快照、运行内容迁移，全部通过后再事务性切换；中途提交失败则回滚已切换的目标。&lt;/p&gt;
&lt;p&gt;只要恢复项包含博客内容，恢复器就会紧接着执行同一套内容迁移。升级流程若发现无法自动处理的冲突，会中止 clean update 并
进入原有回滚路径，而不是带着半迁移内容继续构建。基础备份恢复后，CLI 还会明确提示运行：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; generate&lt;/span&gt;&lt;span&gt; all&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这是因为基础备份只保护源数据与配置，不包含 AI 摘要、相似文章和 LQIP 等派生资产；完整备份才会携带与该内容快照配套的
生成结果。&lt;/p&gt;
&lt;h2&gt;四个只在真实构建里暴露的问题&lt;a href=&quot;#四个只在真实构建里暴露的问题&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;1. Markdown 插件配置开始弃用&lt;a href=&quot;#1-markdown-插件配置开始弃用&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;原配置把 &lt;code&gt;gfm&lt;/code&gt;、&lt;code&gt;remarkPlugins&lt;/code&gt; 和 &lt;code&gt;rehypePlugins&lt;/code&gt; 直接挂在 &lt;code&gt;markdown&lt;/code&gt; 下。Astro 6.4 会对此发出弃用提示。
项目的 Markdown 管线包含 Shoka 语法、链接嵌入、Mermaid、KaTeX 和代码块 transformer，不能简单删除，于是改为显式
创建 unified processor：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; unified &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from&lt;/span&gt;&lt;span&gt; &apos;@astrojs/markdown-remark&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;markdown&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  processor&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; unified&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    gfm&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    remarkPlugins&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    rehypePlugins&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  syntaxHighlight&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &apos;shiki&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    excludeLangs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&apos;mermaid&apos;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这样既消除了弃用路径，又保留 Astro 对 Shiki 4 的处理。&lt;/p&gt;
&lt;h3&gt;2. &lt;code&gt;react-tweet&lt;/code&gt; 在预渲染环境里无法加载 CSS&lt;a href=&quot;#2-react-tweet-在预渲染环境里无法加载-css&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;升级后的首次生产构建报错：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;Unknown file extension &quot;.css&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Hint: add the package to vite.resolve.noExternal&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;旧配置中的 &lt;code&gt;vite.ssr.noExternal&lt;/code&gt; 没有覆盖 Astro 6 的预渲染 environment。按照错误提示改成顶层
&lt;code&gt;vite.resolve.noExternal&lt;/code&gt; 后，&lt;code&gt;react-tweet&lt;/code&gt; 的 CSS 才重新进入 Vite 转换链：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;vite&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  resolve&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    noExternal&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&apos;react-tweet&apos;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;3. RSS 的旧 patch 版本不兼容 Zod 4&lt;a href=&quot;#3-rss-的旧-patch-版本不兼容-zod-4&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;@astrojs/rss&lt;/code&gt; 4.0.14 在 Astro 6 下抛出：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;z.function(...).returns is not a function&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;问题不是 RSS 数据，而是该版本仍调用 Zod 4 已移除的 API。升级到 4.0.19 后，默认、英文和日文三份 feed 都恢复生成。&lt;/p&gt;
&lt;h3&gt;4. i18n 配置描述了一个实际不存在的重定向&lt;a href=&quot;#4-i18n-配置描述了一个实际不存在的重定向&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;项目原来同时配置 &lt;code&gt;prefixDefaultLocale: false&lt;/code&gt; 和 &lt;code&gt;redirectToDefaultLocale: true&lt;/code&gt;。Astro 6 不再接受这个组合；更重要的是，
Astro 5 基线里 &lt;code&gt;/zh/&lt;/code&gt; 和 &lt;code&gt;/zh/post/*&lt;/code&gt; 本来就是 404，并没有真实重定向行为可以保留。&lt;/p&gt;
&lt;p&gt;最终删除无效选项，同时更新代码注释。规范 feed URL 仍是 &lt;code&gt;/rss.xml&lt;/code&gt;、&lt;code&gt;/en/rss.xml&lt;/code&gt; 和 &lt;code&gt;/ja/rss.xml&lt;/code&gt;；即使 preview
目前还能访问 &lt;code&gt;/rss.xml/&lt;/code&gt;，也不再把尾斜杠版本当作兼容契约。&lt;/p&gt;
&lt;h2&gt;怎样证明公开行为没有漂移&lt;a href=&quot;#怎样证明公开行为没有漂移&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;先验证模板公开行为&lt;a href=&quot;#先验证模板公开行为&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&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;Astro 5&lt;/th&gt;&lt;th&gt;Astro 6&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;130&lt;/td&gt;&lt;td&gt;130&lt;/td&gt;&lt;td&gt;一致&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pagefind 索引页面&lt;/td&gt;&lt;td&gt;134&lt;/td&gt;&lt;td&gt;134&lt;/td&gt;&lt;td&gt;一致&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;dist/&lt;/code&gt; 路由产物&lt;/td&gt;&lt;td&gt;141&lt;/td&gt;&lt;td&gt;141&lt;/td&gt;&lt;td&gt;无新增、无丢失&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Astro 构建耗时&lt;/td&gt;&lt;td&gt;21.62s&lt;/td&gt;&lt;td&gt;21.76s&lt;/td&gt;&lt;td&gt;接近基线&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;除了 &lt;code&gt;pnpm lint&lt;/code&gt;、&lt;code&gt;pnpm check&lt;/code&gt;、&lt;code&gt;pnpm build&lt;/code&gt; 和 &lt;code&gt;git diff --check&lt;/code&gt;，还做了这些输出级验证：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/&lt;/code&gt;、&lt;code&gt;/en/&lt;/code&gt;、&lt;code&gt;/ja/&lt;/code&gt;，以及默认语言和本地化文章均返回 200；&lt;code&gt;/zh/&lt;/code&gt; 保持 404；&lt;/li&gt;
&lt;li&gt;未翻译文章的英文 fallback 页面仍显示默认语言正文，canonical 指回默认语言 URL；&lt;/li&gt;
&lt;li&gt;代表性文章产物同时包含 Pagefind body、Shiki、KaTeX 和 Mermaid 标记；&lt;/li&gt;
&lt;li&gt;Pagefind 对 &lt;code&gt;Astro&lt;/code&gt; 的实际查询返回 8 条结果，首条仍是 &lt;code&gt;/post/getting-started/&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;三份 RSS 都返回 &lt;code&gt;text/xml&lt;/code&gt;，sitemap 和 robots 正常生成；&lt;/li&gt;
&lt;li&gt;pnpm 10.28.2 使用 frozen lockfile 的干净依赖层安装成功，Astro 补丁确认生效，宿主机生产构建成功；验证环境的
Docker daemon 不可用，因此没有把完整镜像构建写成已验证项。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;浏览器自动化环境当时没有可用的浏览器实例，因此没有把 ClientRouter 点击、搜索键盘操作写成“已自动化通过”。这里宁可明确
验证边界，也不要把 HTML 和 HTTP 检查冒充完整的浏览器交互测试。&lt;/p&gt;
&lt;p&gt;构建仍会出现 &lt;code&gt;infographic&lt;/code&gt; 语言回退、一个外部知乎链接 403 和大 chunk 提示；它们在 Astro 5 基线中已经存在，
不属于本次升级回归。&lt;/p&gt;
&lt;p&gt;当前分支加入本文及迁移配套内容后，最终 Astro 6 构建生成 151 个静态页面，Pagefind 索引 155 个页面；这个数字用于确认
最终交付状态能完整构建，不应拿来与加入新内容前的 130 / 134 基线直接比较。相似度资产覆盖全部 12 个默认语言条目，每项
保留 5 个引用，且没有指向不存在文章的悬空引用。&lt;/p&gt;
&lt;h3&gt;再验证迁移脚本，而不只验证 happy path&lt;a href=&quot;#再验证迁移脚本而不只验证-happy-path&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;模板当前有 21 篇 Markdown / MDX 内容。首次正式迁移处理了其中 2 篇没有 &lt;code&gt;link&lt;/code&gt; 的旧示例文章；随后再次执行
&lt;code&gt;pnpm koharu migrate --dry-run&lt;/code&gt;，结果是扫描 21 篇、待迁移 0 篇、错误 0 个。&lt;/p&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;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;混合 &lt;code&gt;link&lt;/code&gt; / &lt;code&gt;slug&lt;/code&gt; / 空字段及多语言对应文章&lt;/td&gt;&lt;td&gt;URL 保留，译文复用稳定链接，第二次运行无变更&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;重复链接、危险 frontmatter、符号链接和并发改动&lt;/td&gt;&lt;td&gt;整批不写入，已开始的原子写入可回滚&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;缺失或不一致的 manifest、恶意归档条目和恢复提交失败&lt;/td&gt;&lt;td&gt;预览前拒绝非法归档，事务提交失败时恢复旧目标&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;把旧归档恢复到已有新模板内容的目录&lt;/td&gt;&lt;td&gt;旧快照精确替换、恢复后自动迁移，同时保留新版 Astro 路由与配置&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;跨版本更新、新版 &lt;code&gt;--check&lt;/code&gt; 与 pnpm 版本锁定&lt;/td&gt;&lt;td&gt;命令行参数不串命令，依赖安装只使用明确的 pnpm 版本&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;这些分支由 Node 内置 test runner 执行，统一放在 &lt;code&gt;pnpm test:migrate&lt;/code&gt; 中；当前共 42 个测试。
它们验证的是数据不变式、归档边界和进程退出契约，而不是 CLI 文案，因此即使以后替换终端 UI，迁移的核心行为仍然有保护。&lt;/p&gt;
&lt;h3&gt;最后用真实下游仓库做完整恢复&lt;a href=&quot;#最后用真实下游仓库做完整恢复&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;只拿几篇 fixture 证明脚本可用仍然不够。实际验证选了一份从 astro-koharu v4.2.1 长期演进而来的个人仓库，在不修改源仓库的
前提下读取它的完整备份，并恢复到一个临时 Astro 6 副本：&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;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;历史 Markdown / MDX&lt;/td&gt;&lt;td&gt;376 篇&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;已有稳定 &lt;code&gt;link&lt;/code&gt;&lt;/td&gt;&lt;td&gt;375 篇&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;需要自动补齐&lt;/td&gt;&lt;td&gt;1 篇&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;同语言 URL 冲突&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;恢复后的内容数量&lt;/td&gt;&lt;td&gt;376 篇&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;astro check&lt;/code&gt;&lt;/td&gt;&lt;td&gt;0 error / warning / hint&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Astro 6 静态页面&lt;/td&gt;&lt;td&gt;797&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pagefind 索引页面&lt;/td&gt;&lt;td&gt;801&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;这个测试同时验证了两个容易漏掉的点。第一，临时副本中由新版模板自带、但不在旧快照里的示例文章没有残留，证明博客目录执行的
确实是快照替换，而不是目录合并。第二，恢复后只有 1 篇文章被自动补齐 &lt;code&gt;link&lt;/code&gt;，另外 375 篇的 metadata 和正文不需要重写。
迁移前后的源仓库 Git 状态保持干净，验证产物和临时归档也在结束后删除。&lt;/p&gt;
&lt;p&gt;历史内容构建仍出现少量 KaTeX Unicode、未知 Shiki 语言别名和外部链接抓取失败提示。这些 warning 来自旧文章本身，既没有
造成 Astro 6 类型诊断，也没有阻止 797 个页面完成生产构建，因此应该记录和后续治理，但不能误判成数据迁移失败。&lt;/p&gt;
&lt;h2&gt;哪些 Astro 6 能力值得顺手开启&lt;a href=&quot;#哪些-astro-6-能力值得顺手开启&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;答案比预想中保守：只接受 Astro 6 默认带来的新 dev/build pipeline。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fonts API&lt;/strong&gt;：稳定且值得单独研究，但项目已有约 20 MB 中日文字体分片、按 locale 加载和阅读器字体设置，不是零成本替换；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CSP&lt;/strong&gt;：当前与 ClientRouter、Shiki 以及多种 inline/第三方资源冲突，本轮不启用；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Live Content Collections / route caching&lt;/strong&gt;：面向按需渲染，与 static + nginx 架构不匹配；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sonda&lt;/strong&gt;：继续保留 &lt;code&gt;ANALYZE=true pnpm build&lt;/code&gt; 的按需模式，不增加日常构建成本。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rust compiler 和 queued rendering 看似只需要一行配置，所以额外做了同机单次构建实验。它不是严格性能测试，但足以决定
是否值得把实验配置留在主干：&lt;/p&gt;

































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;模式&lt;/th&gt;&lt;th&gt;real time&lt;/th&gt;&lt;th&gt;Astro time&lt;/th&gt;&lt;th&gt;最大 RSS&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;25.29s&lt;/td&gt;&lt;td&gt;22.89s&lt;/td&gt;&lt;td&gt;2.30 GB&lt;/td&gt;&lt;td&gt;基线&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;queued rendering&lt;/td&gt;&lt;td&gt;26.60s&lt;/td&gt;&lt;td&gt;24.48s&lt;/td&gt;&lt;td&gt;2.36 GB&lt;/td&gt;&lt;td&gt;约慢 5.2%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Rust compiler 0.3.1&lt;/td&gt;&lt;td&gt;26.24s&lt;/td&gt;&lt;td&gt;23.66s&lt;/td&gt;&lt;td&gt;2.47 GB&lt;/td&gt;&lt;td&gt;约慢 3.8%&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;两项实验在这套内容和机器上都没有收益，相关配置与 &lt;code&gt;@astrojs/compiler-rs&lt;/code&gt; 依赖随后全部移除。&lt;/p&gt;
&lt;h2&gt;一份可复用的迁移顺序&lt;a href=&quot;#一份可复用的迁移顺序&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;如果你的 Astro 项目也有复杂内容层，可以按下面的顺序降低排障噪声：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;固定迁移前 Node、check、build、路由和代表性 HTML 基线；&lt;/li&gt;
&lt;li&gt;显式锁定目标 major，不使用会跨 major 的 &lt;code&gt;latest&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;先升级 Astro 和官方 integrations，记录第一批真实错误；&lt;/li&gt;
&lt;li&gt;单独迁移 &lt;code&gt;content.config.ts&lt;/code&gt;、loader、&lt;code&gt;entry.id&lt;/code&gt; 和 &lt;code&gt;render(entry)&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;区分内部内容 ID、公开 slug 与 frontmatter override，避免机械替换；&lt;/li&gt;
&lt;li&gt;先对下游历史文章 dry-run，发现冲突时整批停止，不让用户手工批量改 frontmatter；&lt;/li&gt;
&lt;li&gt;把正式迁移放在自动备份之后，并用第二次 dry-run 证明它是幂等的；&lt;/li&gt;
&lt;li&gt;明确旧备份中哪些目录是快照替换、哪些配置需要向前合并，恢复内容后自动执行同一迁移；&lt;/li&gt;
&lt;li&gt;逐个验证 Markdown、搜索、RSS、sitemap 和第三方 integrations；&lt;/li&gt;
&lt;li&gt;比较路由集合，再检查 fallback canonical 和生成 HTML；&lt;/li&gt;
&lt;li&gt;用至少一份真实下游备份做临时恢复、check 和生产构建；&lt;/li&gt;
&lt;li&gt;最后才评估实验能力，并保证实验依赖不进入生产 lockfile。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;astro-koharu 用户从旧版升级时，先运行 &lt;code&gt;pnpm koharu update&lt;/code&gt; 并等进程完全退出，再用
&lt;code&gt;pnpm koharu migrate --dry-run&lt;/code&gt; 查看计划，最后运行 &lt;code&gt;pnpm koharu migrate&lt;/code&gt; 自动备份并执行。已有 &lt;code&gt;link&lt;/code&gt; 会保留，
旧 &lt;code&gt;slug&lt;/code&gt; 会转换为 &lt;code&gt;link&lt;/code&gt;，旧备份通过 Koharu CLI 恢复后也会自动执行同一迁移。如果忘记手动迁移，
&lt;code&gt;pnpm dev&lt;/code&gt; 和 &lt;code&gt;pnpm build&lt;/code&gt; 的只读检查会阻止旧内容进入 Astro 6 管线，但不会替用户改写文章。&lt;/p&gt;
&lt;h2&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这次迁移最后没有留下兼容 flag，也没有改变静态部署架构。最大的收获不是版本号从 5 变成 6，而是把内容身份和数据升级的
边界写清楚：&lt;code&gt;entry.id&lt;/code&gt; 负责内部查找，公开 slug 负责 URL，&lt;code&gt;link&lt;/code&gt; 只覆盖后者；备份中的文章和图片是用户快照，配置则需要在
恢复用户值的同时接住新版本能力。这个模型一旦明确，多语言 fallback、搜索、RSS 和旧备份恢复就有了共同依据。&lt;/p&gt;
&lt;p&gt;major upgrade 最可靠的完成标准也不是“模板构建成功”，而是能回答三个问题：哪些行为必须保持、历史数据如何安全过桥、
哪些结论有可重复的证据。版本升级只是代码改动；当一份真实的 376 篇文章备份也能无损恢复并完成生产构建，这次迁移才真正
覆盖到了用户。&lt;/p&gt;</content:encoded><category>category:笔记</category><category>category:前端</category><category>tag:Astro</category><category>tag:迁移</category><category>tag:Content Collections</category><category>tag:Vite</category><category>tag:Shiki</category><category>tag:前端工程</category></item><item><title>容器查询实战：让卡片自己决定布局</title><link>https://www.fon1173.top/ko/post/container-queries</link><guid isPermaLink="false">ko:container-queries</guid><description>同一张文章卡片放在主栏和侧栏里，应该长得不一样。用容器查询代替媒体查询，让组件根据自己的宽度切换布局，并记录几个容易踩的坑。</description><pubDate>Mon, 08 Jun 2026 14:15:00 GMT</pubDate><content:encoded>&lt;p&gt;做博客首页时遇到一个很常见的问题：同一张文章卡片，放在主栏里宽，放在侧栏里窄。用媒体查询只能根据视口宽度判断，可卡片关心的其实是「我自己有多宽」。&lt;/p&gt;
&lt;p&gt;容器查询（container queries）解决的正是这个问题。这篇记录我把一张卡片从媒体查询改成容器查询的过程。&lt;/p&gt;
&lt;h2&gt;问题：视口宽度不等于组件宽度&lt;a href=&quot;#问题视口宽度不等于组件宽度&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;媒体查询的写法&lt;a href=&quot;#媒体查询的写法&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;最初的卡片是这样写的：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;card.css&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;@media&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;min-width&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 768&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  .&lt;/span&gt;&lt;span&gt;post-card&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    display&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; grid&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    grid-template-columns&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 200&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;fr&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;在主栏里没问题。但把同一张卡片放进 280px 宽的侧栏后，只要视口超过 768px，它依然会切成左右两栏，封面被挤成一条。&lt;/p&gt;
&lt;h3&gt;为什么不给侧栏单独写一套&lt;a href=&quot;#为什么不给侧栏单独写一套&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;最直接的办法是加一个修饰类，比如 &lt;code&gt;.post-card--compact&lt;/code&gt;。这能用，但意味着每个使用卡片的地方都要知道卡片的内部布局。放进新的位置，就得再加一个变体。组件应该自己处理这件事。&lt;/p&gt;
&lt;h2&gt;基本用法&lt;a href=&quot;#基本用法&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;声明容器&lt;a href=&quot;#声明容器&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;先在卡片的&lt;strong&gt;父元素&lt;/strong&gt;上声明它是一个容器：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;card.css&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;post-card-wrapper&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  container-type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; inline-size&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  container-name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; card&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;也可以用简写：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;post-card-wrapper&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  container&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; card / inline-size&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;container-type 的取值&lt;a href=&quot;#container-type-的取值&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&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;inline-size&lt;/code&gt;&lt;/td&gt;&lt;td&gt;只按行内方向（横排文字时就是宽度）查询，最常用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;size&lt;/code&gt;&lt;/td&gt;&lt;td&gt;同时按宽高查询，要求元素有确定的高度&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;normal&lt;/code&gt;&lt;/td&gt;&lt;td&gt;默认值，不作为尺寸容器&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
&lt;p&gt;&lt;code&gt;container-type: size&lt;/code&gt; 会让元素的高度不再由内容撑开，大多数情况下你需要的是 &lt;code&gt;inline-size&lt;/code&gt;。&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;编写查询&lt;a href=&quot;#编写查询&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;然后把原来的媒体查询换成容器查询：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;card.css&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;@container&lt;/span&gt;&lt;span&gt; card (min-width: 480px) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  .&lt;/span&gt;&lt;span&gt;post-card&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    display&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; grid&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    grid-template-columns&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 200&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;fr&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;现在卡片只看包裹它的容器有多宽，和视口无关。&lt;/p&gt;
&lt;h2&gt;容器查询单位&lt;a href=&quot;#容器查询单位&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;cqi 与 cqw&lt;a href=&quot;#cqi-与-cqw&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;容器查询还带来了一组相对单位，其中最实用的是 &lt;code&gt;cqi&lt;/code&gt;：容器行内尺寸的 1%。&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;card.css&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;post-card&lt;/span&gt;&lt;span&gt; h3&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  font-size&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; clamp&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;rem&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; 4&lt;/span&gt;&lt;span&gt;cqi&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; 1.5&lt;/span&gt;&lt;span&gt;rem&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;标题字号会随卡片宽度平滑变化，而不是在断点处突然跳一下。&lt;/p&gt;
&lt;h4&gt;什么时候用 cqw&lt;a href=&quot;#什么时候用-cqw&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;cqw&lt;/code&gt; 指容器宽度的 1%，在横排文字下和 &lt;code&gt;cqi&lt;/code&gt; 等价。我习惯统一用 &lt;code&gt;cqi&lt;/code&gt;，这样以后支持竖排时不用改。&lt;/p&gt;
&lt;h3&gt;没有容器时会怎样&lt;a href=&quot;#没有容器时会怎样&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;如果元素的祖先里没有任何容器，这些单位会退回到相对视口计算，不会报错，但效果可能不是你想要的。&lt;/p&gt;
&lt;h2&gt;在 Tailwind 里使用&lt;a href=&quot;#在-tailwind-里使用&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Tailwind CSS v4 内置了容器查询，不需要插件：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;PostCard.astro&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;@container&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;lt;&lt;/span&gt;&lt;span&gt;article&lt;/span&gt;&lt;span&gt; class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;flex flex-col gap-4 @md:flex-row&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;img&lt;/span&gt;&lt;span&gt; class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;aspect-video w-full rounded-lg object-cover @md:w-48&quot;&lt;/span&gt;&lt;span&gt; src&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;/img/cover/12.webp&quot;&lt;/span&gt;&lt;span&gt; alt&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;span&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;lt;/&lt;/span&gt;&lt;span&gt;article&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;@container&lt;/code&gt; 声明容器，&lt;code&gt;@md:&lt;/code&gt; 这类前缀表示「容器宽度达到这个断点时」。命名容器写成 &lt;code&gt;@container/card&lt;/code&gt;，查询时写 &lt;code&gt;@md/card:flex-row&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;踩过的坑&lt;a href=&quot;#踩过的坑&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;容器不能查询自己&lt;a href=&quot;#容器不能查询自己&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;@container&lt;/code&gt; 里的规则只能作用于容器的&lt;strong&gt;后代&lt;/strong&gt;。我一开始把 &lt;code&gt;container-type&lt;/code&gt; 和网格布局写在同一个元素上，结果怎么也不生效。解决方法就是多包一层。&lt;/p&gt;
&lt;h3&gt;和 overflow 的配合&lt;a href=&quot;#和-overflow-的配合&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;声明为 &lt;code&gt;inline-size&lt;/code&gt; 容器的元素会建立尺寸约束（size containment）。如果它的宽度原本依赖子元素撑开，比如在 &lt;code&gt;inline-block&lt;/code&gt; 或 flex 子项里，宽度可能会塌成 0。给容器一个明确的宽度，或者让它在块级上下文里自然填满。&lt;/p&gt;
&lt;h3&gt;调试&lt;a href=&quot;#调试&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Chrome 开发者工具的 Elements 面板会在容器元素旁标出 &lt;code&gt;container&lt;/code&gt; 徽标，点一下可以高亮这个容器。排查不生效的问题时，先确认这里有没有标记。&lt;/p&gt;
&lt;h2&gt;小结&lt;a href=&quot;#小结&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;容器查询把「布局随空间变化」这件事交还给了组件本身。改完之后，卡片放到哪里都不用额外写变体。&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
原生 CSS
Tailwind v4
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;wrapper&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; container&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; card / inline-size&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;@container&lt;/span&gt;&lt;span&gt; card (min-width: 480px) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  .&lt;/span&gt;&lt;span&gt;post-card&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; display&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; grid&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; grid-template-columns&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 200&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;fr&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;@container&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;lt;&lt;/span&gt;&lt;span&gt;article&lt;/span&gt;&lt;span&gt; class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;flex flex-col @md:flex-row&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;article&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;更完整的说明可以看 &lt;a href=&quot;https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_containment/Container_size_and_style_queries&quot;&gt;MDN 的容器查询指南&lt;/a&gt;。&lt;/p&gt;</content:encoded><category>category:笔记</category><category>category:前端</category><category>category:CSS</category><category>tag:CSS</category><category>tag:容器查询</category><category>tag:响应式</category><category>tag:Tailwind</category></item><item><title>一篇 Markdown 在构建时经过了什么</title><link>https://www.fon1173.top/ko/post/markdown-pipeline</link><guid isPermaLink="false">ko:markdown-pipeline</guid><description>从 frontmatter 校验到 remark、rehype 插件，再到 Shiki 高亮和加密，用几张 Mermaid 图把 astro-koharu 处理一篇文章的顺序画清楚。</description><pubDate>Mon, 11 May 2026 12:05:00 GMT</pubDate><content:encoded>&lt;p&gt;写主题文档时经常被问到：「为什么这个语法在加密块里也能用？」「链接卡片的数据是什么时候抓的？」答案都藏在构建顺序里。这篇用几张图把一篇 Markdown 文章从源文件到 HTML 的路径画出来。&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;本文由 AI 根据 &lt;code&gt;astro.config.mjs&lt;/code&gt; 的插件注册顺序起草，我核对过顺序并删改了措辞。插件的增减以仓库当前代码为准。&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;总览&lt;a href=&quot;#总览&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;pre&gt;flowchart TD
    A[Markdown 源文件] --&amp;gt; B[frontmatter 校验&amp;lt;br/&amp;gt;content.config.ts]
    B --&amp;gt; C[remark 阶段&amp;lt;br/&amp;gt;处理 Markdown 语法树]
    C --&amp;gt; D[rehype 阶段&amp;lt;br/&amp;gt;处理 HTML 语法树]
    D --&amp;gt; E[Shiki 代码高亮]
    E --&amp;gt; F[页面模板渲染]
    F --&amp;gt; G[Pagefind 建立搜索索引]&lt;/pre&gt;
&lt;p&gt;frontmatter 先经过 Zod schema 校验。字段写错类型（比如把 &lt;code&gt;tags&lt;/code&gt; 写成字符串）会在这一步直接报错，而不是渲染出奇怪的页面。&lt;/p&gt;
&lt;h2&gt;remark 阶段&lt;a href=&quot;#remark-阶段&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;remark 处理的是 Markdown 语法树（mdast），这里的顺序有讲究：&lt;/p&gt;
&lt;pre&gt;flowchart LR
    P[Shoka 预处理] --&amp;gt; M[数学公式]
    M --&amp;gt; S[隐藏文字]
    S --&amp;gt; R[注音 Ruby]
    R --&amp;gt; E[下划线与高亮]
    E --&amp;gt; D[加密块指令]
    D --&amp;gt; L[链接卡片]&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Shoka 预处理必须第一个跑&lt;/strong&gt;。它会重新解析原始文本，修正 GFM 和 Shoka 语法之间的冲突。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数学公式要在注音、隐藏文字之前&lt;/strong&gt;，否则 &lt;code&gt;$a^b$&lt;/code&gt; 里的 &lt;code&gt;^&lt;/code&gt; 可能被当成注音语法。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接卡片在最后&lt;/strong&gt;，这时段落结构已经稳定，只需要找出「单独成段的链接」。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;链接卡片的数据从哪来&lt;a href=&quot;#链接卡片的数据从哪来&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;sequenceDiagram
    participant B as 构建进程
    participant C as .cache/og-data.json
    participant W as 目标网站
    B-&amp;gt;&amp;gt;C: 查询 URL
    alt 缓存有效
        C--&amp;gt;&amp;gt;B: 返回标题、描述、图片
    else 缓存缺失或过期
        B-&amp;gt;&amp;gt;W: 请求页面并解析 Open Graph
        W--&amp;gt;&amp;gt;B: OG 信息或错误
        B-&amp;gt;&amp;gt;C: 写回缓存
    end
    B-&amp;gt;&amp;gt;B: 渲染卡片，失败则保留普通链接&lt;/pre&gt;
&lt;p&gt;成功的结果默认缓存 30 天（&lt;code&gt;content.previewCacheTime&lt;/code&gt;），失败的结果只缓存一天，方便下次构建重试。这个缓存文件是特意提交到 Git 的，CI 上构建时就不必重新抓取。&lt;/p&gt;
&lt;h2&gt;rehype 阶段&lt;a href=&quot;#rehype-阶段&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;rehype 处理 HTML 语法树（hast）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;给标题生成 &lt;code&gt;id&lt;/code&gt;，并附上锚点链接&lt;/li&gt;
&lt;li&gt;处理 Shoka 的花括号属性语法（给元素追加 class）&lt;/li&gt;
&lt;li&gt;给图片加上低质量占位图（LQIP）&lt;/li&gt;
&lt;li&gt;用 KaTeX 渲染公式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最后&lt;/strong&gt;才是加密：整篇加密和 &lt;code&gt;:::encrypted&lt;/code&gt; 块&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;加密放在最后，是因为它要加密的是已经完全渲染好的 HTML。这也回答了开头的问题：加密块里的代码高亮、公式、链接，在加密之前就已经处理完了。&lt;/p&gt;
&lt;h2&gt;代码块&lt;a href=&quot;#代码块&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;代码块由 Shiki 在构建时高亮，所以页面上不需要加载任何高亮脚本。&lt;code&gt;title&lt;/code&gt;、&lt;code&gt;mark&lt;/code&gt;、&lt;code&gt;command&lt;/code&gt; 这些元信息由一个 Shiki transformer 解析：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;example.js&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; site &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;astro-koharu&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`Hello from &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Mermaid 代码块被排除在 Shiki 之外，交给 Mermaid 单独渲染，本文的几张图就是这样来的。&lt;/p&gt;
&lt;h2&gt;小结&lt;a href=&quot;#小结&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;pre&gt;pie title 一篇文章的处理阶段（按插件数量粗略划分）
    &quot;remark&quot; : 9
    &quot;rehype&quot; : 7
    &quot;Shiki transformer&quot; : 2&lt;/pre&gt;
&lt;p&gt;记住两条就够用：remark 管语法，rehype 管结构；加密永远在最后。&lt;/p&gt;</content:encoded><category>category:笔记</category><category>category:前端</category><category>tag:Astro</category><category>tag:Markdown</category><category>tag:Mermaid</category><category>tag:构建</category></item><item><title>下雨的周六下午</title><link>https://www.fon1173.top/ko/post/rainy-afternoon</link><guid isPermaLink="false">ko:rainy-afternoon</guid><description>本来打算出门，下午两点开始下雨，就没去成。
泡了一壶茶，把阳台的椅子挪到窗边，翻完了一本搁了很久的短篇集。书不厚，十来个故事，每篇讲的都是很小的事：一个人搬家，一个人等车，一个人在超市里找不到想买的东西。读的时候没什么感觉，合上书以后，反而想起好几个细节。</description><pubDate>Sat, 18 Apr 2026 09:40:00 GMT</pubDate><content:encoded>&lt;p&gt;本来打算出门，下午两点开始下雨，就没去成。&lt;/p&gt;
&lt;p&gt;泡了一壶茶，把阳台的椅子挪到窗边，翻完了一本搁了很久的短篇集。书不厚，十来个故事，每篇讲的都是很小的事：一个人搬家，一个人等车，一个人在超市里找不到想买的东西。读的时候没什么感觉，合上书以后，反而想起好几个细节。&lt;/p&gt;
&lt;p&gt;雨一直没停。楼下有人撑着伞遛狗，狗不太情愿，走两步就停下来甩毛。&lt;/p&gt;
&lt;p&gt;傍晚收拾桌子，发现草稿箱里还有三篇没写完的文章。挑了一篇改到能发的程度，剩下两篇先放着。&lt;/p&gt;
&lt;p&gt;今天就这样，挺好的。&lt;/p&gt;</content:encoded><category>category:随笔</category><category>tag:随笔</category><category>tag:生活</category></item><item><title>自定义关键词示例</title><link>https://www.fon1173.top/ko/post/custom-keywords</link><guid isPermaLink="false">ko:custom-keywords</guid><description>展示如何设置文章关键词。</description><pubDate>Sun, 05 Apr 2026 10:43:11 GMT</pubDate><content:encoded>&lt;p&gt;本文展示如何设置文章关键词。&lt;/p&gt;
&lt;h2&gt;frontmatter 关键词设置&lt;a href=&quot;#frontmatter-关键词设置&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在文章的 frontmatter 中添加 keywords 字段即可设置关键词：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 我的文章&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 2026-01-01&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;keywords&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; 示例关键词一&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; 示例关键词二&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这是篇带有关键词的文章。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后生成的页面会包含以下 meta 标签：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;keywords&quot;&lt;/span&gt;&lt;span&gt; content&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;示例关键词一, 示例关键词二, ... site.keywords&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded><category>category:笔记</category><category>tag:教程</category></item><item><title>🔒 加密文章演示</title><link>https://www.fon1173.top/ko/post/note/encrypted-post-demo</link><guid isPermaLink="false">ko:note/encrypted-post-demo</guid><description>이 게시물은 암호화되어 있으니, 웹 페이지에서 확인해 주세요</description><pubDate>Mon, 16 Feb 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;이 게시물은 암호화되어 있으니, 웹 페이지에서 확인해 주세요&lt;/p&gt;</content:encoded><category>category:笔记</category><category>tag:加密</category><category>tag:测试</category></item><item><title>Shoka 主题 Markdown 语法演示</title><link>https://www.fon1173.top/ko/post/note/shoka-features</link><guid isPermaLink="false">ko:note/shoka-features</guid><description>展示所有 Shoka 主题兼容的特殊 Markdown 语法</description><pubDate>Sat, 07 Feb 2026 04:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本文展示了从 Hexo Shoka 主题迁移的所有特殊 Markdown 语法。&lt;/p&gt;
&lt;h2&gt;文字特效&lt;a href=&quot;#文字特效&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;下划线 (ins)&lt;a href=&quot;#下划线-ins&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;++这是下划线文字++&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;++波浪下划线++{.wavy}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;++着重点标记++{.dot}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这是下划线文字&lt;/p&gt;
&lt;p&gt;波浪下划线&lt;/p&gt;
&lt;p&gt;着重点标记&lt;/p&gt;
&lt;h3&gt;下划线颜色&lt;a href=&quot;#下划线颜色&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;++主色调++{.primary} ++成功++{.success} ++警告++{.warning} ++危险++{.danger} ++信息++{.info}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;主色调 成功 警告 危险 信息&lt;/p&gt;
&lt;h3&gt;高亮 (mark)&lt;a href=&quot;#高亮-mark&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;==这是高亮文字==&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;mark&gt;这是高亮文字&lt;/mark&gt;&lt;/p&gt;
&lt;h3&gt;上下标&lt;a href=&quot;#上下标&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;H~2~O 是水的化学式&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;E = mc^2^ 是质能方程&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;H&lt;sub&gt;2&lt;/sub&gt;O 是水的化学式&lt;/p&gt;
&lt;p&gt;E = mc&lt;sup&gt;2&lt;/sup&gt; 是质能方程&lt;/p&gt;
&lt;h3&gt;颜色文字&lt;a href=&quot;#颜色文字&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;红色&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.red} &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;粉色&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.pink} &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;橙色&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.orange} &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;黄色&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.yellow} &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;绿色&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.green} &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;水色&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.aqua} &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;蓝色&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.blue} &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;紫色&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.purple} &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;灰色&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.grey}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span&gt;红色&lt;/span&gt; &lt;span&gt;粉色&lt;/span&gt; &lt;span&gt;橙色&lt;/span&gt; &lt;span&gt;黄色&lt;/span&gt; &lt;span&gt;绿色&lt;/span&gt; &lt;span&gt;水色&lt;/span&gt; &lt;span&gt;蓝色&lt;/span&gt; &lt;span&gt;紫色&lt;/span&gt; &lt;span&gt;灰色&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;彩虹文字&lt;a href=&quot;#彩虹文字&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;这段文字会有彩虹渐变效果&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.rainbow}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span&gt;这段文字会有彩虹渐变效果&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;键盘键&lt;a href=&quot;#键盘键&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;Ctrl&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.kbd} + &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;C&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.kbd} 复制，&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;Ctrl&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.kbd} + &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;V&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.kbd} 粘贴&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span&gt;Ctrl&lt;/span&gt; + &lt;span&gt;C&lt;/span&gt; 复制，&lt;span&gt;Ctrl&lt;/span&gt; + &lt;span&gt;V&lt;/span&gt; 粘贴&lt;/p&gt;
&lt;h2&gt;隐藏文字 (Spoiler)&lt;a href=&quot;#隐藏文字-spoiler&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;这里有一段!!隐藏文字，鼠标点击显示!!&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这里有一段!!模糊文字，鼠标悬停显示!!{.blur}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这里有一段隐藏文字，鼠标点击显示&lt;/p&gt;
&lt;p&gt;这里有一段&lt;span&gt;模糊文字，鼠标悬停显示&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;标签块 (Labels)&lt;a href=&quot;#标签块-labels&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;默认&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.label .default} &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;主要&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.label .primary} &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;信息&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.label .info} &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;成功&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.label .success} &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;警告&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.label .warning} &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;危险&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.label .danger}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span&gt;默认&lt;/span&gt; &lt;span&gt;主要&lt;/span&gt; &lt;span&gt;信息&lt;/span&gt; &lt;span&gt;成功&lt;/span&gt; &lt;span&gt;警告&lt;/span&gt; &lt;span&gt;危险&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;提醒块 (Note Blocks)&lt;a href=&quot;#提醒块-note-blocks&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;:::default&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这是默认提醒块&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::primary&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这是主要提醒块，用于重要提示&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::info&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这是信息提醒块，用于提供额外信息&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::success&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这是成功提醒块，用于正面反馈&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::warning&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这是警告提醒块，请注意&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::danger&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这是危险提醒块，务必谨慎&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::info no-icon&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这是没有图标的信息块&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;这是默认提醒块&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;这是主要提醒块，用于重要提示&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;这是信息提醒块，用于提供额外信息&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;这是成功提醒块，用于正面反馈&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;这是警告提醒块，请注意&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;这是危险提醒块，务必谨慎&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;这是没有图标的信息块&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;折叠块 (Collapse)&lt;a href=&quot;#折叠块-collapse&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;+++primary 点击展开详细内容&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这里是折叠的内容，点击标题可以展开或收起。&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;支持 &lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;span&gt;Markdown&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;span&gt; 格式化。&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; 列表项 1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; 列表项 2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;+++&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;+++warning 注意事项&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这里列出一些需要注意的问题：&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;1.&lt;/span&gt;&lt;span&gt; 注意事项一&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;2.&lt;/span&gt;&lt;span&gt; 注意事项二&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;+++&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;+++danger 危险操作&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;请确保你知道自己在做什么！&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;span&gt;bash&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; -rf&lt;/span&gt;&lt;span&gt; /&lt;/span&gt;&lt;span&gt;  # 请勿执行此命令&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;+++&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

点击展开详细内容
&lt;div&gt;
&lt;p&gt;这里是折叠的内容，点击标题可以展开或收起。&lt;/p&gt;
&lt;p&gt;支持 &lt;strong&gt;Markdown&lt;/strong&gt; 格式化。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;列表项 1&lt;/li&gt;
&lt;li&gt;列表项 2&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;


注意事项
&lt;div&gt;
&lt;p&gt;这里列出一些需要注意的问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;注意事项一&lt;/li&gt;
&lt;li&gt;注意事项二&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;


危险操作
&lt;div&gt;
&lt;p&gt;请确保你知道自己在做什么！&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; -rf&lt;/span&gt;&lt;span&gt; /&lt;/span&gt;&lt;span&gt;  # 请勿执行此命令&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2&gt;标签卡 (Tabs)&lt;a href=&quot;#标签卡-tabs&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;;;;tab1 JavaScript&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;span&gt;js&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Hello, World!&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;;;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;;;;tab1 Python&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;span&gt;python&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Hello, World!&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;;;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;;;;tab1 Rust&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;span&gt;rust&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn main() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!(&quot;Hello, World!&quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;;;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
JavaScript
Python
Rust
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Hello, World!&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Hello, World!&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Hello, World!&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;注音&lt;a href=&quot;#注音&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{取り返す^とりかえす}是日语中&quot;取回&quot;的意思。&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{漢字^かんじ}的注音示例。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;ruby&gt;取り返す&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;とりかえす&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt;是日语中&quot;取回&quot;的意思。&lt;/p&gt;
&lt;p&gt;&lt;ruby&gt;漢字&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;かんじ&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt;的注音示例。&lt;/p&gt;
&lt;h2&gt;代码块增强&lt;a href=&quot;#代码块增强&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;span&gt;js title=&quot;hello.js&quot; url=&quot;https://example.com&quot; linkText=&quot;查看源码&quot; mark:1,3&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; greeting &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;Hello&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; name &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;World&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;greeting&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;!`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;span&gt;bash command:(&quot;$&quot;:1-3)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; astro&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; dev&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; build&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;hello.js&lt;/span&gt;&lt;span&gt;查看源码&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; greeting &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;Hello&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; name &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;World&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;greeting&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;!`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; astro&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; dev&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; build&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;数学公式&lt;a href=&quot;#数学公式&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;行内公式：$E = mc^2$&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;块级公式：&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$$&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$$&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$$&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;\sum_{n=1}^{\infty} \frac{1}{n^2} = \frac{\pi^2}{6}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$$&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;行内公式：&lt;span&gt;&lt;span&gt;E=mc2E = mc^2&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;E&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;块级公式：&lt;/p&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;∫−∞∞e−x2dx=π\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;∫&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;∞&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;∞&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;π&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;∑n=1∞1n2=π26\sum_{n=1}^{\infty} \frac{1}{n^2} = \frac{\pi^2}{6}&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;∑&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;∞&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;π&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;h2&gt;友链卡&lt;a href=&quot;#友链卡&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{% links %}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; site: 余弦の博客&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  url: https://blog.cosine.ren&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  owner: cos&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  desc: FE / ACG / 手工&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  image: https://blog.cosine.ren/img/avatar.webp&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  color: &apos;#ed788b&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; site: 示例博客&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  url: https://example.com&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  owner: Alice&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  desc: 一个热爱技术的博客&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  image: https://api.dicebear.com/7.x/avataaars/svg?seed=Alice&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  color: &apos;#BEDCFF&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{% endlinks %}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;https://blog.cosine.ren&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.cosine.ren/img/avatar.webp&quot; alt=&quot;余弦の博客&quot; loading=&quot;lazy&quot; /&gt;&lt;div&gt;&lt;div&gt;余弦の博客&lt;/div&gt;&lt;div&gt;FE / ACG / 手工&lt;/div&gt;&lt;/div&gt;&lt;/a&gt;
&lt;a href=&quot;https://example.com&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://api.dicebear.com/7.x/avataaars/svg?seed=Alice&quot; alt=&quot;示例博客&quot; loading=&quot;lazy&quot; /&gt;&lt;div&gt;&lt;div&gt;示例博客&lt;/div&gt;&lt;div&gt;一个热爱技术的博客&lt;/div&gt;&lt;/div&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;h2&gt;多媒体&lt;a href=&quot;#多媒体&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;音频&lt;a href=&quot;#音频&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{% media audio %}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; name: 示例音频&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  url: https://music.163.com/#/song?id=3339210292&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{% endmedia %}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;h3&gt;音频歌单&lt;a href=&quot;#音频歌单&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{% media audio %}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; title: 诗岸歌单 山山～全是山山～&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  list:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    -&lt;/span&gt;&lt;span&gt; https://music.163.com/#/playlist?id=8676645748&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; title: 『诗岸』全是山山！&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  list:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    -&lt;/span&gt;&lt;span&gt; https://music.163.com/#/playlist?id=17606384886&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{% endmedia %}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;h3&gt;视频&lt;a href=&quot;#视频&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{% media video %}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; name: &quot;测试 1&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  url: https://cdn.kastatic.org/ka-youtube-converted/O_nY1TM2RZM.mp4/O_nY1TM2RZM.mp4#t=0&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; name: &quot;测试 2&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  url: https://cdn.kastatic.org/ka-youtube-converted/O_nY1TM2RZM.mp4/O_nY1TM2RZM.mp4#t=0&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{% endmedia %}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;h2&gt;练习题&lt;a href=&quot;#练习题&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;支持四种题型：&lt;strong&gt;单选题&lt;/strong&gt;、&lt;strong&gt;多选题&lt;/strong&gt;、&lt;strong&gt;判断题&lt;/strong&gt;、&lt;strong&gt;填空题&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;单选题&lt;a href=&quot;#单选题&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; 下列哪个是 JavaScript 的基本数据类型？{.quiz}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; Object{.options}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; Array{.options}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; Symbol{.correct}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; Function{.options}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;gt; 解析：Symbol 是 ES6 引入的基本数据类型，而 Object、Array、Function 都是引用类型。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;下列哪个是 JavaScript 的基本数据类型？
&lt;ul&gt;
&lt;li&gt;Object&lt;/li&gt;
&lt;li&gt;Array&lt;/li&gt;
&lt;li&gt;Symbol&lt;/li&gt;
&lt;li&gt;Function&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;解析：Symbol 是 ES6 引入的基本数据类型，而 Object、Array、Function 都是引用类型。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;多选题&lt;a href=&quot;#多选题&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; 以下哪些是 CSS 布局方式？{.quiz .multi}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; Flexbox{.correct}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; jQuery{.options}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; Grid{.correct}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; Float{.correct}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;gt; 解析：Flexbox、Grid 和 Float 都是 CSS 布局方式。jQuery 是一个 JavaScript 库，不属于 CSS 布局。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;以下哪些是 CSS 布局方式？
&lt;ul&gt;
&lt;li&gt;Flexbox&lt;/li&gt;
&lt;li&gt;jQuery&lt;/li&gt;
&lt;li&gt;Grid&lt;/li&gt;
&lt;li&gt;Float&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;解析：Flexbox、Grid 和 Float 都是 CSS 布局方式。jQuery 是一个 JavaScript 库，不属于 CSS 布局。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;判断题&lt;a href=&quot;#判断题&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; `const`&lt;/span&gt;&lt;span&gt; 声明的变量不能重新赋值，但可以修改其属性。{.quiz .true}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;gt; 解析：&lt;/span&gt;&lt;span&gt;`const`&lt;/span&gt;&lt;span&gt; 只保证变量绑定不可变，如果变量指向一个对象，其属性仍然可以修改。&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; HTML 是一种编程语言。{.quiz}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;gt; 解析：HTML（超文本标记语言）是一种标记语言，不是编程语言。它没有逻辑控制能力。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;const&lt;/code&gt; 声明的变量不能重新赋值，但可以修改其属性。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;解析：&lt;code&gt;const&lt;/code&gt; 只保证变量绑定不可变，如果变量指向一个对象，其属性仍然可以修改。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;HTML 是一种编程语言。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;解析：HTML（超文本标记语言）是一种标记语言，不是编程语言。它没有逻辑控制能力。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;填空题&lt;a href=&quot;#填空题&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; 在 JavaScript 中，&lt;/span&gt;&lt;span&gt;`typeof null`&lt;/span&gt;&lt;span&gt; 的结果是 &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.gap}。{.quiz .fill}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;gt; 解析：这是一个历史遗留 bug。&lt;/span&gt;&lt;span&gt;`null`&lt;/span&gt;&lt;span&gt; 的类型标签与 object 相同，因此 &lt;/span&gt;&lt;span&gt;`typeof null`&lt;/span&gt;&lt;span&gt; 返回 &lt;/span&gt;&lt;span&gt;`&quot;object&quot;`&lt;/span&gt;&lt;span&gt;。常见错误答案是 &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.mistake}。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;在 JavaScript 中，&lt;code&gt;typeof null&lt;/code&gt; 的结果是 &lt;span&gt;object&lt;/span&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;解析：这是一个历史遗留 bug。&lt;code&gt;null&lt;/code&gt; 的类型标签与 object 相同，因此 &lt;code&gt;typeof null&lt;/code&gt; 返回 &lt;code&gt;&quot;object&quot;&lt;/code&gt;。常见错误答案是 &lt;span&gt;null&lt;/span&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;CSS 中，&lt;span&gt;Flexbox&lt;/span&gt; 适合一维布局，&lt;span&gt;Grid&lt;/span&gt; 适合二维布局，而 &lt;span&gt;Float&lt;/span&gt; 是传统的布局方式。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;解析：Flexbox 是一维布局模型（行或列），Grid 是二维布局模型（行和列同时控制），Float 是 CSS2 时代的传统布局方式。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;加密内容块 (Encrypted Block)&lt;a href=&quot;#加密内容块-encrypted-block&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;使用 &lt;code&gt;:::encrypted{password=&quot;密码&quot;}&lt;/code&gt; 语法可以创建加密区块。区块内的内容在构建时使用 AES-256-GCM 进行真正加密，密码不会出现在最终的 HTML 中。读者需要输入正确密码才能解密查看。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：防止搜索引擎/爬虫收录敏感内容（如私人资源链接、付费内容片段等）。&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;前端无法实现真正意义上的加密：密码总需要在客户端输入，密文和算法都对用户可见，安全性完全取决于密码强度。本功能的目的不是对抗有针对性的破解，而是&lt;strong&gt;防止搜索引擎和爬虫直接收录明文内容&lt;/strong&gt;。对于这个场景，AES-256-GCM 已经足够：构建产物中只有密文，不含密码和明文，搜索引擎无法索引加密区块的内容。&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::encrypted{password=&quot;test&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这里是加密的内容，支持完整的 Markdown 语法：&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; **&lt;/span&gt;&lt;span&gt;粗体&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;斜体&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;~~&lt;/span&gt;&lt;span&gt;删除线&lt;/span&gt;&lt;span&gt;~~&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; `行内代码`&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;链接&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;https://example.com&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;span&gt;js&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;加密内容中的代码也有语法高亮！&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;行内公式 $E = mc^2$ 也可以正常渲染。&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::encrypted{password=&quot;another&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;每个加密块可以设置独立的密码。&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;</content:encoded><category>category:笔记</category><category>tag:Shoka</category><category>tag:Markdown</category><category>tag:测试</category></item><item><title>Infographic 信息图指南</title><link>https://www.fon1173.top/ko/post/infographic-guide</link><guid isPermaLink="false">ko:infographic-guide</guid><description>详细介绍如何在 Markdown 中使用 @antv/infographic 创建精美的信息图表，包含各种模板的实用示例</description><pubDate>Sat, 03 Jan 2026 04:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本文将详细介绍如何在 Markdown 中使用 &lt;a href=&quot;https://infographic.antv.vision/&quot;&gt;@antv/infographic&lt;/a&gt; 创建各种精美的信息图表。&lt;/p&gt;
&lt;h2&gt;什么是 Infographic&lt;a href=&quot;#什么是-infographic&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Infographic（信息图）是一种将数据、信息和知识以视觉化方式呈现的图表形式。相比传统的文字描述，信息图能够更直观、更有吸引力地传达信息。&lt;/p&gt;
&lt;p&gt;在本博客中，你可以直接在 Markdown 代码块中使用 &lt;code&gt;infographic&lt;/code&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;li&gt;统计图表&lt;/li&gt;
&lt;li&gt;象限分析&lt;/li&gt;
&lt;li&gt;关系展示&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;基本语法&lt;a href=&quot;#基本语法&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在代码块中使用 &lt;code&gt;infographic&lt;/code&gt; 标记，第一行指定模板名称，然后使用类似 YAML 的语法定义数据：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;span&gt;infographic&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;infographic &amp;lt;template-name&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  title 标题&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  desc 描述&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  items&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 条目名称&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 条目描述&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon mdi/icon-name&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;列表类模板 (list-*)&lt;a href=&quot;#列表类模板-list-&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;适合展示信息列表、特性清单、技术栈等。&lt;/p&gt;
&lt;h3&gt;网格卡片布局&lt;a href=&quot;#网格卡片布局&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;list-grid-badge-card&lt;/code&gt; 模板展示卡片式列表：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;infographic list-grid-badge-card&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  title 前端技术栈&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  desc 现代化前端开发常用技术&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  items&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label TypeScript&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 类型安全的 JavaScript 超集&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon mdi/language-typescript&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label React&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 用于构建用户界面的 JavaScript 库&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon mdi/react&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label Astro&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 现代化静态站点生成器&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon mdi/rocket-launch&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label Tailwind CSS&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 实用优先的 CSS 框架&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon mdi/tailwind&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label Vite&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 下一代前端构建工具&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon mdi/lightning-bolt&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label Biome&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 一体化的 Web 工具链&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon mdi/cog&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;糖果风格卡片&lt;a href=&quot;#糖果风格卡片&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;list-grid-candy-card-lite&lt;/code&gt; 创建更有趣的卡片样式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;infographic list-grid-candy-card-lite&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  title 博客特色功能&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  items&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 深色模式&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 优雅的主题切换&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon mdi/theme-light-dark&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 全站搜索&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 基于 Pagefind 的无后端搜索&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon mdi/magnify&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label Markdown 增强&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 支持 GFM、Mermaid、Infographic&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon mdi/markdown&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 智能推荐&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 基于语义相似度的文章推荐&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon mdi/brain&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;水平箭头列表&lt;a href=&quot;#水平箭头列表&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;list-row-horizontal-icon-arrow&lt;/code&gt; 展示线性列表：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;infographic list-row-horizontal-icon-arrow&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  title 开发流程&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  items&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 需求分析&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon mdi/clipboard-text&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 设计方案&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon mdi/palette&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 编码实现&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon mdi/code-tags&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 测试部署&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon mdi/rocket-launch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;流程/顺序类模板 (sequence-*)&lt;a href=&quot;#流程顺序类模板-sequence-&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;适合展示步骤、流程、时间线等有顺序关系的信息。&lt;/p&gt;
&lt;h3&gt;之字形步骤&lt;a href=&quot;#之字形步骤&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;sequence-zigzag-steps-underline-text&lt;/code&gt; 展示流程步骤：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;infographic sequence-zigzag-steps-underline-text&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  title 博客搭建流程&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  items&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 选择框架&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 选择 Astro 作为静态站点生成器&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 设计主题&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 参考 Shoka 主题进行设计&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 开发功能&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 实现文章系统、搜索、评论等功能&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 部署上线&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 使用 Vercel 进行自动化部署&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;圆形流程&lt;a href=&quot;#圆形流程&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;sequence-circular-simple&lt;/code&gt; 展示循环流程：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;infographic sequence-circular-simple&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  title PDCA 循环&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  items&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label Plan&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 制定计划&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label Do&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 执行实施&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label Check&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 检查验证&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label Act&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 改进优化&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;垂直路线图&lt;a href=&quot;#垂直路线图&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;sequence-roadmap-vertical-simple&lt;/code&gt; 展示时间线或路线图：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;infographic sequence-roadmap-vertical-simple&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  title 项目里程碑&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  items&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 2024 Q1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 项目启动，完成基础架构&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 2024 Q2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 实现核心功能，开始内容迁移&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 2024 Q3&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 优化性能，添加高级功能&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 2024 Q4&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 正式发布，持续优化&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;金字塔结构&lt;a href=&quot;#金字塔结构&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;sequence-pyramid-simple&lt;/code&gt; 展示层级递进关系：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;infographic sequence-pyramid-simple&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  title 马斯洛需求层次&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  items&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 自我实现&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 尊重需求&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 社交需求&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 安全需求&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 生理需求&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;theme&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  palette&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - #8b5cf6&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - #3b82f6&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - #06b6d4&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - #10b981&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - #f59e0b&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;对比类模板 (compare-*)&lt;a href=&quot;#对比类模板-compare-&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;适合展示二元对比、优缺点分析等。&lt;/p&gt;
&lt;h3&gt;水平二元对比&lt;a href=&quot;#水平二元对比&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;compare-binary-horizontal-simple-fold&lt;/code&gt; 进行对比：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;infographic compare-binary-horizontal-simple-fold&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  title SSR vs SSG&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  items&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 服务端渲染 (SSR)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      children&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 实时生成&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          desc 每次请求时渲染页面&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 动态内容&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          desc 适合频繁更新的内容&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 服务器负载&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          desc 需要服务器资源&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 静态生成 (SSG)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      children&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 构建时生成&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          desc 提前生成所有页面&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 静态内容&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          desc 适合内容相对稳定的场景&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label CDN 友好&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          desc 可以部署到 CDN 边缘节点&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;SWOT 分析&lt;a href=&quot;#swot-分析&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;compare-swot&lt;/code&gt; 进行 SWOT 分析：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;infographic compare-swot&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  title 技术博客 SWOT 分析&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  items&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 优势 (Strengths)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      children&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 技术积累&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 个人品牌&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 知识沉淀&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 劣势 (Weaknesses)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      children&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 时间投入&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 持续更新压力&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 初期流量低&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 机会 (Opportunities)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      children&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 技术社区活跃&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 开源生态发展&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 个人成长空间&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 威胁 (Threats)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      children&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 内容同质化&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 平台竞争&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 技术快速迭代&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;层级类模板 (hierarchy-*)&lt;a href=&quot;#层级类模板-hierarchy-&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;适合展示组织结构、分类体系等树形关系。&lt;/p&gt;
&lt;h3&gt;系统分层结构&lt;a href=&quot;#系统分层结构&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;hierarchy-structure&lt;/code&gt; 展示多层架构，非常适合展示系统架构、模块分层：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;infographic hierarchy-structure&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  title 系统分层结构&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  desc 展示不同层级的模块与功能分组&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  items&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 展现层&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      children&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 小程序&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label APP&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label PAD&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 客户端&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label WEB&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 应用层&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      children&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 核心模块&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          children&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能3&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能4&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能5&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能6&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 基础模块&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          children&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能3&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能4&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能5&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能6&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 其他模块&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          children&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能3&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能4&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能5&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能6&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 平台层&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      children&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 模块1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          children&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能3&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能4&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 模块2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          children&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能3&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能4&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 模块3&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          children&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能3&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 功能4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;科技风格树形图&lt;a href=&quot;#科技风格树形图&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;hierarchy-tree-tech-style-capsule-item&lt;/code&gt; 展示层级结构：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;infographic hierarchy-tree-tech-style-capsule-item&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  title 前端技术体系&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  items&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 前端开发&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      children&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 基础技术&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          children&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label HTML&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label CSS&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label JavaScript&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 框架/库&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          children&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label React&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label Vue&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label Astro&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 工程化&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          children&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label Vite&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label Webpack&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label Rollup&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;圆角矩形树形图&lt;a href=&quot;#圆角矩形树形图&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;hierarchy-tree-curved-line-rounded-rect-node&lt;/code&gt; 展示层级：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;infographic hierarchy-tree-curved-line-rounded-rect-node&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  title 博客内容分类&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  items&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 技术文章&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      children&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 前端&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          children&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label React&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label TypeScript&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 后端&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          children&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label Node.js&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            - label 数据库&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 生活随笔&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      children&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 年度总结&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        - label 读书笔记&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;图表类模板 (chart-*)&lt;a href=&quot;#图表类模板-chart-&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;适合展示统计数据、数值对比等。&lt;/p&gt;
&lt;h3&gt;柱状图&lt;a href=&quot;#柱状图&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;chart-column-simple&lt;/code&gt; 展示数据对比：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;infographic chart-column-simple&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  title 月度文章发布统计&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  items&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 1月&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 5&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 2月&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 8&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 3月&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 12&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 4月&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 6&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 5月&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 10&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 6月&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 15&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;条形图&lt;a href=&quot;#条形图&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;chart-bar-plain-text&lt;/code&gt; 展示横向对比：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;infographic chart-bar-plain-text&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  title 编程语言使用占比&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  items&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label TypeScript&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 45&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label JavaScript&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 25&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label Python&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 15&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label Go&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 10&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label Others&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 5&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;饼图&lt;a href=&quot;#饼图&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;chart-pie-plain-text&lt;/code&gt; 展示占比分布：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;infographic chart-pie-plain-text&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  title 访问来源分布&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  items&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 搜索引擎&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 45&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 社交媒体&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 30&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 直接访问&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 15&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 外部链接&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 10&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;环形图&lt;a href=&quot;#环形图&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;chart-pie-donut-pill-badge&lt;/code&gt; 创建环形图：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;infographic chart-pie-donut-pill-badge&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  title 技术栈占比&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  items&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 前端&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 50&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 后端&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 30&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label DevOps&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 20&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;折线图&lt;a href=&quot;#折线图&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;chart-line-plain-text&lt;/code&gt; 展示趋势：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;infographic chart-line-plain-text&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  title 博客访问量趋势&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  items&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 第1周&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 100&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 第2周&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 150&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 第3周&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 200&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 第4周&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 280&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 第5周&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 350&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 第6周&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 420&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;象限分析 (quadrant-*)&lt;a href=&quot;#象限分析-quadrant-&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;适合展示四象限分析、优先级矩阵等。&lt;/p&gt;
&lt;h3&gt;简单卡片象限&lt;a href=&quot;#简单卡片象限&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;quadrant-quarter-simple-card&lt;/code&gt; 进行象限分析：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;infographic quadrant-quarter-simple-card&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  title 四象限分析&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  items&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 重要且紧急&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 直接规避风险&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      illus notify&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 重要不紧急&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 采取风险控制措施&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      illus coffee&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 不重要但紧急&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 通过保险转移风险&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      illus diary&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 不重要不紧急&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 选择接受风险&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      illus invest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;关系图 (relation-*)&lt;a href=&quot;#关系图-relation-&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;适合展示元素间的关联关系。&lt;/p&gt;
&lt;h3&gt;圆形图标关系&lt;a href=&quot;#圆形图标关系&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;relation-circle-icon-badge&lt;/code&gt; 展示关系网络：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;infographic relation-circle-circular-progress&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  title 子公司盈利分析&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  desc 各子公司财务表现，盈利同比增长&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  items&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 云计算子公司&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 25&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 年度净利润率达25%，成为集团核心增长引擎&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon mingcute/cardano-ada-fill&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 人工智能子公司&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 40&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc AI业务快速扩张，盈利同比增长40%&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon mingcute/openai-fill&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 物联网子公司&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 1000&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc IoT设备出货量突破千万，盈利稳步提升&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon mingcute/medium-fill&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 金融科技子公司&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 18&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 数字支付业务增长迅猛，净利润率18%&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon mingcute/paypal-fill&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 新能源子公司&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      value 50&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 绿色能源项目实现规模化盈利，增长潜力巨大&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon mingcute/drone-fill&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;主题定制&lt;a href=&quot;#主题定制&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;可以通过 &lt;code&gt;theme&lt;/code&gt; 块自定义颜色方案：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;infographic list-grid-badge-card&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  title 自定义配色示例&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  items&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 主色调&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 品牌主色&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 辅助色&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 强调色彩&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 中性色&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 背景文字&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;theme&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  palette&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - #3b82f6&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - #8b5cf6&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - #f97316&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - #06b6d4&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - #10b981&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;实用技巧&lt;a href=&quot;#实用技巧&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;1. 选择合适的模板&lt;a href=&quot;#1-选择合适的模板&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;根据要展示的信息类型选择对应的模板：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;列表信息&lt;/strong&gt; → &lt;code&gt;list-*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;流程步骤&lt;/strong&gt; → &lt;code&gt;sequence-*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据对比&lt;/strong&gt; → &lt;code&gt;compare-*&lt;/code&gt; 或 &lt;code&gt;chart-*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;层级关系&lt;/strong&gt; → &lt;code&gt;hierarchy-*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优先级分析&lt;/strong&gt; → &lt;code&gt;quadrant-*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关联关系&lt;/strong&gt; → &lt;code&gt;relation-*&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 合理使用图标&lt;a href=&quot;#2-合理使用图标&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用 &lt;a href=&quot;https://pictogrammers.com/library/mdi/&quot;&gt;Material Design Icons&lt;/a&gt; 让信息图更生动：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;icon mdi/rocket-launch&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;icon mdi/heart&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;icon mdi/lightbulb&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;icon mdi/chart-line&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;3. 控制信息密度&lt;a href=&quot;#3-控制信息密度&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;每个信息图不要包含过多条目（建议 3-8 个）&lt;/li&gt;
&lt;li&gt;使用简洁的标签和描述&lt;/li&gt;
&lt;li&gt;复杂信息可以拆分成多个信息图&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. 注意主题适配&lt;a href=&quot;#4-注意主题适配&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;信息图会自动跟随博客的深色/浅色主题切换，无需额外配置。&lt;/p&gt;
&lt;h2&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Infographic 为 Markdown 文档提供了强大的可视化能力，能够让技术博客、文档、笔记更加生动易读。合理使用各种模板，可以显著提升内容的表现力和可读性。&lt;/p&gt;
&lt;p&gt;更多模板和详细文档，请访问 &lt;a href=&quot;https://infographic.antv.vision/&quot;&gt;Infographic 官方网站&lt;/a&gt;。&lt;/p&gt;</content:encoded><category>category:笔记</category><category>category:前端</category><category>tag:Infographic</category><category>tag:可视化</category><category>tag:Markdown</category></item><item><title>2025 年终：写得不多，但都写完了</title><link>https://www.fon1173.top/ko/post/year-in-review-2025</link><guid isPermaLink="false">ko:year-in-review-2025</guid><description>年底照例回头看一眼。今年博客更新不算勤快，但开了头的系列基本都收了尾，也终于把博客迁到了新主题。</description><pubDate>Wed, 31 Dec 2025 15:20:00 GMT</pubDate><content:encoded>&lt;p&gt;又到年底。今年写的东西不多，翻了一下归档页，每个月零零散散有一两篇，有几个月是空的。&lt;/p&gt;
&lt;h2&gt;这一年&lt;a href=&quot;#这一年&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;infographic sequence-roadmap-vertical-simple&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  title 2025&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  items&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 年初&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 补完了一部拖了很久的番，写了观后感&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 春天&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 周刊恢复更新，换了更顺手的工具&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 夏天&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 写周刊第三期，之后停了一阵&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 秋天&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 研究博客加密和构建流程，写了几篇笔记&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 年底&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 整理归档，写下这篇&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;做完的事&lt;a href=&quot;#做完的事&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;博客迁到了新主题，旧文章的链接都保留了下来&lt;/li&gt;
&lt;li&gt;周刊从第一期写到了第三期，虽然间隔很长&lt;/li&gt;
&lt;li&gt;读完了十几本书，大部分是小说&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;没做完的事&lt;a href=&quot;#没做完的事&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;计划中的系列教程只写了开头&lt;/li&gt;
&lt;li&gt;草稿箱里还有好几篇半成品&lt;/li&gt;
&lt;li&gt;说好要学的那门语言，课本还是新的&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;明年&lt;a href=&quot;#明年&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;不立太多目标。能保持每个月写一篇，就算达成了。&lt;/p&gt;
&lt;p&gt;新年快乐。&lt;/p&gt;</content:encoded><category>category:随笔</category><category>tag:随笔</category><category>tag:年终总结</category></item><item><title>astro-koharu 使用指南</title><link>https://www.fon1173.top/ko/post/astro-koharu-guide</link><guid isPermaLink="false">ko:astro-koharu-guide</guid><description>astro-koharu 博客的完整使用指南，包含快速开始、配置说明、文章系统、界面功能等详细介绍</description><pubDate>Mon, 29 Dec 2025 13:55:00 GMT</pubDate><content:encoded>&lt;p&gt;一份完整的 astro-koharu 博客系统使用指南，帮助你快速上手并充分利用所有功能特性。&lt;/p&gt;
&lt;div&gt;
  &lt;a href=&quot;https://github.com/cosZone/astro-koharu&quot; target=&quot;_blank&quot;&gt;
    &lt;div&gt;
      &lt;div&gt;
        &lt;div&gt;
          &lt;img src=&quot;https://github.com/fluidicon.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
          &lt;span&gt;github.com&lt;/span&gt;
        &lt;/div&gt;
        &lt;div&gt;GitHub - cosZone/astro-koharu: astro-koharu 是一个萌系/二次元/粉蓝配色的 astro 主题博客，灵感来自 Hexo 的 Shoka 主题，加了很多自己的小巧思，性能优越。&lt;/div&gt;
        &lt;p&gt;astro-koharu 是一个萌系/二次元/粉蓝配色的 astro 主题博客，灵感来自 Hexo 的 Shoka 主题，加了很多自己的小巧思，性能优越。 - cosZone/astro-koharu&lt;/p&gt;
        &lt;div&gt;
          &lt;span&gt;https://github.com/cosZone/astro-koharu&lt;/span&gt;
           
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;div&gt;&lt;img src=&quot;https://opengraph.githubassets.com/bb2d62a8104df4bb03dfd471dbe63677a16e9ff02b58322d8544ffd56fba3029/cosZone/astro-koharu&quot; alt=&quot;GitHub - cosZone/astro-koharu: astro-koharu 是一个萌系/二次元/粉蓝配色的 astro 主题博客，灵感来自 Hexo 的 Shoka 主题，加了很多自己的小巧思，性能优越。&quot; loading=&quot;lazy&quot; /&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;h2&gt;快速开始&lt;a href=&quot;#快速开始&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;项目简介&lt;a href=&quot;#项目简介&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;astro-koharu 是一个基于 Astro 7.x 构建的现代化博客系统，从 Hexo 迁移而来，设计灵感和初衷都来自 &lt;a href=&quot;https://github.com/amehime/hexo-theme-shoka&quot;&gt;Shoka&lt;/a&gt; 主题。欢迎 &lt;a href=&quot;https://github.com/cosZone/astro-koharu/fork&quot;&gt;fork&lt;/a&gt; 出来制作自己的主题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;核心特点：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基于 Astro 7.x，静态站点生成，性能优异&lt;/li&gt;
&lt;li&gt;优雅的深色/浅色主题切换&lt;/li&gt;
&lt;li&gt;基于 Pagefind 的无后端全站搜索&lt;/li&gt;
&lt;li&gt;完整的 Markdown 增强功能（GFM、代码高亮、自动目录）&lt;/li&gt;
&lt;li&gt;灵活的多级分类与标签系统（从 Shoka 主题迁移，后续会考虑将其改为可关闭的）&lt;/li&gt;
&lt;li&gt;多系列文章支持（周刊、书摘等自定义系列，支持自定义 URL slug）&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;/li&gt;
&lt;li&gt;友链系统与归档页面&lt;/li&gt;
&lt;li&gt;多语言支持（i18n）&lt;/li&gt;
&lt;li&gt;RSS 订阅支持&lt;/li&gt;
&lt;li&gt;LQIP（低质量图片占位符）&lt;/li&gt;
&lt;li&gt;圣诞特辑（可开关）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;本地开发&lt;a href=&quot;#本地开发&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 克隆项目&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; clone&lt;/span&gt;&lt;span&gt; https://github.com/cosZone/astro-koharu.git&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; astro-koharu&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 安装依赖&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 启动开发服务器&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; dev&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 构建生产版本&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; build&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 预览生产构建&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; preview&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;快速部署&lt;a href=&quot;#快速部署&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用 Vercel 进行一键部署：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://vercel.com/new/clone?repository-url=https://github.com/cosZone/astro-koharu&amp;amp;project-name=astro-koharu&amp;amp;repository-name=astro-koharu&quot;&gt;&lt;img src=&quot;https://vercel.com/button&quot; alt=&quot;Deploy with Vercel&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;构建缓存说明&lt;a href=&quot;#构建缓存说明&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;项目将 &lt;code&gt;.cache/og-data.json&lt;/code&gt; 提交到 Git 仓库。该文件缓存了链接嵌入功能抓取的外部链接 OG 元数据（标题、描述、图片等），提交到 Git 后 Vercel、Netlify 等平台构建时可直接复用，无需每次重新抓取，显著加速构建速度。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.cache/&lt;/code&gt; 目录下的其他文件（如 &lt;code&gt;transformers/&lt;/code&gt; 模型缓存、&lt;code&gt;summaries-cache.json&lt;/code&gt;）仍被 &lt;code&gt;.gitignore&lt;/code&gt; 忽略，不会提交。&lt;/p&gt;
&lt;h2&gt;基本配置&lt;a href=&quot;#基本配置&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;站点配置&lt;a href=&quot;#站点配置&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;编辑 &lt;code&gt;config/site.yaml&lt;/code&gt; 文件配置站点基本信息：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# =============================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 站点基础信息&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# =============================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 余弦の博客&lt;/span&gt;&lt;span&gt; # 网站标题&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  alternate&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; cosine&lt;/span&gt;&lt;span&gt; # 英文短名（用作 logo 文本）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  subtitle&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; WA 的一声就哭了&lt;/span&gt;&lt;span&gt; # 副标题&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; cos&lt;/span&gt;&lt;span&gt; # 站点作者简称&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  description&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; FE / ACG / 手工 / 深色模式强迫症 / INFP&lt;/span&gt;&lt;span&gt; # 站点简介&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  avatar&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; /img/avatar.webp&lt;/span&gt;&lt;span&gt; # 头像路径&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  showLogo&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt; # 是否显示 logo&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  author&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; cos&lt;/span&gt;&lt;span&gt; # 文章作者&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  url&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; https://blog.cosine.ren/&lt;/span&gt;&lt;span&gt; # 站点域名&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  startYear&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 2020&lt;/span&gt;&lt;span&gt; # 站点创建年份&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  keywords&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; # SEO 关键词&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    -&lt;/span&gt;&lt;span&gt; cos&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    -&lt;/span&gt;&lt;span&gt; cosine&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    -&lt;/span&gt;&lt;span&gt; 博客&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    -&lt;/span&gt;&lt;span&gt; 技术&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    -&lt;/span&gt;&lt;span&gt; 前端&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;本地轻 CMS 应用&lt;a href=&quot;#本地轻-cms-应用&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;本项目提供独立的 CMS 管理应用，支持文章管理、浏览器内编辑、Markdown 预览等功能。&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://r2.cosine.ren/i/2026/01/a1c1d69ef48c758010e553e882e470db.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://r2.cosine.ren/i/2026/01/6c6956e3b49729ddf272669f3f738f13.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://r2.cosine.ren/i/2026/01/1d86afe19ed2fe921990657685393c2d.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;启动 CMS：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 首次使用需安装依赖&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; cms:install&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 启动 CMS（默认端口 4322）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; cms&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;CMS 提供以下功能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;📊 文章仪表盘：查看文章统计、分类分布、最近更新&lt;/li&gt;
&lt;li&gt;📝 浏览器内编辑器：与公开写作室共用 CodeMirror 源码编辑、Shoka 实时预览及中文语法手册，CMS 可保存完整 Markdown 原文&lt;/li&gt;
&lt;li&gt;🔄 草稿/发布切换：一键切换文章状态&lt;/li&gt;
&lt;li&gt;📌 置顶管理：快速置顶/取消置顶文章&lt;/li&gt;
&lt;li&gt;➕ 新建文章：交互式创建文章，自动生成 frontmatter&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;本地编辑器跳转&lt;a href=&quot;#本地编辑器跳转&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;开发环境下，文章页「复制 Markdown」按钮组的下拉菜单支持一键跳转到本地编辑器（VS Code / Cursor / Zed 等）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;配置文件：&lt;/strong&gt; &lt;code&gt;config/site.yaml&lt;/code&gt; 的 &lt;code&gt;dev&lt;/code&gt; 部分&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  localProjectPath&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;/Users/yourname/path/to/astro-koharu&quot;&lt;/span&gt;&lt;span&gt; # 本地项目绝对路径&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  contentRelativePath&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;src/content/blog&quot;&lt;/span&gt;&lt;span&gt; # 博客内容目录&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  editors&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    -&lt;/span&gt;&lt;span&gt; id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; vscode&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; VS Code&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; devicon-plain:vscode&lt;/span&gt;&lt;span&gt; # 可从 https://icon-sets.iconify.design/ 搜寻图标&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      urlTemplate&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;vscode://file/{path}&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    -&lt;/span&gt;&lt;span&gt; id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; cursor&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Cursor&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; simple-icons:cursor&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      urlTemplate&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;cursor://file/{path}&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    -&lt;/span&gt;&lt;span&gt; id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; zed&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Zed&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; simple-icons:zedindustries&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      urlTemplate&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;zed://file/{path}&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;配置说明：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;localProjectPath&lt;/code&gt; 必须是本机的绝对路径，否则无法生成正确的文件路径&lt;/li&gt;
&lt;li&gt;&lt;code&gt;urlTemplate&lt;/code&gt; 支持 &lt;code&gt;&lt;/code&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;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;featuredCategories&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; link&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; life&lt;/span&gt;&lt;span&gt; # 分类链接（对应 category_map）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    label&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 随笔&lt;/span&gt;&lt;span&gt; # 显示名称&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; /img/cover/2.webp&lt;/span&gt;&lt;span&gt; # 封面图片&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    description&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 生活记录、年度总结等&lt;/span&gt;&lt;span&gt; # 描述&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; link&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; note/front-end&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    label&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 前端笔记&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    image&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; /img/cover/1.webp&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    description&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 前端相关的笔记&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  # ... 更多分类&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;多系列文章配置：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;配置特色系列（如周刊、书摘等），支持多个系列，每个系列拥有独立页面和自定义 URL：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;featuredSeries&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; slug&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; weekly&lt;/span&gt;&lt;span&gt; # URL 路径: /weekly（必填，作为页面路由）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    categoryName&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 周刊&lt;/span&gt;&lt;span&gt; # 分类名称（用于匹配文章）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    label&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; FE Bits&lt;/span&gt;&lt;span&gt; # 显示标签&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    fullName&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; FE Bits 前端周周谈&lt;/span&gt;&lt;span&gt; # 完整名称&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    description&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; # 描述（支持多行）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      之前在自己的频道进行一些输出，于是有了这个周刊！&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      更新时间期望是在每周天&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    cover&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; /img/weekly_header.webp&lt;/span&gt;&lt;span&gt; # 封面图&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    enabled&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt; # 是否启用&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    icon&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; ri:newspaper-line&lt;/span&gt;&lt;span&gt; # 导航图标（可选）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    highlightOnHome&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt; # 是否在首页高亮最新文章（可选，默认 true）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    links&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; # 相关链接&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      github&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; https://github.com/your-username/your-repo&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      rss&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; /rss.xml&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; slug&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; reading&lt;/span&gt;&lt;span&gt; # URL 路径: /reading&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    categoryName&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 书摘&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    label&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 读书笔记&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    fullName&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 我的读书笔记&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    description&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 读书摘录与感悟&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    cover&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; /img/reading_header.webp&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    enabled&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    highlightOnHome&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt; # 此系列不在首页高亮&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;字段说明：&lt;/strong&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;code&gt;slug&lt;/code&gt;&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;URL 路径，如 &lt;code&gt;weekly&lt;/code&gt; 对应 &lt;code&gt;/weekly&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;categoryName&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;label&lt;/code&gt;&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;显示标签（默认使用 categoryName）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;enabled&lt;/code&gt;&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;是否启用此系列（默认 true）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;fullName&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;description&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;cover&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;icon&lt;/code&gt;&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;导航图标（Iconify 格式）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;highlightOnHome&lt;/code&gt;&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;是否在首页高亮最新文章（默认 true）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;links&lt;/code&gt;&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;相关链接（github、rss 等）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;社交媒体配置&lt;a href=&quot;#社交媒体配置&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;config/site.yaml&lt;/code&gt; 中配置社交媒体链接：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;social&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  github&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    url&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; https://github.com/your-username&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    icon&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; ri:github-fill&lt;/span&gt;&lt;span&gt; # Iconify 图标名&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    color&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;#191717&quot;&lt;/span&gt;&lt;span&gt; # 主题色&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  bilibili&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    url&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; https://space.bilibili.com/your-uid&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    icon&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; ri:bilibili-fill&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    color&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;#da708a&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  email&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    url&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; mailto:your@email.com&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    icon&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; ri:mail-line&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    color&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;#55acd5&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  rss&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    url&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; /rss.xml&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    icon&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; ri:rss-line&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    color&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;#ff6600&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  # ... 更多平台&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;支持的平台：GitHub, Twitter, Bilibili, 网易云音乐, Email, RSS 等。完整配置请参考 &lt;code&gt;config/site.yaml&lt;/code&gt; 文件。&lt;/p&gt;
&lt;h3&gt;导航配置&lt;a href=&quot;#导航配置&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;config/site.yaml&lt;/code&gt; 中自定义导航菜单：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;navigation&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 首页&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    path&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; /&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    icon&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; fa6-solid:house-chimney&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 周刊&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    path&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; /weekly&lt;/span&gt;&lt;span&gt; # 对应 featuredSeries 中 slug: weekly 的系列&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    icon&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; ri:newspaper-line&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 读书笔记&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    path&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; /reading&lt;/span&gt;&lt;span&gt; # 对应 featuredSeries 中 slug: reading 的系列&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    icon&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; ri:book-open-line&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 文章&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    icon&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; ri:quill-pen-ai-fill&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    children&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; # 支持嵌套子菜单&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      -&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 分类&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        path&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; /categories&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        icon&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; ri:grid-fill&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      -&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 标签&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        path&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; /tags&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        icon&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; fa6-solid:tags&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      -&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 归档&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        path&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; /archives&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        icon&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; ri:archive-2-fill&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 友链&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    path&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; /friends&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    icon&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; ri:links-line&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 关于&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    path&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; /about&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    icon&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; fa6-regular:circle-user&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：系列页面的路径格式为 &lt;code&gt;/{slug}&lt;/code&gt;，需要与 &lt;code&gt;featuredSeries&lt;/code&gt; 中配置的 &lt;code&gt;slug&lt;/code&gt; 字段一致。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;分类映射配置&lt;a href=&quot;#分类映射配置&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;config/site.yaml&lt;/code&gt; 中配置中文分类名到 URL slug 的映射：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# =============================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Category Map&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Maps Chinese category names to URL-friendly English slugs&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# =============================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;categoryMap&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  # Primary categories&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  随笔&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; life&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  笔记&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; note&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  工具&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; tools&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  周刊&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; weekly&lt;/span&gt;&lt;span&gt; # 用于分类页面 /categories/weekly&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  书摘&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; reading&lt;/span&gt;&lt;span&gt; # 用于分类页面 /categories/reading&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  # Secondary categories (for nested paths)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  前端&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; front-end&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  # Add more as needed:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  # 后端: back-end&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  # 算法: algorithm&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这样，&quot;随笔&quot; 分类的 URL 会是 &lt;code&gt;/categories/life&lt;/code&gt;，而不是 &lt;code&gt;/categories/随笔&lt;/code&gt;。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：&lt;code&gt;categoryMap&lt;/code&gt; 仅用于分类页面（&lt;code&gt;/categories/*&lt;/code&gt;）的 URL 映射。系列页面的 URL（如 &lt;code&gt;/weekly&lt;/code&gt;、&lt;code&gt;/reading&lt;/code&gt;）由 &lt;code&gt;featuredSeries&lt;/code&gt; 中的 &lt;code&gt;slug&lt;/code&gt; 字段单独配置。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;文章系统&lt;a href=&quot;#文章系统&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;创建文章&lt;a href=&quot;#创建文章&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;方式一：使用 Koharu CLI（推荐）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;使用交互式 CLI 工具快速创建文章：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; post&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;CLI 工具会引导你输入标题、分类、标签等信息，自动生成 frontmatter 和 markdown 文件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方式二：手动创建&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;src/content/blog/&lt;/code&gt; 目录下创建 Markdown 文件。目录结构会影响文章的分类：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;src/content/blog/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├── life/              # 随笔分类&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   └── 2024-life-review.md&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├── note/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   ├── front-end/     # 笔记 &amp;gt; 前端&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   │   └── react/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   │       └── React学习小记.md&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   └── algorithm/     # 笔记 &amp;gt; 算法&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│       └── 动态规划学习笔记.md&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;└── tools/             # 工具分类&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    └── vscode插件推荐.md&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Frontmatter 字段说明&lt;a href=&quot;#frontmatter-字段说明&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;每篇文章开头需要包含 YAML frontmatter：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;必填字段：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 文章标题&lt;/span&gt;&lt;span&gt; # 必填&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 2024-12-06 &lt;/span&gt;&lt;span&gt;# 必填，发布日期&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;常用可选字段：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 文章标题&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 2024-12-06&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;updated&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 2024-12-15 &lt;/span&gt;&lt;span&gt;# 最近更新时间（可选，存在时会在文章页显示）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 文章摘要描述&lt;/span&gt;&lt;span&gt; # 用于 SEO 和列表展示，如不填写会自动使用 AI 摘要或提取正文前 150 字&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; custom-url-slug&lt;/span&gt;&lt;span&gt; # 自定义 URL（默认使用文件名）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;cover&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; /img/cover/1.webp&lt;/span&gt;&lt;span&gt; # 封面图片&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tags&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; # 标签列表&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; JavaScript&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; React&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;categories&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; # 分类（见下方详细说明）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; 笔记&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;subtitle&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 副标题&lt;/span&gt;&lt;span&gt; # 文章副标题&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;catalog&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt; # 是否计入分类页的分类树与篇数（默认 true）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tocNumbering&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt; # 是否显示目录编号（默认 true）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;draft&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt; # 是否为草稿（默认 false）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sticky&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt; # 是否置顶（默认 false）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;excludeFromSummary&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt; # 是否排除 AI 摘要和相似度计算（默认 false，系列文章建议设为 true）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;math&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt; # 是否启用数学公式渲染（默认 false，启用后支持 KaTeX）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;quiz&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt; # 是否启用练习题交互（默认 false，启用后支持四种题型）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;password&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; mySecret&lt;/span&gt;&lt;span&gt; # 整篇文章加密密码（可选，设置后整篇文章需输入密码才能阅读）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;keywords&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; # 文章关键词（可选）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;colophon&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; # 文章落款（可选，见下方「文章落款」）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; handwritten&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;关于 description 字段：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;文章描述的优先级：手写 &lt;code&gt;description&lt;/code&gt; &amp;gt; AI 自动摘要 &amp;gt; Markdown 正文前 150 字&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;建议为重要文章手写描述，以获得更好的 SEO 效果&lt;/li&gt;
&lt;li&gt;如果省略描述，系统会自动使用 AI 生成的摘要（需运行 &lt;code&gt;pnpm generate:summaries&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;如果既没有手写描述也没有 AI 摘要，则自动提取文章正文的前 150 个字符&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;关于 link 字段（自定义 URL）：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;⚠️ &lt;strong&gt;重要&lt;/strong&gt;：&lt;code&gt;link&lt;/code&gt; 字段会被&lt;strong&gt;自动转换为小写&lt;/strong&gt;，以保持 URL 的一致性和规范性。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;规范化行为&lt;/strong&gt;：无论你输入 &lt;code&gt;MyPost&lt;/code&gt;、&lt;code&gt;myPost&lt;/code&gt; 还是 &lt;code&gt;mypost&lt;/code&gt;，最终 URL 都会是 &lt;code&gt;/post/mypost&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文件名大小写无关&lt;/strong&gt;：文章文件名可以使用任意大小写（如 &lt;code&gt;MyPost.md&lt;/code&gt;），系统会自动处理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 摘要和相似度&lt;/strong&gt;：生成的 &lt;code&gt;summaries.json&lt;/code&gt; 和 &lt;code&gt;similarities.json&lt;/code&gt; 中的 key 也会统一为小写&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最佳实践&lt;/strong&gt;：建议直接使用小写和连字符（如 &lt;code&gt;my-awesome-post&lt;/code&gt;），避免混淆&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# ✅ 推荐写法&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; my-awesome-post&lt;/span&gt;&lt;span&gt;  # URL: /post/my-awesome-post&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# ⚠️ 会被转为小写&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; MyAwesomePost&lt;/span&gt;&lt;span&gt;    # URL: /post/myawesomepost（不是 /post/MyAwesomePost）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; My-Awesome-Post&lt;/span&gt;&lt;span&gt;  # URL: /post/my-awesome-post&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;如果省略 &lt;code&gt;link&lt;/code&gt; 字段，系统会使用文件名（同样会转为小写）：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 文件: src/content/blog/MyPost.md&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 省略 link 字段 → URL: /post/mypost&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;分类系统&lt;a href=&quot;#分类系统&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;astro-koharu 支持灵活的分类配置：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;单层分类：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;categories&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; 工具&lt;/span&gt;&lt;span&gt; # 或者 [&apos;工具&apos;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;对应 URL: &lt;code&gt;/categories/tools&lt;/code&gt;（根据 &lt;code&gt;categoryMap&lt;/code&gt; 映射）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;多层嵌套分类：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;categories&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;笔记&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; 前端&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; React&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这会创建层级关系：笔记 → 前端 → React&lt;/p&gt;
&lt;p&gt;对应 URL: &lt;code&gt;/categories/note/front-end/react&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;标签系统&lt;a href=&quot;#标签系统&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;标签是扁平的，不支持层级：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tags&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; JavaScript&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; TypeScript&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; 学习笔记&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;所有标签会在 &lt;code&gt;/tags&lt;/code&gt; 页面展示，点击标签可查看该标签下的所有文章。&lt;/p&gt;
&lt;h3&gt;草稿功能&lt;a href=&quot;#草稿功能&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;设置 &lt;code&gt;draft: true&lt;/code&gt; 将文章标记为草稿：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 未完成的文章&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;draft&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;行为：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;本地开发&lt;/strong&gt; (&lt;code&gt;pnpm dev&lt;/code&gt;)：草稿可见，文章卡片右上角显示 &quot;DRAFT&quot; 标识&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生产构建&lt;/strong&gt; (&lt;code&gt;pnpm build&lt;/code&gt;)：草稿自动过滤，不会出现在任何列表中&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;置顶功能&lt;a href=&quot;#置顶功能&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;设置 &lt;code&gt;sticky: true&lt;/code&gt; 将文章置顶：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 重要公告&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sticky&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;行为：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;置顶文章显示在首页 &quot;置顶文章&quot; 区域&lt;/li&gt;
&lt;li&gt;置顶文章按日期排序（最新的在前）&lt;/li&gt;
&lt;li&gt;不影响其他页面（分类、标签、归档）的排序&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;系列文章&lt;a href=&quot;#系列文章&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;配置了 &lt;code&gt;featuredSeries&lt;/code&gt; 的系列（见基本配置），其分类下的文章会：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;拥有专属的系列页面（URL 由 &lt;code&gt;slug&lt;/code&gt; 决定，如 &lt;code&gt;/weekly&lt;/code&gt;、&lt;code&gt;/reading&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;不出现在普通文章列表（&lt;code&gt;/posts&lt;/code&gt;）中&lt;/li&gt;
&lt;li&gt;如果系列设置了 &lt;code&gt;highlightOnHome: true&lt;/code&gt;，最新一篇会在首页高亮显示&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;示例：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; FE Bits Vol.16&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;categories&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; 周刊&lt;/span&gt;&lt;span&gt; # 对应某个 featuredSeries 的 categoryName&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;excludeFromSummary&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt; # 可选：排除 AI 摘要生成&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 《代码大全》读书笔记&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;categories&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; 书摘&lt;/span&gt;&lt;span&gt; # 对应另一个 featuredSeries 的 categoryName&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;提示&lt;/strong&gt;：文章的 &lt;code&gt;categories&lt;/code&gt; 字段需要与 &lt;code&gt;featuredSeries&lt;/code&gt; 中某个系列的 &lt;code&gt;categoryName&lt;/code&gt; 匹配才会被归入该系列。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;独立页面&lt;a href=&quot;#独立页面&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;除了博客文章外，你可以在 &lt;code&gt;src/pages/&lt;/code&gt; 目录下创建 &lt;code&gt;.md&lt;/code&gt; 文件来添加独立页面（如&quot;关于&quot;、&quot;歌单&quot;等）。这些页面使用 &lt;code&gt;PageLayout.astro&lt;/code&gt; 布局，支持完整的 Markdown 增强语法。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;创建独立页面：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;src/pages/&lt;/code&gt; 目录下新建 &lt;code&gt;.md&lt;/code&gt; 文件：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;layout&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; ../layouts/PageLayout.astro&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;歌单&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;我喜欢的音乐&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;coverTitle&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;我的歌单&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;comments&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;页面内容...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Frontmatter 字段：&lt;/strong&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;code&gt;layout&lt;/code&gt;&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;固定为 &lt;code&gt;../layouts/PageLayout.astro&lt;/code&gt;&lt;/td&gt;&lt;/tr&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;description&lt;/code&gt;&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;页面描述（用于 SEO）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;coverTitle&lt;/code&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;comments&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;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;添加导航入口：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;config/site.yaml&lt;/code&gt; 的 &lt;code&gt;navigation&lt;/code&gt; 中添加对应菜单项：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;navigation&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  # ...&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 歌单&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    path&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; /music&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    icon&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; ri:music-2-fill&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;提示&lt;/strong&gt;：&lt;code&gt;src/pages/&lt;/code&gt; 下所有 &lt;code&gt;.md&lt;/code&gt; 文件会被 Koharu CLI 的备份功能自动覆盖，无需额外配置。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;界面功能&lt;a href=&quot;#界面功能&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;主题切换&lt;a href=&quot;#主题切换&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&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;code&gt;github-light&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;深色模式：&lt;code&gt;github-dark&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;全站搜索&lt;a href=&quot;#全站搜索&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;基于 &lt;a href=&quot;https://pagefind.app/&quot;&gt;Pagefind&lt;/a&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;code&gt;Cmd/Ctrl + K&lt;/code&gt;&lt;/li&gt;
&lt;/ul&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;li&gt;高亮匹配关键词&lt;/li&gt;
&lt;li&gt;显示文章摘要和元信息&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;文章阅读功能&lt;a href=&quot;#文章阅读功能&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;目录导航 (Table of Contents)：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自动提取文章标题（h2-h6）生成目录&lt;/li&gt;
&lt;li&gt;使用 CSS 计数器自动为标题添加层级编号（如 1., 1.1., 1.1.1.）&lt;/li&gt;
&lt;li&gt;支持通过 frontmatter 的 &lt;code&gt;tocNumbering: false&lt;/code&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;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 我的文章&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tocNumbering&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt; # 关闭目录编号（默认为 true）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;默认情况下，所有文章的目录都会显示层级编号&lt;/li&gt;
&lt;li&gt;设置 &lt;code&gt;tocNumbering: false&lt;/code&gt; 可以关闭特定文章的编号显示&lt;/li&gt;
&lt;li&gt;编号通过 CSS 计数器实现，零运行时开销&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;ul&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;ul&gt;
&lt;li&gt;每个标题自动生成 ID&lt;/li&gt;
&lt;li&gt;悬停标题时显示 &lt;code&gt;#&lt;/code&gt; 链接图标&lt;/li&gt;
&lt;li&gt;点击可复制带锚点的 URL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;系列文章导航：&lt;/strong&gt;&lt;/p&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;/ul&gt;
&lt;p&gt;&lt;strong&gt;阅读时间估算：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;文章卡片显示预计阅读时间（基于字数计算）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;移动端文章阅读头部：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在移动端（≤992px）浏览文章时，顶部导航栏会显示专为阅读优化的头部：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;圆形阅读进度&lt;/strong&gt; - 实时显示当前阅读进度的圆形进度条&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;当前章节标题&lt;/strong&gt; - 显示当前所在的 H2/H3 章节标题，切换时带有平滑动画&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可展开目录&lt;/strong&gt; - 点击标题区域可展开完整的文章目录，快速跳转到任意章节&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;特性：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;滚动时自动更新当前章节&lt;/li&gt;
&lt;li&gt;支持 &lt;code&gt;prefers-reduced-motion&lt;/code&gt; 减少动画&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;文章落款&lt;a href=&quot;#文章落款&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;落款用来告诉读者一篇文章是怎么写出来的、读之前要注意什么，比如「手写」「与 AI 合写」「含剧透」「可能已过时」。标记的字典定义在 &lt;code&gt;config/site.yaml&lt;/code&gt; 的 &lt;code&gt;colophon&lt;/code&gt; 段，文章在 frontmatter 里按 id 引用：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 我的文章&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;colophon&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; ai-cowrite&lt;/span&gt;&lt;span&gt; # 直接引用字典里的标记&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; spoiler&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; note&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 含《我推的孩子》第二季剧透&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt; # note 是本篇自己的补充说明&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; icon&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &apos;fa6-solid:mug-hot&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; label&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 两杯咖啡&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt; # 一次性标记，不进字典&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;字典的结构：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;config/site.yaml&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;colophon&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  enabled&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  groups&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    authorship&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      label&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 执笔&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      exclusive&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt; # 互斥组：一篇文章只能选一个&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      placement&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; seal&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; card&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    notice&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      label&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 阅读提示&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      placement&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; banner&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  marks&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    handwritten&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      group&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; authorship&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; ri:quill-pen-line&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      label&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 手写&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      description&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 每个字都是我自己敲的。&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    spoiler&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      group&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; notice&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; ri:eye-off-line&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      label&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 含剧透&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      tone&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; warn&lt;/span&gt;&lt;span&gt; # muted（默认）| accent | warn&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;默认标记&lt;/strong&gt;：&lt;code&gt;handwritten&lt;/code&gt;（手写）、&lt;code&gt;ai-cowrite&lt;/code&gt;（与 AI 合写）、&lt;code&gt;ai-lead&lt;/code&gt;（AI 主笔）属于互斥的「执笔」组；&lt;code&gt;spoiler&lt;/code&gt;（含剧透）、&lt;code&gt;outdated&lt;/code&gt;（可能已过时）属于「阅读提示」组&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;显示位置&lt;/strong&gt;（&lt;code&gt;placement&lt;/code&gt;）：&lt;code&gt;meta&lt;/code&gt; 封面信息行、&lt;code&gt;banner&lt;/code&gt; 正文前的提示条、&lt;code&gt;seal&lt;/code&gt; 文末落款、&lt;code&gt;card&lt;/code&gt; 文章列表卡片。标记上的设置优先于分组&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;图标&lt;/strong&gt;：只能使用 &lt;code&gt;ri&lt;/code&gt;、&lt;code&gt;fa6-solid&lt;/code&gt;、&lt;code&gt;fa6-regular&lt;/code&gt;、&lt;code&gt;gg&lt;/code&gt; 四套 Iconify 图标，一次性标记也一样&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多语言&lt;/strong&gt;：在 &lt;code&gt;config/i18n-content.yaml&lt;/code&gt; 的 &lt;code&gt;&amp;lt;locale&amp;gt;.colophon&lt;/code&gt; 下覆盖分组和标记的文案&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;默认标记&lt;/strong&gt;（&lt;code&gt;defaults&lt;/code&gt;）：文章没有某一组的标记时自动补上，主题默认 &lt;code&gt;defaults: [handwritten]&lt;/code&gt;，没写执笔的文章都显示「手写」。不想显示任何标记的文章写 &lt;code&gt;colophon: []&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;删掉整个 &lt;code&gt;colophon&lt;/code&gt; 配置段即可关闭此功能&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;站内的示例文章：《我推的孩子》第二季观后感（手写 + 含剧透）、Tailwind CSS v4 升级笔记（可能已过时）、一篇 Markdown 在构建时经过了什么（AI 主笔）、容器查询实战（与 AI 合写 + 一次性标记）。&lt;/p&gt;
&lt;h3&gt;文章操作：复制 Markdown 与在写作室打开&lt;a href=&quot;#文章操作复制-markdown-与在写作室打开&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;文章页面包屑右侧有一组操作按钮：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;复制 Markdown&lt;/strong&gt;：复制整篇文章的原始 Markdown，包括 frontmatter&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;下载&lt;/strong&gt;：把原文保存为 &lt;code&gt;.md&lt;/code&gt; 文件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;在写作室打开&lt;/strong&gt;：在写作室里打开这篇文章继续编辑&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;config/site.yaml&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;postActions&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  copyMarkdown&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  downloadMarkdown&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  openInEditor&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; everyone&lt;/span&gt;&lt;span&gt; # off | dev | everyone&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;openInEditor&lt;/code&gt; 的三个取值：&lt;code&gt;off&lt;/code&gt; 不显示；&lt;code&gt;dev&lt;/code&gt; 只在本地开发服务器显示；&lt;code&gt;everyone&lt;/code&gt; 对所有访客显示，访客打开的是一份浏览器里的草稿副本，不会改动博客本身。这个按钮还要求 &lt;code&gt;editor.enabled: true&lt;/code&gt;，写作室没开启时不会出现。&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;设置了 &lt;code&gt;password&lt;/code&gt; 的整篇加密文章，以及正文里含 &lt;code&gt;:::encrypted&lt;/code&gt; 局部加密块的文章，都不提供原文，也不显示这些按钮，避免明文和密码随源文件公开。&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;响应式设计&lt;a href=&quot;#响应式设计&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&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;li&gt;悬浮目录&lt;/li&gt;
&lt;/ul&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;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;li&gt;折叠式目录&lt;/li&gt;
&lt;li&gt;触摸优化的交互&lt;/li&gt;
&lt;li&gt;文章页专属阅读头部（进度圈 + 当前标题 + 可展开目录）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;特色功能&lt;a href=&quot;#特色功能&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;系列文章系统&lt;a href=&quot;#系列文章系统&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;featuredSeries&lt;/code&gt; 支持配置多个系列，每个系列会自动生成独立页面：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;专属系列页面&lt;/strong&gt; (&lt;code&gt;/{slug}&lt;/code&gt;)：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每个启用的系列都有独立页面（如 &lt;code&gt;/weekly&lt;/code&gt;、&lt;code&gt;/reading&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;显示该系列的所有文章&lt;/li&gt;
&lt;li&gt;系列头图和介绍&lt;/li&gt;
&lt;li&gt;相关链接（GitHub, RSS 等）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;首页展示：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;设置 &lt;code&gt;highlightOnHome: true&lt;/code&gt; 的系列，其最新文章会在首页高亮显示&lt;/li&gt;
&lt;li&gt;设置 &lt;code&gt;highlightOnHome: false&lt;/code&gt; 的系列不在首页展示&lt;/li&gt;
&lt;li&gt;所有系列文章独立于普通文章列表&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;设计说明：分离关注点&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;featuredSeries 的设计初衷是&lt;strong&gt;将高产出分类从首页分离&lt;/strong&gt;，避免首页被单一类型文章刷屏。适用场景：&lt;/p&gt;
&lt;ul&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;&lt;strong&gt;首页行为&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;系列文章从首页主列表排除&lt;/li&gt;
&lt;li&gt;设置 &lt;code&gt;highlightOnHome: true&lt;/code&gt; 时，最新一篇在首页顶部高亮&lt;/li&gt;
&lt;li&gt;其余文章通过系列专属页面（如 &lt;code&gt;/weekly&lt;/code&gt;）访问&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;其他页面正常展示&lt;/strong&gt;：系列文章在归档、分类、标签、搜索等页面仍与普通文章一起显示，仅首页主列表做了分离。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;配置示例：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;featuredSeries&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; slug&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; weekly&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    categoryName&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 周刊&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    highlightOnHome&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt; # 首页展示最新周刊&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    # ...&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; slug&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; reading&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    categoryName&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 书摘&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    highlightOnHome&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt; # 不在首页展示&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    # ...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;归档页面&lt;a href=&quot;#归档页面&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;访问 &lt;code&gt;/archives&lt;/code&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;h3&gt;友链系统&lt;a href=&quot;#友链系统&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;访问 &lt;code&gt;/friends&lt;/code&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;li&gt;支持头像、名称、描述、链接&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;LQIP（低质量图片占位符）&lt;a href=&quot;#lqip低质量图片占位符&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;LQIP（Low Quality Image Placeholder）是一种图片加载优化技术，在高清图片加载完成前，先显示一个低质量的占位符，避免页面出现空白或布局抖动。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;特性：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🎨 构建时自动提取图片主色调，生成 CSS 渐变占位符&lt;/li&gt;
&lt;li&gt;⚡ 零运行时开销 —— 纯 CSS 实现，无需 JavaScript 解码&lt;/li&gt;
&lt;li&gt;📦 极小数据体积 —— 每张图片仅需 18 字符存储&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;ul&gt;
&lt;li&gt;文章卡片封面 (&lt;code&gt;PostItemCard&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;页面横幅 (&lt;code&gt;Cover&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;分类卡片背景 (&lt;code&gt;CategoryCards&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;系列封面 (&lt;code&gt;SeriesCover&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;侧边栏头像 (&lt;code&gt;HomeInfo&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;使用方式：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 生成 LQIP 数据（处理 public/img/ 下所有图片）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; generate:lqips&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;生成效果：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;LQIP 数据保存在 &lt;code&gt;src/assets/lqips.json&lt;/code&gt;，格式如下：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;cover/1.webp&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;87a3c4c2dfefbddae9&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;cover/2.webp&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;6e3b38ae7472af7574&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;每个值是 18 个十六进制字符（3 个颜色），运行时解码为 CSS 渐变：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;linear-gradient(135deg&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; #&lt;/span&gt;&lt;span&gt;87a3c4 0%&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; #&lt;/span&gt;&lt;span&gt;c2dfef&lt;/span&gt;&lt;span&gt; 50%&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; #&lt;/span&gt;&lt;span&gt;bddae9&lt;/span&gt;&lt;span&gt; 100%)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;原理：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用 sharp 将图片缩放到 2×2 像素&lt;/li&gt;
&lt;li&gt;提取四象限的平均色（左上、右上、左下、右下）&lt;/li&gt;
&lt;li&gt;选取 3 个颜色生成 135 度斜向渐变&lt;/li&gt;
&lt;li&gt;存储为紧凑的十六进制字符串&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;在组件中使用：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; getLqipStyle&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; getLqipProps &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from&lt;/span&gt;&lt;span&gt; &apos;@lib/lqip&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// 方式 1：直接获取样式字符串&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; style &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; getLqipStyle&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;/img/cover/1.webp&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// 返回: &quot;background-image:linear-gradient(...)&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// 方式 2：获取完整的 props（支持外部图片降级）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; lqipProps &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; getLqipProps&lt;/span&gt;&lt;span&gt;(coverUrl)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// 本地图片返回: { style: &quot;background-image:...&quot; }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// 外部图片返回: { class: &quot;lqip-fallback&quot; }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; style&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;lt;&lt;/span&gt;&lt;span&gt;img&lt;/span&gt;&lt;span&gt; src&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;/img/cover/1.webp&quot;&lt;/span&gt;&lt;span&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;注意事项：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;生成的 &lt;code&gt;src/assets/lqips.json&lt;/code&gt; 需要提交到 git&lt;/li&gt;
&lt;li&gt;添加新图片后需要重新运行 &lt;code&gt;pnpm generate:lqips&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;外部图片（http/https 开头）会自动使用纯色占位符降级&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;相关文章推荐&lt;a href=&quot;#相关文章推荐&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;参考 &lt;a href=&quot;https://alexop.dev/posts/semantic-related-posts-astro-transformersjs/&quot;&gt;No Server, No Database: Smarter Related Posts in Astro with &lt;code&gt;transformers.js&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;基于语义相似度的智能文章推荐系统，使用 &lt;a href=&quot;https://huggingface.co/docs/transformers.js&quot;&gt;transformers.js&lt;/a&gt; 在本地生成文章嵌入向量，计算文章间的语义相似度。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;特性：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🧠 基于 AI 嵌入模型（Snowflake Arctic Embed）的语义理解&lt;/li&gt;
&lt;li&gt;📊 自动计算文章间的相似度，推荐最相关的 5 篇文章&lt;/li&gt;
&lt;li&gt;🚀 构建时预计算，运行时零开销&lt;/li&gt;
&lt;li&gt;🔧 支持通过 frontmatter 排除特定文章&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;使用方式：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 生成相似度数据（本地运行，会自动下载模型，约需 3-5 分钟）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; generate:similarities&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 生成的文件会提交到 git，Vercel 等平台直接使用&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;排除特定文章：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在文章 frontmatter 中设置 &lt;code&gt;excludeFromSummary: true&lt;/code&gt; 可排除该文章：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 周刊第 1 期&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;excludeFromSummary&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt; # 排除此文章的相似度计算和 AI 摘要生成&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;提示&lt;/strong&gt;：系列文章（如周刊）通常建议设置 &lt;code&gt;excludeFromSummary: true&lt;/code&gt;，避免影响其他文章的推荐质量。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;配置计算内容：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;可以选择是否将文章正文纳入相似度计算：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;// true: 使用 标题 + 描述 + 正文（更准确，速度较慢）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// false: 仅使用 标题 + 描述（更快，适合文章数量较多的情况）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; INCLUDE_BODY &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&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;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 使用 Snowflake/snowflake-arctic-embed-m-v2.0 计算 168 篇文章（标题+描述）的时间&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Done!&lt;/span&gt;&lt;span&gt; Generated&lt;/span&gt;&lt;span&gt; similarities&lt;/span&gt;&lt;span&gt; for&lt;/span&gt;&lt;span&gt; 168&lt;/span&gt;&lt;span&gt; posts&lt;/span&gt;&lt;span&gt; in&lt;/span&gt;&lt;span&gt; 4.1s&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 使用 Snowflake/snowflake-arctic-embed-m-v2.0 计算 168 篇文章（标题+描述+正文）的时间&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Done!&lt;/span&gt;&lt;span&gt; Generated&lt;/span&gt;&lt;span&gt; similarities&lt;/span&gt;&lt;span&gt; for&lt;/span&gt;&lt;span&gt; 168&lt;/span&gt;&lt;span&gt; posts&lt;/span&gt;&lt;span&gt; in&lt;/span&gt;&lt;span&gt; 219.3s&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这差别有点大，但是我个人很喜欢带正文的结果，效果显然会更好。所以索性再加一个跑 AI 总结的功能。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;模型选择：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;默认使用 &lt;code&gt;Snowflake/snowflake-arctic-embed-m-v2.0&lt;/code&gt; 模型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;模型大小&lt;/strong&gt;：约 90MB（首次运行会自动下载到 &lt;code&gt;.cache/transformers&lt;/code&gt; 目录）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;向量维度&lt;/strong&gt;：768 维&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能&lt;/strong&gt;：平衡了质量和速度，适合中文和英文内容&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生成时间&lt;/strong&gt;：约 3-5 分钟（169 篇文章）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如需更换模型，编辑 &lt;code&gt;src/scripts/generateSimilarities.ts&lt;/code&gt; 中的 &lt;code&gt;MODEL_NAME&lt;/code&gt;：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; MODEL_NAME &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &quot;Snowflake/snowflake-arctic-embed-m-v2.0&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// 可选替代方案：&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// const MODEL_NAME = &apos;sentence-transformers/all-MiniLM-L6-v2&apos;; // 更小更快（约 23MB），384 维&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// const MODEL_NAME = &apos;BAAI/bge-small-zh-v1.5&apos;;  // 针对中文优化&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;其他可选模型对比：&lt;/strong&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;th&gt;优势&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Snowflake/snowflake-arctic-embed-m-v2.0&lt;/code&gt;&lt;/td&gt;&lt;td&gt;~90MB&lt;/td&gt;&lt;td&gt;768&lt;/td&gt;&lt;td&gt;质量高，中英文均衡&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;sentence-transformers/all-MiniLM-L6-v2&lt;/code&gt;&lt;/td&gt;&lt;td&gt;~23MB&lt;/td&gt;&lt;td&gt;384&lt;/td&gt;&lt;td&gt;轻量快速&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;BAAI/bge-small-zh-v1.5&lt;/code&gt;&lt;/td&gt;&lt;td&gt;~95MB&lt;/td&gt;&lt;td&gt;512&lt;/td&gt;&lt;td&gt;中文专用&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;注意事项：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;需要本地运行生成脚本（Vercel 等平台无法运行模型）&lt;/li&gt;
&lt;li&gt;生成的 &lt;code&gt;src/assets/similarities.json&lt;/code&gt; 需要提交到 git&lt;/li&gt;
&lt;li&gt;如果没有生成相似度文件，相关文章模块不会显示&lt;/li&gt;
&lt;li&gt;模型文件会缓存在 &lt;code&gt;.cache/transformers&lt;/code&gt; 目录（已添加到 &lt;code&gt;.gitignore&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;AI 自动摘要&lt;a href=&quot;#ai-自动摘要&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;基于 &lt;a href=&quot;https://huggingface.co/docs/transformers.js&quot;&gt;transformers.js&lt;/a&gt; 的智能摘要生成系统，使用先进的 AI 模型为文章自动生成高质量摘要。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;与相关文章推荐的关系：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AI 摘要功能与相关文章推荐功能相辅相成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;相似度计算&lt;/strong&gt;需要读取文章全文，计算成本较高（约 3-5 分钟）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 摘要&lt;/strong&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;ul&gt;
&lt;li&gt;🤖 基于先进的文本生成模型（Xenova/LaMini-Flan-T5-783M）&lt;/li&gt;
&lt;li&gt;📝 自动为缺少描述的文章生成摘要&lt;/li&gt;
&lt;li&gt;✨ 文章详情页支持打字机动画展示，增强阅读体验&lt;/li&gt;
&lt;li&gt;🎯 智能 fallback：优先使用手写 description，无描述时自动使用 AI 摘要&lt;/li&gt;
&lt;li&gt;🚀 构建时预生成，运行时零开销&lt;/li&gt;
&lt;li&gt;♿ 支持无障碍访问和 prefers-reduced-motion&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;使用方式：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 生成 AI 摘要（本地运行，首次会下载模型，约需 5-10 分钟）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; generate:summaries&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 生成的文件要提交到 git，然后可以在 Vercel 等平台直接使用&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;生成效果：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AI 摘要会保存在 &lt;code&gt;src/assets/summaries.json&lt;/code&gt; 文件中，格式如下：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;article-slug&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;文章标题&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;&lt;/span&gt;&lt;span&gt;summary&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;AI 生成的摘要内容...&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;在哪里使用：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;文章详情页&lt;/strong&gt;：面包屑导航下方显示可折叠的 AI 摘要卡片&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;默认收起状态，点击&quot;展开&quot;按钮触发&lt;/li&gt;
&lt;li&gt;展开后以打字机动画逐字显示摘要内容&lt;/li&gt;
&lt;li&gt;打字机动画仅播放一次，支持 &lt;code&gt;prefers-reduced-motion&lt;/code&gt; 用户偏好&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;文章卡片&lt;/strong&gt;：作为描述的 fallback&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;优先级：手写 &lt;code&gt;description&lt;/code&gt; &amp;gt; AI 摘要 &amp;gt; Markdown 前 150 字&lt;/li&gt;
&lt;li&gt;在文章列表、首页、分类页等处自动使用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;模型选择：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;默认使用 &lt;code&gt;Xenova/LaMini-Flan-T5-783M&lt;/code&gt; 模型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;模型大小&lt;/strong&gt;：约 300MB（首次运行会自动下载到 &lt;code&gt;.cache/transformers&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;：约 5-10 分钟（169 篇文章）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如需更换模型，编辑 &lt;code&gt;src/scripts/generateSummaries.ts&lt;/code&gt; 中的 &lt;code&gt;MODEL_NAME&lt;/code&gt;：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; MODEL_NAME &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &quot;Xenova/LaMini-Flan-T5-783M&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// 可选替代方案：&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// const MODEL_NAME = &apos;Xenova/distilbart-cnn-6-6&apos;; // 更快，英文效果好&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// const MODEL_NAME = &apos;facebook/bart-large-cnn&apos;;   // 质量更高，但速度较慢&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;配置提示词：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;可以自定义生成摘要的提示词，编辑 &lt;code&gt;src/scripts/generateSummaries.ts&lt;/code&gt; 中的 &lt;code&gt;PROMPT_TEMPLATE&lt;/code&gt;：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; PROMPT_TEMPLATE&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; string&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; content&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; string&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  `请为以下文章生成一段简洁的摘要（100-150字）：&lt;/span&gt;&lt;span&gt;\n\n&lt;/span&gt;&lt;span&gt;标题：&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;\n\n&lt;/span&gt;&lt;span&gt;内容：&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;content&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;注意事项：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;需要本地运行生成脚本（Vercel 等平台无法运行大模型）&lt;/li&gt;
&lt;li&gt;生成的 &lt;code&gt;src/assets/summaries.json&lt;/code&gt; 需要提交到 git&lt;/li&gt;
&lt;li&gt;如果没有生成摘要文件，会自动 fallback 到 Markdown 文本提取&lt;/li&gt;
&lt;li&gt;模型文件会缓存在 &lt;code&gt;.cache/transformers&lt;/code&gt; 目录（已添加到 &lt;code&gt;.gitignore&lt;/code&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;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;与相似度计算配合使用&lt;/strong&gt;：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 先生成摘要&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; generate:summaries&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 再计算相似度（可以使用摘要代替全文，提升速度）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; generate:similarities&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;选择性生成摘要&lt;/strong&gt;：为了节省时间，脚本会跳过已有 &lt;code&gt;description&lt;/code&gt; 的文章&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;提交到版本控制&lt;/strong&gt;：将生成的 JSON 文件提交到 git，避免在 CI/CD 环境重复生成&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;圣诞特辑&lt;a href=&quot;#圣诞特辑&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&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;雪花飘落 —— Canvas 实现的雪花动画，分前景和背景两层，支持视差效果&lt;/li&gt;
&lt;li&gt;圣诞配色 —— 红绿金主题色替换默认粉蓝配色，支持深色/浅色模式&lt;/li&gt;
&lt;li&gt;圣诞帽装饰 —— 侧边栏头像上的圣诞帽&lt;/li&gt;
&lt;li&gt;圣诞灯串 —— Header 顶部的装饰灯串动画&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;code&gt;config/site.yaml&lt;/code&gt; 中的 &lt;code&gt;christmas&lt;/code&gt; 配置：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;christmas&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  enabled&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt; # 总开关&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  features&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    snowfall&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt; # 雪花飘落&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    christmasColorScheme&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt; # 圣诞配色&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    christmasCoverDecoration&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt; # 灯串装饰&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    christmasHat&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt; # 圣诞帽&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    readingTimeSnow&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt; # 阅读时间雪花特效&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  snowfall&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    speed&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 0.5&lt;/span&gt;&lt;span&gt; # 飘落速度（默认 0.5）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    intensity&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 0.7&lt;/span&gt;&lt;span&gt; # 桌面端雪花密度（0-1）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    mobileIntensity&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 0.4&lt;/span&gt;&lt;span&gt; # 移动端雪花密度（0-1）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    maxLayers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 6&lt;/span&gt;&lt;span&gt; # 最大雪花层数&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    maxIterations&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 8&lt;/span&gt;&lt;span&gt; # 最大迭代次数&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    mobileMaxLayers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 4&lt;/span&gt;&lt;span&gt; # 移动端最大层数&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    mobileMaxIterations&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 6&lt;/span&gt;&lt;span&gt; # 移动端最大迭代次数&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;用户偏好自动保存到 localStorage，跨会话保持&lt;/li&gt;
&lt;li&gt;支持 &lt;code&gt;prefers-reduced-motion&lt;/code&gt; 偏好，自动禁用动画&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;技术实现：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;雪花使用 Canvas 2D 渲染，分层实现视差效果&lt;/li&gt;
&lt;li&gt;配色通过 CSS 变量覆盖，零运行时开销&lt;/li&gt;
&lt;li&gt;状态管理使用 nanostores，支持跨组件同步&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;code&gt;christmasConfig.enabled = false&lt;/code&gt; 即可完全关闭所有圣诞特效。&lt;/p&gt;
&lt;h3&gt;站点公告系统&lt;a href=&quot;#站点公告系统&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&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;Toast 通知 —— 右下角浮动通知，支持多条堆叠显示&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;/li&gt;
&lt;li&gt;Hover 已读 —— 悬停 Toast 1 秒后自动标记已读&lt;/li&gt;
&lt;li&gt;已读追踪 —— localStorage 记录已读状态，返回访问不重复弹出&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;code&gt;config/site.yaml&lt;/code&gt; 添加公告：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;announcements&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; welcome-2026&lt;/span&gt;&lt;span&gt; # 唯一标识&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 2026 年新年快乐!&lt;/span&gt;&lt;span&gt; # 公告标题&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    content&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 新年快乐! 感谢大家一直以来的支持~&lt;/span&gt;&lt;span&gt; # 公告内容&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; info&lt;/span&gt;&lt;span&gt; # 类型：info | warning | success | important&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    priority&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 300&lt;/span&gt;&lt;span&gt; # 优先级（越高越先显示）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    color&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;#ED788C&quot;&lt;/span&gt;&lt;span&gt; # 自定义颜色（可选，覆盖 type 默认色）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    publishDate&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;2026-01-01&quot;&lt;/span&gt;&lt;span&gt; # 显示日期（可选，用于时间线展示）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    startDate&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;2025-12-31T00:00:00+08:00&quot;&lt;/span&gt;&lt;span&gt; # 开始日期（可选）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    endDate&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;2026-01-15T23:59:59+08:00&quot;&lt;/span&gt;&lt;span&gt; # 结束日期（可选）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; site-update-01&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 站点更新公告&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    content&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 新增站点公告系统，现在支持多条公告同时显示！&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; info&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    priority&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 500&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    color&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;#6366F1&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    publishDate&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;2025-01-02&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;如果需要添加链接（可选）：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;announcements&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; example-with-link&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 示例公告&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    content&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 公告内容&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; info&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    link&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      url&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; https://example.com&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      text&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 了解更多&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      external&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;公告类型样式：&lt;/strong&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;code&gt;info&lt;/code&gt;&lt;/td&gt;&lt;td&gt;信息通知&lt;/td&gt;&lt;td&gt;蓝色 (#3b82f6)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;warning&lt;/code&gt;&lt;/td&gt;&lt;td&gt;警告提示&lt;/td&gt;&lt;td&gt;黄色 (#eab308)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;success&lt;/code&gt;&lt;/td&gt;&lt;td&gt;成功消息&lt;/td&gt;&lt;td&gt;绿色 (#22c55e)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;important&lt;/code&gt;&lt;/td&gt;&lt;td&gt;重要公告&lt;/td&gt;&lt;td&gt;红色 (#ef4444)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;设置 &lt;code&gt;color&lt;/code&gt; 字段可覆盖上述默认颜色&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;交互流程：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;首次访问&lt;/strong&gt;：0.5 秒后自动弹出未读公告 Toast（多条堆叠显示）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hover 已读&lt;/strong&gt;：悬停在 Toast 上 1 秒后自动标记已读&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;手动关闭&lt;/strong&gt;：点击 Dismiss 关闭 Toast&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;点击&quot;View all&quot;&lt;/strong&gt;：关闭所有 Toast，打开时间线弹窗&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;
&lt;p&gt;&lt;strong&gt;注意事项：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;公告 &lt;code&gt;id&lt;/code&gt; 必须唯一，用于追踪已读状态&lt;/li&gt;
&lt;li&gt;省略 &lt;code&gt;startDate&lt;/code&gt; 表示立即生效，省略 &lt;code&gt;endDate&lt;/code&gt; 表示永不过期&lt;/li&gt;
&lt;li&gt;&lt;code&gt;publishDate&lt;/code&gt; 用于时间线弹窗中的日期显示，省略时使用 &lt;code&gt;startDate&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;过期公告建议从配置中删除，保持配置简洁&lt;/li&gt;
&lt;li&gt;已读状态存储在 localStorage，key 为 &lt;code&gt;announcement-read-ids:v1&lt;/code&gt;（旧 key 会自动迁移）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Markdown 增强&lt;a href=&quot;#markdown-增强&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;语法支持：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub Flavored Markdown (GFM)
&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Mermaid 图表：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;支持在 Markdown 中使用 Mermaid 语法绘制流程图、时序图、架构图等。&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;span&gt;mermaid&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    A[构建时脚本] --&amp;gt; B[JSON 数据文件] --&amp;gt; C[运行时工具函数]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;pre&gt;flowchart LR
    A[构建时脚本] --&amp;gt; B[JSON 数据文件] --&amp;gt; C[运行时工具函数]&lt;/pre&gt;
&lt;p&gt;支持的图表类型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;flowchart&lt;/code&gt; / &lt;code&gt;graph&lt;/code&gt; - 流程图&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sequenceDiagram&lt;/code&gt; - 时序图&lt;/li&gt;
&lt;li&gt;&lt;code&gt;classDiagram&lt;/code&gt; - 类图&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stateDiagram&lt;/code&gt; - 状态图&lt;/li&gt;
&lt;li&gt;&lt;code&gt;erDiagram&lt;/code&gt; - ER 图&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gantt&lt;/code&gt; - 甘特图&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pie&lt;/code&gt; - 饼图&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mindmap&lt;/code&gt; - 思维导图&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;图表会自动跟随深色/浅色主题切换。更多语法参考 &lt;a href=&quot;https://mermaid.js.org/&quot;&gt;Mermaid 官方文档&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Infographic 信息图：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;支持使用 &lt;a href=&quot;https://infographic.antv.vision/&quot;&gt;@antv/infographic&lt;/a&gt; 在 Markdown 中绘制精美的信息图表，适合展示流程、对比、层级、统计等数据。&lt;/p&gt;
&lt;p&gt;使用方式：在代码块中使用 &lt;code&gt;infographic&lt;/code&gt; 标记，第一行指定模板名称，然后使用类似 YAML 的语法定义数据：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;span&gt;infographic&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;infographic list-grid-badge-card&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  title 技术栈&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  desc 我的常用技术栈&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  items&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label TypeScript&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 类型安全的 JavaScript&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon mdi/language-typescript&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label React&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 用户界面库&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon mdi/react&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label Astro&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 现代化静态站点生成器&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon mdi/rocket-launch&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;infographic list-grid-badge-card&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  title 技术栈&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  desc 我的常用技术栈&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  items&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label TypeScript&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 类型安全的 JavaScript&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon mdi/language-typescript&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label React&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 用户界面库&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon mdi/react&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label Astro&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 现代化静态站点生成器&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      icon mdi/rocket-launch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;可用模板类型：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;列表类&lt;/strong&gt; (&lt;code&gt;list-*&lt;/code&gt;)：展示信息列表&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;list-grid-badge-card&lt;/code&gt; - 卡片网格布局&lt;/li&gt;
&lt;li&gt;&lt;code&gt;list-grid-candy-card-lite&lt;/code&gt; - 糖果风格卡片&lt;/li&gt;
&lt;li&gt;&lt;code&gt;list-row-horizontal-icon-arrow&lt;/code&gt; - 水平图标箭头列表&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;流程/顺序类&lt;/strong&gt; (&lt;code&gt;sequence-*&lt;/code&gt;)：展示步骤、流程或阶段&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sequence-zigzag-steps-underline-text&lt;/code&gt; - 之字形步骤&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sequence-circular-simple&lt;/code&gt; - 圆形流程&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sequence-roadmap-vertical-simple&lt;/code&gt; - 垂直路线图&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sequence-pyramid-simple&lt;/code&gt; - 金字塔结构&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;对比类&lt;/strong&gt; (&lt;code&gt;compare-*&lt;/code&gt;)：二元或多元对比&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;compare-binary-horizontal-simple-fold&lt;/code&gt; - 水平二元对比&lt;/li&gt;
&lt;li&gt;&lt;code&gt;compare-swot&lt;/code&gt; - SWOT 分析&lt;/li&gt;
&lt;li&gt;&lt;code&gt;compare-hierarchy-left-right-circle-node-pill-badge&lt;/code&gt; - 层级左右对比&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;层级类&lt;/strong&gt; (&lt;code&gt;hierarchy-*&lt;/code&gt;)：展示树形结构&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hierarchy-tree-tech-style-capsule-item&lt;/code&gt; - 科技风格树形图&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hierarchy-tree-curved-line-rounded-rect-node&lt;/code&gt; - 曲线连接树形图&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;图表类&lt;/strong&gt; (&lt;code&gt;chart-*&lt;/code&gt;)：数据可视化&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;chart-column-simple&lt;/code&gt; - 柱状图&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chart-bar-plain-text&lt;/code&gt; - 条形图&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chart-pie-plain-text&lt;/code&gt; - 饼图&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chart-line-plain-text&lt;/code&gt; - 折线图&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;其他&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;quadrant-*&lt;/code&gt; - 象限分析图&lt;/li&gt;
&lt;li&gt;&lt;code&gt;relation-*&lt;/code&gt; - 关系图&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;数据字段说明：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;title&lt;/code&gt; - 标题（可选）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;desc&lt;/code&gt; - 描述文本（可选）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;items&lt;/code&gt; - 条目数组，每个条目可包含：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;label&lt;/code&gt; - 主标签文本&lt;/li&gt;
&lt;li&gt;&lt;code&gt;value&lt;/code&gt; - 数值（用于图表类模板）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;desc&lt;/code&gt; - 描述文本&lt;/li&gt;
&lt;li&gt;&lt;code&gt;icon&lt;/code&gt; - 图标名称（格式：&lt;code&gt;mdi/icon-name&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;children&lt;/code&gt; - 子条目（用于层级结构）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;主题定制：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;可以在数据后添加 &lt;code&gt;theme&lt;/code&gt; 块自定义颜色：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;span&gt;infographic&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;infographic sequence-pyramid-simple&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  items&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 基础层&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 中间层&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 顶层&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;theme&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  palette&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - #3b82f6&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - #8b5cf6&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - #f97316&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;信息图会自动跟随深色/浅色主题切换，并使用项目的寒蝉全圆体字体渲染。更多模板和语法参考 &lt;a href=&quot;https://infographic.antv.vision/&quot;&gt;Infographic 官方文档&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;代码高亮：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基于 Shiki&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;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;span&gt;javascript&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; hello&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Hello, world!&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; hello&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Hello, world!&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;标题自动链接：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;所有标题自动生成可点击的锚点链接。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;链接自动嵌入：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;独行的特殊链接会自动转换为嵌入组件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Twitter/X 链接&lt;/strong&gt;：自动嵌入 Tweet 组件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CodePen 链接&lt;/strong&gt;：自动嵌入交互式 CodePen 演示&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;其他链接&lt;/strong&gt;：显示 OG 预览卡片（包含标题、描述、图片等）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&amp;lt;!-- 独行链接会被嵌入 --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;https://x.com/vercel_dev/status/1997059920936775706&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;https://codepen.io/botteu/pen/YPKBrJX/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;https://github.com/vercel/react-tweet&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;反爬严格，获取不到元信息的链接&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;https://zhuanlan.zhihu.com/p/1900483903984243480&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;!-- 段落中的链接保持不变 --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这是一个 &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;普通链接&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;https://example.com&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;，不会被嵌入。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;p&gt;
  &lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/botteu/pen/YPKBrJX/&quot;&gt;YPKBrJX&lt;/a&gt; by botteu (&lt;a href=&quot;https://codepen.io/botteu&quot;&gt;@botteu&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;div&gt;
  &lt;a href=&quot;https://github.com/vercel/react-tweet&quot; target=&quot;_blank&quot;&gt;
    &lt;div&gt;
      &lt;div&gt;
        &lt;div&gt;
          &lt;img src=&quot;https://github.com/fluidicon.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
          &lt;span&gt;github.com&lt;/span&gt;
        &lt;/div&gt;
        &lt;div&gt;GitHub - vercel/react-tweet: Embed tweets in your React application.&lt;/div&gt;
        &lt;p&gt;Embed tweets in your React application. Contribute to vercel/react-tweet development by creating an account on GitHub.&lt;/p&gt;
        &lt;div&gt;
          &lt;span&gt;https://github.com/vercel/react-tweet&lt;/span&gt;
           
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;div&gt;&lt;img src=&quot;https://opengraph.githubassets.com/6394b5d1853cd62418c00b9fd6fce7e7fa79f4d2f6a58e05d416bf470a52f8ad/vercel/react-tweet&quot; alt=&quot;GitHub - vercel/react-tweet: Embed tweets in your React application.&quot; loading=&quot;lazy&quot; /&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;反爬严格，获取不到元信息的链接&lt;/p&gt;
&lt;div&gt;
  &lt;a href=&quot;https://zhuanlan.zhihu.com/p/1900483903984243480&quot; target=&quot;_blank&quot;&gt;
    &lt;div&gt;
      &lt;div&gt;
        &lt;div&gt;
          
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;https://zhuanlan.zhihu.com/p/1900483903984243480&lt;/div&gt;
          &lt;div&gt;zhuanlan.zhihu.com&lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      
        
      
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;这是一个 &lt;a href=&quot;https://example.com&quot;&gt;普通链接&lt;/a&gt;，不会被嵌入。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Shoka 兼容 Markdown 语法：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;astro-koharu 从 Hexo Shoka 主题迁移了一套丰富的 Markdown 扩展语法，所有功能均可通过 &lt;code&gt;config/site.yaml&lt;/code&gt; 的 &lt;code&gt;content&lt;/code&gt; 配置项独立开关。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;文字特效（&lt;code&gt;enableShokaEffects&lt;/code&gt;）：&lt;/em&gt;&lt;/p&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;code&gt;++文字++&lt;/code&gt;&lt;/td&gt;&lt;td&gt;下划线&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;ins&amp;gt;&lt;/code&gt; 标签&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;++文字++{.wavy}&lt;/code&gt;&lt;/td&gt;&lt;td&gt;波浪下划线&lt;/td&gt;&lt;td&gt;支持 &lt;code&gt;.wavy&lt;/code&gt; 修饰符&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;++文字++{.dot}&lt;/code&gt;&lt;/td&gt;&lt;td&gt;着重点&lt;/td&gt;&lt;td&gt;支持 &lt;code&gt;.dot&lt;/code&gt; 修饰符&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;++文字++{.primary}&lt;/code&gt;&lt;/td&gt;&lt;td&gt;彩色下划线&lt;/td&gt;&lt;td&gt;支持 &lt;code&gt;.primary&lt;/code&gt; &lt;code&gt;.success&lt;/code&gt; &lt;code&gt;.warning&lt;/code&gt; &lt;code&gt;.danger&lt;/code&gt; &lt;code&gt;.info&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;==文字==&lt;/code&gt;&lt;/td&gt;&lt;td&gt;高亮&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;mark&amp;gt;&lt;/code&gt; 标签&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;~文字~&lt;/code&gt;&lt;/td&gt;&lt;td&gt;下标&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;sub&amp;gt;&lt;/code&gt; 标签，如 H&lt;sub&gt;2&lt;/sub&gt;O&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;^文字^&lt;/code&gt;&lt;/td&gt;&lt;td&gt;上标&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;sup&amp;gt;&lt;/code&gt; 标签，如 E=mc&lt;sup&gt;2&lt;/sup&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;示例效果：&lt;/p&gt;
&lt;p&gt;这是下划线文字 波浪下划线 着重点标记&lt;/p&gt;
&lt;p&gt;主色调 成功 警告 危险 信息&lt;/p&gt;
&lt;p&gt;&lt;mark&gt;这是高亮文字&lt;/mark&gt;&lt;/p&gt;
&lt;p&gt;H&lt;sub&gt;2&lt;/sub&gt;O 是水的化学式，E = mc&lt;sup&gt;2&lt;/sup&gt; 是质能方程&lt;/p&gt;
&lt;p&gt;&lt;em&gt;颜色文字与特殊样式（&lt;code&gt;enableShokaAttrs&lt;/code&gt;）：&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;&lt;span&gt;文字&lt;/span&gt;&lt;/code&gt; 语法为文字添加颜色和样式：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;红色&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.red} &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;粉色&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.pink} &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;橙色&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.orange} &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;黄色&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.yellow}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;绿色&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.green} &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;水色&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.aqua} &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;蓝色&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.blue} &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;紫色&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.purple} &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;灰色&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.grey}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;这段文字会有彩虹渐变效果&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.rainbow}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;Ctrl&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.kbd} + &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;C&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.kbd} 复制，&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;Ctrl&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.kbd} + &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;V&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.kbd} 粘贴&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;默认&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.label .default} &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;主要&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.label .primary} &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;信息&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.label .info}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;成功&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.label .success} &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;警告&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.label .warning} &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;危险&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.label .danger}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;示例效果：&lt;/p&gt;
&lt;p&gt;&lt;span&gt;红色&lt;/span&gt; &lt;span&gt;粉色&lt;/span&gt; &lt;span&gt;橙色&lt;/span&gt; &lt;span&gt;黄色&lt;/span&gt; &lt;span&gt;绿色&lt;/span&gt; &lt;span&gt;水色&lt;/span&gt; &lt;span&gt;蓝色&lt;/span&gt; &lt;span&gt;紫色&lt;/span&gt; &lt;span&gt;灰色&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;这段文字会有彩虹渐变效果&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Ctrl&lt;/span&gt; + &lt;span&gt;C&lt;/span&gt; 复制，&lt;span&gt;Ctrl&lt;/span&gt; + &lt;span&gt;V&lt;/span&gt; 粘贴&lt;/p&gt;
&lt;p&gt;&lt;span&gt;默认&lt;/span&gt; &lt;span&gt;主要&lt;/span&gt; &lt;span&gt;信息&lt;/span&gt; &lt;span&gt;成功&lt;/span&gt; &lt;span&gt;警告&lt;/span&gt; &lt;span&gt;危险&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;隐藏文字 / Spoiler（&lt;code&gt;enableShokaSpoiler&lt;/code&gt;）：&lt;/em&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;这里有一段!!隐藏文字，点击显示!!&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这里有一段!!模糊文字，鼠标悬停显示!!{.blur}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;示例效果：&lt;/p&gt;
&lt;p&gt;这里有一段隐藏文字，点击显示&lt;/p&gt;
&lt;p&gt;这里有一段&lt;span&gt;模糊文字，鼠标悬停显示&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;默认模式：点击后粒子消散动画揭示文字（基于 spoilerjs Web Component）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.blur&lt;/code&gt; 模式：鼠标悬停时模糊消失&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;注音标注 / Ruby（&lt;code&gt;enableShokaRuby&lt;/code&gt;）：&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;为 CJK 文字添加注音，适用于日语假名、汉语拼音等：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{漢字^かんじ}的注音示例&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{取り返す^とりかえす}是日语中&quot;取回&quot;的意思&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;示例效果：&lt;/p&gt;
&lt;p&gt;&lt;ruby&gt;漢字&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;かんじ&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt;的注音示例。&lt;ruby&gt;取り返す&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;とりかえす&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt;是日语中&quot;取回&quot;的意思。&lt;/p&gt;
&lt;p&gt;渲染为 HTML &lt;code&gt;&amp;lt;ruby&amp;gt;&lt;/code&gt; 标签，浏览器原生支持。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;提醒块 / Note Blocks（&lt;code&gt;enableShokaContainers&lt;/code&gt;）：&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;:::&lt;/code&gt; 语法创建不同样式的提醒块：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;:::default&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这是默认提醒块&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::primary&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这是主要提醒块，用于重要提示&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::info&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这是信息提醒块&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::success&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这是成功提醒块&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::warning&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这是警告提醒块&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::danger&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这是危险提醒块&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::info no-icon&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这是没有图标的信息块&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;示例效果：&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;这是信息提醒块，用于提供额外信息&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;这是警告提醒块，请注意&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;这是危险提醒块，务必谨慎&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;支持的样式：&lt;code&gt;default&lt;/code&gt;、&lt;code&gt;primary&lt;/code&gt;、&lt;code&gt;info&lt;/code&gt;、&lt;code&gt;success&lt;/code&gt;、&lt;code&gt;warning&lt;/code&gt;、&lt;code&gt;danger&lt;/code&gt;。添加 &lt;code&gt;no-icon&lt;/code&gt; 可隐藏图标。提醒块内部支持嵌套 Markdown 语法。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;折叠块 / Collapse（&lt;code&gt;enableShokaContainers&lt;/code&gt;）：&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;+++&lt;/code&gt; 语法创建可折叠内容（渲染为 &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; + &lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt;）：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;+++primary 点击展开详细内容&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;折叠的内容，支持 &lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;span&gt;Markdown&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;span&gt; 格式化。&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; 列表项 1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; 列表项 2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;+++&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;+++warning 注意事项&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;需要注意的内容&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;+++&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;+++danger 危险操作&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;请确保你知道自己在做什么！&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;+++&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;示例效果：&lt;/p&gt;

点击展开详细内容
&lt;div&gt;
&lt;p&gt;折叠的内容，支持 &lt;strong&gt;Markdown&lt;/strong&gt; 格式化。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;列表项 1&lt;/li&gt;
&lt;li&gt;列表项 2&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;


注意事项
&lt;div&gt;
&lt;p&gt;需要注意的内容&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;支持的样式：&lt;code&gt;primary&lt;/code&gt;、&lt;code&gt;info&lt;/code&gt;、&lt;code&gt;success&lt;/code&gt;、&lt;code&gt;warning&lt;/code&gt;、&lt;code&gt;danger&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;标签卡 / Tabs（&lt;code&gt;enableShokaContainers&lt;/code&gt;）：&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;;;;&lt;/code&gt; 语法创建标签页切换，同一组 ID 的标签卡会自动组合：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;;;;mygroup JavaScript&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;span&gt;js&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Hello, World!&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;;;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;;;;mygroup Python&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;span&gt;python&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Hello, World!&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;;;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;;;;mygroup Rust&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;span&gt;rust&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Hello, World!&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;;;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;示例效果：&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
JavaScript
Python
Rust
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Hello, World!&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Hello, World!&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    println!&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Hello, World!&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;;;;groupId 标签名&lt;/code&gt; 定义一个标签页，同一 &lt;code&gt;groupId&lt;/code&gt; 的标签自动组合&lt;/li&gt;
&lt;li&gt;第一个标签默认激活&lt;/li&gt;
&lt;li&gt;标签内支持任意 Markdown 内容&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;友链卡片（&lt;code&gt;enableShokaHexoTags&lt;/code&gt;）：&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;{% links %}&lt;/code&gt; 标签在文章中插入友链卡片网格：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{% links %}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; site: 博客名称&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  url: https://example.com&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  owner: 站长昵称&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  desc: 站点描述&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  image: https://example.com/avatar.png&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  color: &apos;#ed788b&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; site: 另一个博客&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  url: https://example2.com&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  owner: Alice&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  desc: 一个热爱技术的博客&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  image: https://api.dicebear.com/7.x/avataaars/svg?seed=Alice&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  color: &apos;#BEDCFF&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{% endlinks %}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;示例效果：&lt;/p&gt;
&lt;div&gt;
&lt;a href=&quot;https://blog.cosine.ren&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.cosine.ren/img/avatar.webp&quot; alt=&quot;余弦の博客&quot; loading=&quot;lazy&quot; /&gt;&lt;div&gt;&lt;div&gt;余弦の博客&lt;/div&gt;&lt;div&gt;FE / ACG / 手工&lt;/div&gt;&lt;/div&gt;&lt;/a&gt;
&lt;a href=&quot;https://example.com&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://api.dicebear.com/7.x/avataaars/svg?seed=Alice&quot; alt=&quot;示例博客&quot; loading=&quot;lazy&quot; /&gt;&lt;div&gt;&lt;div&gt;示例博客&lt;/div&gt;&lt;div&gt;一个热爱技术的博客&lt;/div&gt;&lt;/div&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;卡片数据使用 YAML 格式，支持 &lt;code&gt;site&lt;/code&gt;、&lt;code&gt;url&lt;/code&gt;、&lt;code&gt;owner&lt;/code&gt;、&lt;code&gt;desc&lt;/code&gt;、&lt;code&gt;image&lt;/code&gt;、&lt;code&gt;color&lt;/code&gt; 字段。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;音频播放器（&lt;code&gt;enableShokaHexoTags&lt;/code&gt;）：&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;{% media audio %}&lt;/code&gt; 标签嵌入音频播放器，支持网易云音乐、QQ 音乐等平台（通过 &lt;a href=&quot;https://github.com/metowolf/meting&quot;&gt;Meting&lt;/a&gt; API 解析）。&lt;/p&gt;
&lt;p&gt;默认使用 &lt;code&gt;https://163.hyc.moe/&lt;/code&gt; 作为 Meting API，可在 &lt;code&gt;config/site.yaml&lt;/code&gt; 的 &lt;code&gt;bgm.metingApi&lt;/code&gt; 中自定义，推荐自部署以获得更稳定的服务。&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{% media audio %}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; name: 歌曲名称&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  url: https://music.163.com/#/song?id=3339210292&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{% endmedia %}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;示例效果：&lt;/p&gt;
&lt;div&gt;&lt;/div&gt;
&lt;p&gt;支持歌单模式，可配置多个分组：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{% media audio %}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; title: 歌单名称 1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  list:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    -&lt;/span&gt;&lt;span&gt; https://music.163.com/#/playlist?id=8676645748&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; title: 歌单名称 2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  list:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    -&lt;/span&gt;&lt;span&gt; https://music.163.com/#/playlist?id=17606384886&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{% endmedia %}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;视频播放器（&lt;code&gt;enableShokaHexoTags&lt;/code&gt;）：&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;{% media video %}&lt;/code&gt; 标签嵌入视频播放器：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{% media video %}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; name: 视频 1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  url: https://example.com/video1.mp4&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; name: 视频 2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  url: https://example.com/video2.mp4&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{% endmedia %}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;p&gt;多个视频时自动显示播放列表。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;练习题系统（&lt;code&gt;enableQuiz&lt;/code&gt;）：&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;支持四种交互式题型，适合教程和学习笔记。需在文章 frontmatter 中设置 &lt;code&gt;quiz: true&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;单选题：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; 下列哪个是 JavaScript 的基本数据类型？{.quiz}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; Object{.options}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; Array{.options}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; Symbol{.correct}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; Function{.options}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;gt; 解析：Symbol 是 ES6 引入的基本数据类型。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;示例效果：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;下列哪个是 JavaScript 的基本数据类型？
&lt;ul&gt;
&lt;li&gt;Object&lt;/li&gt;
&lt;li&gt;Array&lt;/li&gt;
&lt;li&gt;Symbol&lt;/li&gt;
&lt;li&gt;Function&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;解析：Symbol 是 ES6 引入的基本数据类型，而 Object、Array、Function 都是引用类型。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;选项标记 &lt;code&gt;&lt;/code&gt; 为正确答案，&lt;code&gt;{.options}&lt;/code&gt; 为干扰项&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;多选题：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; 以下哪些是 CSS 布局方式？{.quiz .multi}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; Flexbox{.correct}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; jQuery{.options}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; Grid{.correct}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; Float{.correct}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;gt; 解析：Flexbox、Grid 和 Float 都是 CSS 布局方式。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;示例效果：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;以下哪些是 CSS 布局方式？
&lt;ul&gt;
&lt;li&gt;Flexbox&lt;/li&gt;
&lt;li&gt;jQuery&lt;/li&gt;
&lt;li&gt;Grid&lt;/li&gt;
&lt;li&gt;Float&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;解析：Flexbox、Grid 和 Float 都是 CSS 布局方式。jQuery 是一个 JavaScript 库。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;添加 &lt;code&gt;.multi&lt;/code&gt; 标记启用多选模式&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;判断题：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; `const`&lt;/span&gt;&lt;span&gt; 声明的变量不能重新赋值，但可以修改其属性。{.quiz .true}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;gt; 解析：&lt;/span&gt;&lt;span&gt;`const`&lt;/span&gt;&lt;span&gt; 只保证变量绑定不可变。&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; HTML 是一种编程语言。{.quiz}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;gt; 解析：HTML 是标记语言，不是编程语言。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;示例效果：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;const&lt;/code&gt; 声明的变量不能重新赋值，但可以修改其属性。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;解析：&lt;code&gt;const&lt;/code&gt; 只保证变量绑定不可变，如果变量指向一个对象，其属性仍然可以修改。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;HTML 是一种编程语言。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;解析：HTML（超文本标记语言）是一种标记语言，不是编程语言。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;添加 &lt;code&gt;.true&lt;/code&gt; 表示陈述正确，不添加 &lt;code&gt;.true&lt;/code&gt; 则表示错误&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;填空题：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; CSS 中，&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;Flexbox&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.gap} 适合一维布局，&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;Grid&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.gap} 适合二维布局。{.quiz .fill}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;gt; 常见错误：&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;Float&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;{.mistake}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;示例效果：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CSS 中，&lt;span&gt;Flexbox&lt;/span&gt; 适合一维布局，&lt;span&gt;Grid&lt;/span&gt; 适合二维布局。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;常见错误：&lt;span&gt;Float&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[答案]&lt;/code&gt; 标记正确答案（支持多个空）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[错误答案]&lt;/code&gt; 标记常见错误（首次答错时提示）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;gt;&lt;/code&gt; 引用块内容为解析说明&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;数学公式（&lt;code&gt;enableMath&lt;/code&gt;）：&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;基于 KaTeX 渲染数学公式。需在文章 frontmatter 中设置 &lt;code&gt;math: true&lt;/code&gt;：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;行内公式：$E = mc^2$&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;块级公式：&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$$&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$$&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;示例效果：&lt;/p&gt;
&lt;p&gt;行内公式：&lt;span&gt;&lt;span&gt;E=mc2E = mc^2&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;E&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;块级公式：&lt;/p&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;∑n=1∞1n2=π26\sum_{n=1}^{\infty} \frac{1}{n^2} = \frac{\pi^2}{6}&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;∑&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;∞&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;π&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;em&gt;代码块增强（&lt;code&gt;enableCodeMeta&lt;/code&gt;）：&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;代码块支持额外的元数据标注：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;span&gt;js title=&quot;hello.js&quot; url=&quot;https://example.com&quot; linkText=&quot;查看源码&quot; mark:1,3&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; greeting &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;Hello&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; name &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;World&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;greeting&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;!`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;span&gt;bash command:(&quot;$&quot;:1-3)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; astro&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; dev&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; build&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;title=&quot;文件名&quot;&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=&quot;链接&quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;添加外部源码链接&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;linkText=&quot;文字&quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;自定义链接文字（默认为 URL）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;mark:1,3&lt;/code&gt;&lt;/td&gt;&lt;td&gt;高亮指定行&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;command:(&quot;$&quot;:1-3)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;标记 shell 命令行（显示 &lt;code&gt;$&lt;/code&gt; 前缀）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;示例效果：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;hello.js&lt;/span&gt;&lt;span&gt;查看源码&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; greeting &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;Hello&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; name &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;World&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;greeting&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;!`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; astro&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; dev&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; build&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Shoka 功能配置总览：&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;所有 Shoka 兼容功能均可在 &lt;code&gt;config/site.yaml&lt;/code&gt; 的 &lt;code&gt;content&lt;/code&gt; 部分独立开关：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;content&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  # Shoka 兼容功能（默认全部启用，设为 false 可关闭）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  enableShokaContainers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;   # :::提醒块 ;;;标签卡 +++折叠块&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  enableShokaAttrs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;        # &lt;span&gt;text&lt;/span&gt; 属性语法&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  enableShokaEffects&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;      # ++下划线++ ==高亮== ~下标~ ^上标^&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  enableShokaSpoiler&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;      # !!隐藏文字!!&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  enableShokaRuby&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;         # {文字^注音} 注音标注&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  enableShokaHexoTags&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;     # {% links %} {% media %} Hexo 标签&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  enableMath&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;              # $数学公式$ KaTeX 渲染&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  enableCodeMeta&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;          # 代码块增强 (title, mark, command)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  enableQuiz&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;              # 练习题交互功能&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  enableEncryptedBlock&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;    # :::encrypted{password=&quot;...&quot;} 加密内容块&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;提示&lt;/strong&gt;：完整的语法演示可参考 &lt;a href=&quot;/post/shoka-features&quot;&gt;Shoka 主题 Markdown 语法演示&lt;/a&gt; 文章。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;内容加密（&lt;code&gt;enableEncryptedBlock&lt;/code&gt;）：&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;博客支持两种加密方式，满足不同的内容保护需求：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 加密块 —— 文章局部加密&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在文章中使用 &lt;code&gt;:::encrypted{password=&quot;...&quot;}&lt;/code&gt; 语法包裹需要加密的内容：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;这部分内容公开可见。&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::encrypted{password=&quot;demo&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这段内容需要输入密码 &quot;demo&quot; 才能查看。&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;支持完整的 Markdown 语法，包括代码块、列表、图片等。&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这部分也是公开的。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;加密块适合在一篇文章中&lt;strong&gt;部分隐藏&lt;/strong&gt;敏感内容（如答案、剧透、私密笔记），其余内容正常展示。需要在 &lt;code&gt;config/site.yaml&lt;/code&gt; 中启用 &lt;code&gt;enableEncryptedBlock: true&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 加密文章 —— 整篇文章加密&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在文章的 frontmatter 中添加 &lt;code&gt;password&lt;/code&gt; 字段即可加密整篇文章：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 我的私密文章&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 2026-01-01&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;password&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; mySecretPassword&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;categories&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; 笔记&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这里的所有内容都会被加密...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;加密文章会显示一个全屏的解锁界面，输入正确密码后才能查看内容。解锁后代码高亮、目录导航、Mermaid 图表等增强功能会自动重新初始化。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;安全模型说明：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;加密功能使用 &lt;strong&gt;AES-256-GCM&lt;/strong&gt; 算法，安全模型如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;构建时加密&lt;/strong&gt;：密码仅在 &lt;code&gt;pnpm build&lt;/code&gt; 时用于加密，生成的 HTML 中&lt;strong&gt;不包含密码明文&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;客户端解密&lt;/strong&gt;：读者在浏览器中输入密码后，通过 Web Crypto API 在本地解密，密码不会发送到任何服务器&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;密钥派生&lt;/strong&gt;：使用 PBKDF2（100,000 次迭代）从密码派生加密密钥，提高暴力破解成本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;搜索排除&lt;/strong&gt;：加密内容自动添加 &lt;code&gt;data-pagefind-ignore&lt;/code&gt;，不会被 Pagefind 搜索索引&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;注意&lt;/strong&gt;：此加密设计的主要目的是&lt;strong&gt;防止搜索引擎和爬虫索引加密内容&lt;/strong&gt;，而非抵御针对性攻击。密文和盐值嵌入在公开的 HTML 中，理论上可被离线暴力破解。请使用强密码，不要用于保护高度敏感的信息。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;加密文章的特殊行为：&lt;/strong&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;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;RSS 订阅&lt;/td&gt;&lt;td&gt;标题前加 🔒 前缀，内容替换为&quot;此文章已加密&quot;提示&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SEO / meta&lt;/td&gt;&lt;td&gt;description 使用 frontmatter 中的 &lt;code&gt;description&lt;/code&gt;（若未设置则显示通用加密提示）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;搜索索引&lt;/td&gt;&lt;td&gt;加密内容不会被 Pagefind 索引&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;tr&gt;&lt;td&gt;AI 摘要&lt;/td&gt;&lt;td&gt;基于加密前的原文生成（构建时可访问明文）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&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;li&gt;外部链接自动添加 &lt;code&gt;target=&quot;_blank&quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;多语言支持（i18n）&lt;a href=&quot;#多语言支持i18n&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;博客内置完整的国际化支持，可轻松添加多种语言。&lt;/p&gt;
&lt;h4&gt;基本配置&lt;a href=&quot;#基本配置-1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;在 &lt;code&gt;config/site.yaml&lt;/code&gt; 的 &lt;code&gt;i18n&lt;/code&gt; 部分配置支持的语言：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;i18n&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  defaultLocale&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; zh&lt;/span&gt;&lt;span&gt;        # 默认语言（URL 无前缀）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  locales&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    -&lt;/span&gt;&lt;span&gt; code&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; zh&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      label&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 中文&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    -&lt;/span&gt;&lt;span&gt; code&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; en&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      label&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; English&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      # enabled: false     # 设为 false 可暂时禁用（保留内容但不生成路由）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;配置多语言后：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;默认语言的页面 URL 不带前缀（如 &lt;code&gt;/post/hello&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;其他语言自动加前缀（如 &lt;code&gt;/en/post/hello&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;导航栏（桌面端）和移动端抽屉中自动显示语言切换器&lt;/li&gt;
&lt;li&gt;每个语言各自生成独立的 RSS 订阅源（如 &lt;code&gt;/en/rss.xml&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;HTML &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 中自动输出 hreflang 标签，有利于 SEO&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果只配置了一种语言，i18n 功能不会激活，不会产生额外的路由或 UI 元素。&lt;/p&gt;
&lt;h4&gt;翻译体系&lt;a href=&quot;#翻译体系&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;i18n 系统采用两层翻译架构：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. UI 字符串（TypeScript）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;界面上的按钮文字、提示信息等 UI 文本通过 TypeScript 翻译字典管理，位于 &lt;code&gt;src/i18n/translations/&lt;/code&gt; 目录：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;zh.ts&lt;/code&gt;：默认语言（中文），包含所有翻译 key（约 170 个），是唯一的 source-of-truth&lt;/li&gt;
&lt;li&gt;&lt;code&gt;en.ts&lt;/code&gt;：英文翻译，只需提供需要覆盖的 key，未提供的自动回退到中文&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;翻译字符串支持 &lt;code&gt;{param}&lt;/code&gt; 占位符插值：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;// zh.ts&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&apos;post.totalPosts&apos;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;共 {count} 篇文章&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// en.ts&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&apos;post.totalPosts&apos;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;{count} posts&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;2. 内容字符串（YAML）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;分类名、系列名、精选分类描述等内容级文本通过 &lt;code&gt;config/i18n-content.yaml&lt;/code&gt; 管理。默认语言的值直接读取 &lt;code&gt;config/site.yaml&lt;/code&gt;，此文件仅存放非默认语言的翻译：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;en&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  categories&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    life&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Life&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    note&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Notes&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    tools&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Tools&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  series&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    weekly&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      label&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; My Weekly&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      fullName&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; My Tech Weekly&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  featuredCategories&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    life&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      label&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Life&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      description&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Life journals and essays&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;其中 &lt;code&gt;categories&lt;/code&gt; 的 key 是分类的 URL slug（对应 &lt;code&gt;config/site.yaml&lt;/code&gt; 中 &lt;code&gt;categoryMap&lt;/code&gt; 的值），&lt;code&gt;series&lt;/code&gt; 的 key 是系列的 slug。&lt;/p&gt;
&lt;h4&gt;添加翻译文章&lt;a href=&quot;#添加翻译文章&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;将翻译文章放在 &lt;code&gt;src/content/blog/&amp;lt;locale&amp;gt;/&lt;/code&gt; 目录下，保持与默认语言相同的路径结构：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;src/content/blog/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├── life/hello-world.md            # 默认语言 (zh)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├── tools/getting-started.md       # 默认语言 (zh)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├── en/life/hello-world.md         # 英文翻译&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;└── en/tools/getting-started.md    # 英文翻译&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;回退机制&lt;/strong&gt;：当用户切换到非默认语言时，系统会显示该语言已有的翻译文章，对于尚未翻译的文章则自动回退显示默认语言内容，并在文章顶部标注提示信息。&lt;/p&gt;
&lt;h4&gt;添加新语言&lt;a href=&quot;#添加新语言&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;以添加日语（ja）为例：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在 &lt;code&gt;config/site.yaml&lt;/code&gt; 的 &lt;code&gt;i18n.locales&lt;/code&gt; 中添加新语言：&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;i18n&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  locales&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    -&lt;/span&gt;&lt;span&gt; code&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; zh&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      label&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 中文&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    -&lt;/span&gt;&lt;span&gt; code&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; en&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      label&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; English&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    -&lt;/span&gt;&lt;span&gt; code&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; ja&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      label&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 日本語&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;创建 UI 翻译文件 &lt;code&gt;src/i18n/translations/ja.ts&lt;/code&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; UIStrings &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from&lt;/span&gt;&lt;span&gt; &apos;../types&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; const&lt;/span&gt;&lt;span&gt; uiStrings&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; UIStrings &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &apos;nav.home&apos;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &apos;ホーム&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &apos;common.search&apos;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &apos;検索&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  // ... 按需翻译，未提供的 key 自动回退到中文&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;在 &lt;code&gt;src/i18n/translations/index.ts&lt;/code&gt; 中注册：&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; uiStrings &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; ja &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from&lt;/span&gt;&lt;span&gt; &apos;./ja&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; const&lt;/span&gt;&lt;span&gt; translations&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Record&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; DefaultUIStrings &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; UIStrings&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  zh&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  en&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ja&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; // 新增&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;4.（可选）在 &lt;code&gt;config/i18n-content.yaml&lt;/code&gt; 中添加日语的内容翻译。&lt;/p&gt;
&lt;p&gt;5.（可选）在 &lt;code&gt;src/content/blog/ja/&lt;/code&gt; 目录下添加日语文章。&lt;/p&gt;
&lt;h4&gt;在组件中使用翻译&lt;a href=&quot;#在组件中使用翻译&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Astro 组件&lt;/strong&gt;（&lt;code&gt;.astro&lt;/code&gt; 文件）中：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; getLocaleFromUrl&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; t&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; localizedPath &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from&lt;/span&gt;&lt;span&gt; &apos;@/i18n&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; locale &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; getLocaleFromUrl&lt;/span&gt;&lt;span&gt;(Astro&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pathname)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;h1&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;(locale&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &apos;post.totalPosts&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; count&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 10&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;h1&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;localizedPath&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;/archives&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; locale)&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;归档&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;React 组件&lt;/strong&gt;（&lt;code&gt;.tsx&lt;/code&gt; 文件）中：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; useTranslation &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from&lt;/span&gt;&lt;span&gt; &apos;@hooks/useTranslation&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; MyComponent&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  const&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; t&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; locale&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; useTranslation&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  return&lt;/span&gt;&lt;span&gt; &amp;lt;&lt;/span&gt;&lt;span&gt;button&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;common.search&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;button&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;RSS 订阅&lt;a href=&quot;#rss-订阅&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;访问 &lt;code&gt;/rss.xml&lt;/code&gt; 获取 RSS feed。启用多语言时，每个语言有独立的 RSS 源（如 &lt;code&gt;/en/rss.xml&lt;/code&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;li&gt;发布日期&lt;/li&gt;
&lt;li&gt;文章链接&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;数据统计&lt;a href=&quot;#数据统计&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;集成 Umami 分析（可选）。&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;config/site.yaml&lt;/code&gt; 中配置：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;analytics&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  umami&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    enabled&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; your-umami-id&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    endpoint&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; https://stats.example.com&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    # 页面访问量展示（可选）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    statistics_display&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      token&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; your-umami-share-token&lt;/span&gt;&lt;span&gt;  # Umami 分享链接令牌（只读，可安全暴露到客户端）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      article_page_views&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;        # 在文章卡片和详情页显示访问量&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      footer_site_stats&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;         # 在页脚显示全站访问量&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;获取 Umami Share Token&lt;a href=&quot;#获取-umami-share-token&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;statistics_display.token&lt;/code&gt; 是 Umami 的&lt;strong&gt;分享链接令牌&lt;/strong&gt;，用于通过公开 API 读取统计数据（只读权限，可安全暴露到前端）。获取步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;登录你的 Umami 后台&lt;/li&gt;
&lt;li&gt;进入 &lt;strong&gt;Settings → Websites&lt;/strong&gt;，选择你的站点&lt;/li&gt;
&lt;li&gt;点击右侧 &lt;strong&gt;Share URL&lt;/strong&gt; 按钮（分享图标）&lt;/li&gt;
&lt;li&gt;开启 &lt;strong&gt;Enable share URL&lt;/strong&gt; 开关，此时会生成一个分享链接，形如：&lt;code&gt;https://stats.example.com/share/xxxxxxxx/site-name&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;链接中 &lt;code&gt;/share/&lt;/code&gt; 后面的那段字符串（如 &lt;code&gt;xxxxxxxx&lt;/code&gt;）即为 share token，将其填入 &lt;code&gt;statistics_display.token&lt;/code&gt; 即可&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;注：Share token 仅提供只读权限，无法通过它修改任何数据或配置，因此可以安全地暴露到客户端代码中。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;开发指南&lt;a href=&quot;#开发指南&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;目录结构&lt;a href=&quot;#目录结构&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;astro-koharu/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├── src/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   ├── components/      # 组件&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   │   ├── common/      # 通用组件（错误边界等）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   │   ├── ui/          # UI 组件（按钮、卡片等）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   │   ├── layout/      # 布局组件（头部、侧边栏等）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   │   ├── post/        # 文章相关组件&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   │   ├── category/    # 分类组件&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   │   └── theme/       # 主题切换&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   ├── content/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   │   └── blog/        # 博客文章（Markdown）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   │       └── en/      # 英文翻译文章（按 locale 子目录组织）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   ├── i18n/            # 国际化模块&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   │   ├── config.ts    # locale 配置（读取 site.yaml）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   │   ├── utils.ts     # 翻译函数、URL 工具&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   │   ├── content.ts   # 内容翻译加载（读取 i18n-content.yaml）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   │   └── translations/  # UI 翻译字典（zh.ts, en.ts）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   ├── layouts/         # 页面布局模板&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   ├── pages/           # 页面路由&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   │   └── [lang]/      # 非默认语言的镜像路由&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   ├── lib/             # 工具函数&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   ├── hooks/           # React hooks&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   ├── constants/       # 常量配置&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   ├── store/           # 全局状态（nanostores）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   ├── scripts/         # 构建脚本&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   ├── styles/          # 全局样式&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   └── types/           # TypeScript 类型定义&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├── public/              # 静态资源&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   └── img/             # 图片资源&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├── config/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   ├── site.yaml        # 站点配置（含分类映射、i18n 配置）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   └── i18n-content.yaml  # 内容级翻译（分类名、系列名等）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├── astro.config.mjs     # Astro 配置&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├── tailwind.config.mjs  # Tailwind 配置&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;└── tsconfig.json        # TypeScript 配置&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;路径别名&lt;a href=&quot;#路径别名&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;项目配置了以下路径别名（在 &lt;code&gt;tsconfig.json&lt;/code&gt; 中）：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; something &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from&lt;/span&gt;&lt;span&gt; &quot;@/xxx&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; // → src/xxx&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; Component &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &quot;@components/xxx&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; // → src/components/xxx&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; util &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from&lt;/span&gt;&lt;span&gt; &quot;@lib/xxx&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; // → src/lib/xxx&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; config &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &quot;@constants/xxx&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; // → src/constants/xxx&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// ... 更多别名见 tsconfig.json&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;常用命令&lt;a href=&quot;#常用命令&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 开发&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; dev&lt;/span&gt;&lt;span&gt;              # 启动开发服务器（默认 localhost:4321）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 构建&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; build&lt;/span&gt;&lt;span&gt;            # 构建生产版本&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; preview&lt;/span&gt;&lt;span&gt;          # 预览生产构建&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 代码质量&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; lint&lt;/span&gt;&lt;span&gt;             # 运行 ESLint&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; lint-md&lt;/span&gt;&lt;span&gt;          # 检查 Markdown 文件&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; lint-md:fix&lt;/span&gt;&lt;span&gt;      # 自动修复 Markdown 问题&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; knip&lt;/span&gt;&lt;span&gt;             # 查找未使用的文件和依赖&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Koharu CLI&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt;                   # 交互式主菜单&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt;               # 新建内容（交互式选择）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; post&lt;/span&gt;&lt;span&gt;          # 新建博客文章&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; friend&lt;/span&gt;&lt;span&gt;        # 新建友情链接&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; backup&lt;/span&gt;&lt;span&gt;            # 备份博客内容（--full 完整备份）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; restore&lt;/span&gt;&lt;span&gt;           # 还原备份（--latest, --dry-run）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; migrate&lt;/span&gt;&lt;span&gt;           # 迁移旧内容链接（--dry-run）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; update&lt;/span&gt;&lt;span&gt;            # 更新主题（--check, --clean, --rebase, --tag, --dry-run 等）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; generate&lt;/span&gt;&lt;span&gt;          # 生成内容资产（交互式选择）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; generate&lt;/span&gt;&lt;span&gt; lqips&lt;/span&gt;&lt;span&gt;    # 生成 LQIP 占位符&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; generate&lt;/span&gt;&lt;span&gt; similarities&lt;/span&gt;&lt;span&gt;  # 生成相似度向量&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; generate&lt;/span&gt;&lt;span&gt; summaries&lt;/span&gt;&lt;span&gt;     # 生成 AI 摘要&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; generate&lt;/span&gt;&lt;span&gt; all&lt;/span&gt;&lt;span&gt;      # 生成全部资产&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; clean&lt;/span&gt;&lt;span&gt;             # 清理旧备份（--keep N）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;span&gt;              # 查看所有备份&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 工具&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; change&lt;/span&gt;&lt;span&gt;           # 生成 CHANGELOG.md（基于 git-cliff）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Docker 部署&lt;a href=&quot;#docker-部署&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;astro-koharu 支持通过 Docker 进行容器化部署，适合需要自托管的场景。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;快速开始：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 1. 编辑 config/site.yaml，配置 comment.remark42 和 analytics.umami 部分&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 2. 构建并启动&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; compose&lt;/span&gt;&lt;span&gt; -f&lt;/span&gt;&lt;span&gt; docker/docker-compose.yml&lt;/span&gt;&lt;span&gt; up&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; --build&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 3. 访问&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;open&lt;/span&gt;&lt;span&gt; http://localhost:4321&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;目录结构：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;docker/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├── Dockerfile           # 多阶段构建配置&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├── docker-compose.yml   # 编排配置&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├── nginx/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│   └── default.conf     # Nginx 静态服务配置&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;└── rebuild.sh           # 便捷重建脚本&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;关于生成脚本：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;以下脚本&lt;strong&gt;需要在本地运行&lt;/strong&gt;，不能在 Docker 构建时执行：&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;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;pnpm generate:lqips&lt;/code&gt;&lt;/td&gt;&lt;td&gt;使用 &lt;code&gt;sharp&lt;/code&gt; 原生模块处理图片&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;pnpm generate:similarities&lt;/code&gt;&lt;/td&gt;&lt;td&gt;需下载 500MB+ 的 ML 模型&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;pnpm generate:summaries&lt;/code&gt;&lt;/td&gt;&lt;td&gt;需连接本地 LLM 服务器&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;推荐工作流：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 本地开发：添加新图片或文章后&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; generate:all&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 提交生成的数据文件&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; add&lt;/span&gt;&lt;span&gt; src/assets/&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;.json&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; commit&lt;/span&gt;&lt;span&gt; -m&lt;/span&gt;&lt;span&gt; &quot;chore: update generated assets&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 重建 Docker 容器&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;./docker/rebuild.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;使用 rebuild.sh：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; docker&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;./rebuild.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;&lt;strong&gt;评论与统计配置：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;config/site.yaml&lt;/code&gt; 中配置评论系统和统计：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 评论系统（可选）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;comment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  remark42&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    enabled&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    host&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; https://your-remark-server.com/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    siteId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; your-site-id&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 统计系统（可选）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;analytics&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  umami&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    enabled&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; your-umami-id&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    endpoint&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; https://your-umami-server.com&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    # 页面访问量展示（可选，需要 share token）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    # statistics_display:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    #   token: your-umami-share-token&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    #   article_page_views: true&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    #   footer_site_stats: true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Docker 端口可在 &lt;code&gt;.env&lt;/code&gt; 中配置 &lt;code&gt;BLOG_PORT=4321&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意事项：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;生成的 JSON 文件必须提交到 git，Docker 构建时会直接使用&lt;/li&gt;
&lt;li&gt;如果忘记运行生成脚本，相关功能（LQIP 占位符、相关文章推荐等）将不可用&lt;/li&gt;
&lt;li&gt;Docker 镜像基于 nginx&lt;div&gt;&lt;/div&gt;，仅包含静态文件，无需 Node.js 运行时&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Koharu CLI&lt;a href=&quot;#koharu-cli&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;博客自带交互式命令行工具，提供备份还原、主题更新、内容生成、新建内容等功能。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;启动方式：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt;              # 交互式主菜单&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;新建内容&lt;a href=&quot;#新建内容&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;使用 CLI 快速创建博客文章和友链：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 交互式选择创建类型（文章或友链）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 或直接指定类型&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; post&lt;/span&gt;&lt;span&gt;     # 新建博客文章&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; friend&lt;/span&gt;&lt;span&gt;   # 新建友情链接&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;新建博客文章功能：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;交互式输入文章信息：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;标题&lt;/strong&gt; - 文章标题（必填）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Slug&lt;/strong&gt; - 自定义 URL（可选，默认根据标题自动生成拼音）&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;li&gt;&lt;strong&gt;草稿&lt;/strong&gt; - 是否保存为草稿（默认否）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;自动生成 frontmatter（包含 title、date、categories、tags 等）&lt;/li&gt;
&lt;li&gt;检查文件是否已存在，避免覆盖&lt;/li&gt;
&lt;li&gt;文章保存在对应的分类目录下（如 &lt;code&gt;src/content/blog/note/front-end/my-post.md&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;新建友情链接功能：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;交互式输入友链信息：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;站点名称&lt;/strong&gt; - 友站的名称（必填）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;站点 URL&lt;/strong&gt; - 友站的链接（必填，需完整 URL）&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;头像 URL&lt;/strong&gt; - 友站的头像链接（必填）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主题色&lt;/strong&gt; - 友站的主题色（可选，可选择预设颜色或自定义十六进制）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;自动追加到 &lt;code&gt;config/site.yaml&lt;/code&gt; 的 &lt;code&gt;friends.data&lt;/code&gt; 数组&lt;/li&gt;
&lt;li&gt;保留 YAML 文件的格式和注释&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;使用示例：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 创建新文章&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; post&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 按提示输入：&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 标题: React Hooks 使用指南&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Slug: (自动生成 react-hooks-shi-yong-zhi-nan，可修改或清空)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 描述: React Hooks 的完整使用教程&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 分类: 选择&quot;笔记 → 前端&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 标签: React, Hooks, 教程&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 草稿: 否&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 创建友链&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; friend&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 按提示输入友站信息&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;备份与还原&lt;a href=&quot;#备份与还原&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;更新主题前，建议先备份你的个人内容：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 基础备份（博客文章、配置、头像、.env）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; backup&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 完整备份（包含所有图片和生成的资产）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; backup&lt;/span&gt;&lt;span&gt; --full&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 查看所有备份&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 还原最新备份&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; restore&lt;/span&gt;&lt;span&gt; --latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 预览将要还原的文件（不实际还原）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; restore&lt;/span&gt;&lt;span&gt; --dry-run&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 强制还原（覆盖已存在的文件）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; restore&lt;/span&gt;&lt;span&gt; --force&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 清理旧备份（保留最近 5 个）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; clean&lt;/span&gt;&lt;span&gt; --keep&lt;/span&gt;&lt;span&gt; 5&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;备份文件存储在 &lt;code&gt;backups/&lt;/code&gt; 目录，格式为 &lt;code&gt;backup-YYYY-MM-DD-HHMMSS.tar.gz&lt;/code&gt;。&lt;/p&gt;
&lt;h4&gt;更新主题&lt;a href=&quot;#更新主题&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;使用 CLI 自动更新主题，完成备份 → 拉取 → 合并 → 安装依赖的完整流程：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 完整更新流程（默认会先备份）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; update&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 仅检查是否有更新&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; update&lt;/span&gt;&lt;span&gt; --check&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 跳过备份直接更新&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; update&lt;/span&gt;&lt;span&gt; --skip-backup&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 强制模式（跳过工作区检查和确认）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; update&lt;/span&gt;&lt;span&gt; --force&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 更新到指定版本（如 v2.1.0）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; update&lt;/span&gt;&lt;span&gt; --tag&lt;/span&gt;&lt;span&gt; v2.1.0&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# clean 模式（零冲突，强制备份，适合首次迁移或冲突较多时）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; update&lt;/span&gt;&lt;span&gt; --clean&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# rebase 模式（重写历史，强制备份，适合熟悉 git 的用户）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; update&lt;/span&gt;&lt;span&gt; --rebase&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 预览操作（不实际执行，可配合 --clean 或 --rebase 使用）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; update&lt;/span&gt;&lt;span&gt; --dry-run&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;选项说明：&lt;/strong&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;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--check&lt;/code&gt;&lt;/td&gt;&lt;td&gt;仅检查更新，不执行合并&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--skip-backup&lt;/code&gt;&lt;/td&gt;&lt;td&gt;跳过备份步骤（clean/rebase 模式下无效，强制备份）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--force&lt;/code&gt;&lt;/td&gt;&lt;td&gt;跳过工作区脏检查和确认提示（不影响合并方式）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--tag&lt;/code&gt;&lt;/td&gt;&lt;td&gt;指定目标版本（如 &lt;code&gt;v2.1.0&lt;/code&gt;），支持升级和降级&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--clean&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Clean 模式，零冲突更新（替换主题文件 + 还原用户内容）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--rebase&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Rebase 模式，重写历史完全同步上游（强制要求备份）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--dry-run&lt;/code&gt;&lt;/td&gt;&lt;td&gt;预览操作，不实际执行&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;三种更新模式：&lt;/strong&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;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;strong&gt;默认&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;pnpm koharu update&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;strong&gt;Clean&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--clean&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;strong&gt;Rebase&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--rebase&lt;/code&gt;&lt;/td&gt;&lt;td&gt;熟悉 git 的用户&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;strong&gt;默认模式（Merge）：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;git merge --no-ff&lt;/code&gt; 合并上游更新，保留 merge-base 信息，让后续更新的冲突更少。&lt;/p&gt;
&lt;p&gt;智能冲突处理：&lt;/p&gt;
&lt;ul&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;📝 &lt;strong&gt;提交格式：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;chore: merge upstream theme v2.3.2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Clean 模式：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;用上游最新版本&lt;strong&gt;替换所有主题文件&lt;/strong&gt;，然后从备份&lt;strong&gt;还原用户内容&lt;/strong&gt;，实现零冲突更新。&lt;/p&gt;
&lt;p&gt;执行流程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;强制备份你的博客内容&lt;/li&gt;
&lt;li&gt;创建 merge commit 记录版本关系&lt;/li&gt;
&lt;li&gt;用上游文件覆盖本地所有文件&lt;/li&gt;
&lt;li&gt;从刚才的备份还原用户内容（博客文章、配置、独立页面、图片、.env）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;⚠️ &lt;strong&gt;注意：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;你对&lt;strong&gt;主题文件&lt;/strong&gt;的自定义修改（如改了某个组件、布局、样式）&lt;strong&gt;不会被保留&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;备份范围包含：&lt;code&gt;src/content/blog/&lt;/code&gt;、&lt;code&gt;config/site.yaml&lt;/code&gt;、&lt;code&gt;src/pages/*.md&lt;/code&gt;、&lt;code&gt;public/img/&lt;/code&gt;、&lt;code&gt;.env&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;--full&lt;/code&gt; 备份选项可额外保留 favicon、LQIP、相似度、AI 摘要等生成资产&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;适用场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首次从旧版本迁移，历史冲突太多无法正常 merge&lt;/li&gt;
&lt;li&gt;没有自定义主题文件，只写了博客内容&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Rebase 模式：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;执行 &lt;code&gt;git rebase upstream/main&lt;/code&gt;（或指定的 tag），将本地提交重放到上游之上。适合熟悉 git 操作的用户。&lt;/p&gt;
&lt;p&gt;⚠️ &lt;strong&gt;注意&lt;/strong&gt;：Rebase 模式会重写 Git 历史，请确保已备份重要内容。CLI 会强制要求备份（忽略 &lt;code&gt;--skip-backup&lt;/code&gt; 和 &lt;code&gt;--force&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;使用 &lt;code&gt;--dry-run&lt;/code&gt; 预览：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;所有模式都支持 &lt;code&gt;--dry-run&lt;/code&gt; 预览操作效果：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; update&lt;/span&gt;&lt;span&gt; --dry-run&lt;/span&gt;&lt;span&gt;          # 预览默认 merge&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; update&lt;/span&gt;&lt;span&gt; --clean&lt;/span&gt;&lt;span&gt; --dry-run&lt;/span&gt;&lt;span&gt;  # 预览 clean 模式&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; update&lt;/span&gt;&lt;span&gt; --rebase&lt;/span&gt;&lt;span&gt; --dry-run&lt;/span&gt;&lt;span&gt; # 预览 rebase 操作&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 给熟悉 git 的用户：&lt;/strong&gt; CLI 更新命令是对 git 操作的封装便利工具。如果你对 git 比较熟悉，建议直接使用 &lt;code&gt;git fetch upstream &amp;amp;&amp;amp; git rebase upstream/main&lt;/code&gt; 手动操作，这样能更精确地控制合并过程。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;更新流程说明：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;检查 Git 状态&lt;/strong&gt; — 确保工作区干净（无未提交的更改）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;备份当前内容&lt;/strong&gt; — 可选（clean/rebase 模式强制备份）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;设置 upstream&lt;/strong&gt; — 自动添加 &lt;code&gt;upstream&lt;/code&gt; remote（如果不存在）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;获取最新代码&lt;/strong&gt; — &lt;code&gt;git fetch upstream&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; — 根据所选模式执行 merge / clean / rebase&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安装依赖&lt;/strong&gt; — &lt;code&gt;pnpm install&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;处理合并冲突：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;默认 merge 模式下，用户内容冲突会被自动解决（保留本地版本）。如果主题文件仍有冲突，CLI 会显示冲突文件列表。你可以：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;选择&quot;中止合并&quot;恢复到更新前状态&lt;/li&gt;
&lt;li&gt;手动解决冲突后运行 &lt;code&gt;git add . &amp;amp;&amp;amp; git commit&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 如果选择手动解决冲突&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; status&lt;/span&gt;&lt;span&gt;                    # 查看冲突文件&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 编辑冲突文件，保留需要的内容&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; add&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; commit&lt;/span&gt;&lt;span&gt; -m&lt;/span&gt;&lt;span&gt; &quot;merge: resolve conflicts&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;更新时使用的 Git 命令：&lt;/strong&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;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;检查工作区状态&lt;/td&gt;&lt;td&gt;&lt;code&gt;git status --porcelain&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;获取当前分支&lt;/td&gt;&lt;td&gt;&lt;code&gt;git rev-parse --abbrev-ref HEAD&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;检查 upstream&lt;/td&gt;&lt;td&gt;&lt;code&gt;git remote -v&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;添加 upstream&lt;/td&gt;&lt;td&gt;&lt;code&gt;git remote add upstream https://github.com/cosZone/astro-koharu.git&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;获取更新&lt;/td&gt;&lt;td&gt;&lt;code&gt;git fetch upstream&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;查看新提交数量&lt;/td&gt;&lt;td&gt;&lt;code&gt;git rev-list --left-right --count HEAD...upstream/main&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;查看新提交列表&lt;/td&gt;&lt;td&gt;&lt;code&gt;git log HEAD..upstream/main --pretty=format:&quot;%h | %s | %ar | %an&quot;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;默认合并&lt;/td&gt;&lt;td&gt;&lt;code&gt;git merge --no-ff upstream/main&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Clean 合并&lt;/td&gt;&lt;td&gt;&lt;code&gt;git merge -s ours upstream/main&lt;/code&gt; + &lt;code&gt;git checkout upstream/main -- .&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Rebase&lt;/td&gt;&lt;td&gt;&lt;code&gt;git rebase upstream/main&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;中止合并&lt;/td&gt;&lt;td&gt;&lt;code&gt;git merge --abort&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h4&gt;内容生成&lt;a href=&quot;#内容生成&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;生成各种内容资产：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 交互式选择生成类型&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; generate&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 或直接指定类型&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; generate&lt;/span&gt;&lt;span&gt; lqips&lt;/span&gt;&lt;span&gt;        # 生成 LQIP 图片占位符&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; generate&lt;/span&gt;&lt;span&gt; similarities&lt;/span&gt;&lt;span&gt; # 生成语义相似度向量&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; generate&lt;/span&gt;&lt;span&gt; summaries&lt;/span&gt;&lt;span&gt;    # 生成 AI 摘要&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; generate&lt;/span&gt;&lt;span&gt; all&lt;/span&gt;&lt;span&gt;          # 生成全部&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;如何添加新页面&lt;a href=&quot;#如何添加新页面&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;在 &lt;code&gt;src/pages/&lt;/code&gt; 目录创建 &lt;code&gt;.astro&lt;/code&gt; 文件&lt;/li&gt;
&lt;li&gt;Astro 使用文件系统路由，文件路径即 URL 路径&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;src/pages/about.astro       → /about&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;src/pages/tags/[tag].astro  → /tags/:tag（动态路由）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;如何自定义样式&lt;a href=&quot;#如何自定义样式&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;全局样式：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;编辑 &lt;code&gt;src/styles/index.css&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;组件样式：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;使用 Tailwind CSS 工具类或 Astro 的 &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; 标签。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tailwind 配置：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;编辑 &lt;code&gt;tailwind.config.ts&lt;/code&gt; 自定义主题、颜色、字体等。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;主题变量：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;src/styles/index.css&lt;/code&gt; 中定义的 CSS 变量：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;root&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --primary-color&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; #&lt;/span&gt;&lt;span&gt;ff6b6b&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  /* ... 更多变量 */&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;动画系统&lt;a href=&quot;#动画系统&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用 CSS 动画以及 &lt;a href=&quot;https://motion.dev/&quot;&gt;Motion&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;动画配置：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;src/constants/anim/&lt;/code&gt; 目录中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;spring.ts&lt;/code&gt; - 弹簧动画配置&lt;/li&gt;
&lt;li&gt;&lt;code&gt;variants.ts&lt;/code&gt; - 动画变体定义&lt;/li&gt;
&lt;li&gt;&lt;code&gt;props.ts&lt;/code&gt; - 可复用的动画属性&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;使用示例：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; motion &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from&lt;/span&gt;&lt;span&gt; &quot;motion/react&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; fadeIn &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from&lt;/span&gt;&lt;span&gt; &quot;@constants/anim/variants&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;motion.div&lt;/span&gt;&lt;span&gt; variants&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;fadeIn&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; initial&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;hidden&quot;&lt;/span&gt;&lt;span&gt; animate&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;visible&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  内容&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;motion.div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;与 Hexo/Shoka 主题的对比&lt;a href=&quot;#与-hexoshoka-主题的对比&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;保留的特性&lt;a href=&quot;#保留的特性&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&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;li&gt;✅ 友链页面&lt;/li&gt;
&lt;li&gt;✅ 归档页面&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;改进之处&lt;a href=&quot;#改进之处&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;性能：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;⚡ 静态站点生成 (SSG)，加载速度更快&lt;/li&gt;
&lt;li&gt;⚡ 按需加载 JavaScript&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;ul&gt;
&lt;li&gt;🛠️ TypeScript 类型安全&lt;/li&gt;
&lt;li&gt;🛠️ 热模块替换 (HMR)&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;ul&gt;
&lt;li&gt;🔍 更强大的全站搜索（Pagefind）&lt;/li&gt;
&lt;li&gt;📝 内容集合 (Content Collections) 类型安全&lt;/li&gt;
&lt;li&gt;🎨 Tailwind CSS 4.x 样式系统&lt;/li&gt;
&lt;li&gt;🌊 View Transitions API 页面过渡&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;技术栈差异&lt;a href=&quot;#技术栈差异&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;方面&lt;/th&gt;&lt;th&gt;Hexo + Shoka&lt;/th&gt;&lt;th&gt;astro-koharu&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;框架&lt;/td&gt;&lt;td&gt;Hexo (Node.js)&lt;/td&gt;&lt;td&gt;Astro 7.x&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;模板引擎&lt;/td&gt;&lt;td&gt;EJS/Pug&lt;/td&gt;&lt;td&gt;Astro + React&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;样式&lt;/td&gt;&lt;td&gt;Stylus&lt;/td&gt;&lt;td&gt;Tailwind CSS 4.x&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;构建工具&lt;/td&gt;&lt;td&gt;Webpack&lt;/td&gt;&lt;td&gt;Vite&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;类型检查&lt;/td&gt;&lt;td&gt;无&lt;/td&gt;&lt;td&gt;TypeScript&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;内容管理&lt;/td&gt;&lt;td&gt;文件系统&lt;/td&gt;&lt;td&gt;Content Collections&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;常见问题&lt;a href=&quot;#常见问题&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;如何修改封面图片？&lt;a href=&quot;#如何修改封面图片&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在文章 frontmatter 中设置 &lt;code&gt;cover&lt;/code&gt; 字段：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cover&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; /img/cover/1.webp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;图片放在 &lt;code&gt;public/img/&lt;/code&gt; 目录。如果不设置，会使用默认封面。&lt;/p&gt;
&lt;h3&gt;如何自定义域名？&lt;a href=&quot;#如何自定义域名&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;部署到 Vercel 后，在 Vercel 项目设置中添加自定义域名，然后更新 &lt;code&gt;config/site.yaml&lt;/code&gt; 中的 &lt;code&gt;site.url&lt;/code&gt; 字段。&lt;/p&gt;
&lt;h3&gt;如何添加评论功能？&lt;a href=&quot;#如何添加评论功能&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;项目支持四种评论系统：&lt;strong&gt;Waline&lt;/strong&gt;、&lt;strong&gt;Giscus&lt;/strong&gt;、&lt;strong&gt;Remark42&lt;/strong&gt;、&lt;strong&gt;Twikoo&lt;/strong&gt;。在 &lt;code&gt;config/site.yaml&lt;/code&gt; 的 &lt;code&gt;comment&lt;/code&gt; 配置块中选择使用的提供商。&lt;/p&gt;
&lt;h4&gt;Waline（推荐）&lt;a href=&quot;#waline推荐&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://waline.js.org/&quot;&gt;Waline&lt;/a&gt; 是一个简洁、安全的评论系统，支持多种部署方式（Vercel、Railway、Zeabur 等）。&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;💬 支持 Markdown、表情、@提及、邮件通知&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;前置要求：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;部署 Waline 服务端（&lt;a href=&quot;https://waline.js.org/guide/deploy/&quot;&gt;部署指南&lt;/a&gt;）&lt;/li&gt;
&lt;li&gt;获取服务端 URL&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;配置示例：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;comment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  provider&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; waline&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  waline&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    serverURL&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; https://your-waline-server.vercel.app&lt;/span&gt;&lt;span&gt; # Waline 服务端地址（必填）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    lang&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; zh-CN&lt;/span&gt;&lt;span&gt; # 语言&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    dark&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; html.dark&lt;/span&gt;&lt;span&gt; # 暗黑模式 CSS 选择器&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    meta&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; # 评论者信息字段&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      -&lt;/span&gt;&lt;span&gt; nick&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      -&lt;/span&gt;&lt;span&gt; mail&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      -&lt;/span&gt;&lt;span&gt; link&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    requiredMeta&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; # 必填字段&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      -&lt;/span&gt;&lt;span&gt; nick&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    login&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; enable&lt;/span&gt;&lt;span&gt; # 登录模式 (&apos;enable&apos; | &apos;disable&apos; | &apos;force&apos;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    wordLimit&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt; # 评论字数限制 (0 = 无限制)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    pageSize&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 10&lt;/span&gt;&lt;span&gt; # 每页评论数&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    imageUploader&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt; # 图片上传功能&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    highlighter&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt; # 代码高亮&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    texRenderer&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt; # LaTeX 渲染&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    search&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt; # 搜索功能&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    reaction&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt; # 文章反应功能&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    # recaptchaV3Key: &apos;&apos; # reCAPTCHA v3 Key (可选)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    # turnstileKey: &apos;&apos; # Cloudflare Turnstile Key (可选)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;参数说明：&lt;/strong&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;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;serverURL&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;必填&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Waline 服务端地址&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;code&gt;string&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&apos;zh-CN&apos;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;界面语言（支持 zh-CN, en, jp 等）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;dark&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&apos;html.dark&apos;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;暗黑模式 CSS 选择器&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;meta&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;string[]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;[&apos;nick&apos;,&apos;mail&apos;,&apos;link&apos;]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;评论者信息字段&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;requiredMeta&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;string[]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;[&apos;nick&apos;]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;必填字段&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;login&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&apos;enable&apos;&lt;/code&gt; | &lt;code&gt;&apos;disable&apos;&lt;/code&gt; | &lt;code&gt;&apos;force&apos;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&apos;enable&apos;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;登录模式&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;wordLimit&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;&lt;td&gt;评论字数限制（0 = 无限制）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;pageSize&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;10&lt;/code&gt;&lt;/td&gt;&lt;td&gt;每页评论数&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;imageUploader&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;boolean&lt;/code&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;highlighter&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;boolean&lt;/code&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;texRenderer&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;是否启用 LaTeX 渲染&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;search&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;boolean&lt;/code&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;reaction&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;boolean&lt;/code&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;recaptchaV3Key&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;reCAPTCHA v3 Key（可选，防垃圾评论）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;turnstileKey&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;Cloudflare Turnstile Key（可选）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;部署 Waline 服务端：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;推荐使用 Vercel 一键部署：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;访问 &lt;a href=&quot;https://waline.js.org/guide/get-started/&quot;&gt;Waline 快速开始&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;点击 &quot;Deploy with Vercel&quot; 按钮&lt;/li&gt;
&lt;li&gt;登录 Vercel，授权 GitHub 仓库&lt;/li&gt;
&lt;li&gt;配置环境变量（数据库连接、管理员邮箱等）&lt;/li&gt;
&lt;li&gt;部署完成后获取服务端 URL（如 &lt;code&gt;https://your-waline.vercel.app&lt;/code&gt;）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;主题自动切换：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Waline 组件已实现主题自动切换，通过 &lt;code&gt;dark&lt;/code&gt; 参数（默认 &lt;code&gt;html.dark&lt;/code&gt;）自动跟随站点深色/浅色模式。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;参考链接：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://waline.js.org/&quot;&gt;Waline 官网&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://waline.js.org/guide/deploy/&quot;&gt;部署指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://waline.js.org/reference/client/&quot;&gt;配置参数&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Remark42&lt;a href=&quot;#remark42&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://remark42.com/&quot;&gt;Remark42&lt;/a&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;li&gt;💾 支持多种存储后端（BoltDB、Memory）&lt;/li&gt;
&lt;li&gt;🔐 支持多种社交登录（GitHub、Google、Twitter 等）&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;ol&gt;
&lt;li&gt;部署 Remark42 服务端（&lt;a href=&quot;https://remark42.com/docs/getting-started/installation/&quot;&gt;部署指南&lt;/a&gt;）&lt;/li&gt;
&lt;li&gt;配置站点 ID 和域名&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;配置示例：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;comment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  provider&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; remark42&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  remark42&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    host&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; https://comment.example.com/&lt;/span&gt;&lt;span&gt; # Remark42 服务器地址（必填）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    siteId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; your-site-id&lt;/span&gt;&lt;span&gt; # 站点 ID（必填）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;参数说明：&lt;/strong&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;code&gt;host&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Remark42 服务器地址（&lt;strong&gt;必填&lt;/strong&gt;，需带 &lt;code&gt;http://&lt;/code&gt; 或 &lt;code&gt;https://&lt;/code&gt;）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;siteId&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;&lt;td&gt;站点 ID（&lt;strong&gt;必填&lt;/strong&gt;，在 Remark42 服务端配置中定义）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;部署 Remark42 服务端：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;推荐使用 Docker 部署：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --name&lt;/span&gt;&lt;span&gt; remark42&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -p&lt;/span&gt;&lt;span&gt; 8080:8080&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -e&lt;/span&gt;&lt;span&gt; REMARK_URL=https://comment.example.com&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -e&lt;/span&gt;&lt;span&gt; SECRET=your-secret-key&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -e&lt;/span&gt;&lt;span&gt; SITE=your-site-id&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -e&lt;/span&gt;&lt;span&gt; AUTH_GITHUB_CID=your-github-client-id&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -e&lt;/span&gt;&lt;span&gt; AUTH_GITHUB_CSEC=your-github-client-secret&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -v&lt;/span&gt;&lt;span&gt; /path/to/data:/srv/var&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  umputun/remark42:latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;详细配置请参考 &lt;a href=&quot;https://remark42.com/docs/getting-started/installation/&quot;&gt;Remark42 安装指南&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;主题自动切换：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Remark42 组件已实现主题自动切换，使用 &lt;code&gt;MutationObserver&lt;/code&gt; 监听站点主题变化，自动调用 &lt;code&gt;window.REMARK42.changeTheme()&lt;/code&gt; 更新评论框主题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;参考链接：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://remark42.com/&quot;&gt;Remark42 官网&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://remark42.com/docs/getting-started/installation/&quot;&gt;安装指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://remark42.com/docs/configuration/&quot;&gt;配置文档&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Giscus&lt;a href=&quot;#giscus&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://giscus.app&quot;&gt;Giscus&lt;/a&gt; 是基于 GitHub Discussions 的评论系统，无需自建后端，评论数据存储在你的 GitHub 仓库中。&lt;/p&gt;
&lt;p&gt;具体配置可以看看这篇文章：&lt;a href=&quot;https://zhuanlan.zhihu.com/p/693434928&quot;&gt;https://zhuanlan.zhihu.com/p/693434928&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前置要求：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;仓库必须是&lt;a href=&quot;https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/managing-repository-settings/setting-repository-visibility#making-a-repository-public&quot;&gt;公开的&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;安装 &lt;a href=&quot;https://github.com/apps/giscus&quot;&gt;giscus app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;在仓库中&lt;a href=&quot;https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/enabling-or-disabling-github-discussions-for-a-repository&quot;&gt;启用 Discussions 功能&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;获取配置参数：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;访问 &lt;a href=&quot;https://giscus.app/zh-CN&quot;&gt;giscus.app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;输入你的仓库名称（格式：&lt;code&gt;owner/repo&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;选择页面与 Discussion 的映射方式（推荐 &lt;code&gt;pathname&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;选择 Discussion 分类（推荐 &lt;code&gt;Announcements&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;启用所需功能（reactions、评论框位置等）&lt;/li&gt;
&lt;li&gt;复制生成的 &lt;code&gt;data-repo-id&lt;/code&gt; 和 &lt;code&gt;data-category-id&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;配置示例：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;comment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  provider&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; giscus&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  giscus&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    repo&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; username/repo&lt;/span&gt;&lt;span&gt; # GitHub 仓库名 (owner/repo 格式)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    repoId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; R_kgDOxxxxxx&lt;/span&gt;&lt;span&gt; # 仓库 ID (从 giscus.app 获取)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    category&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Announcements&lt;/span&gt;&lt;span&gt; # Discussion 分类名称&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    categoryId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; DIC_kwDOxxxxxx&lt;/span&gt;&lt;span&gt; # 分类 ID (从 giscus.app 获取)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    mapping&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; pathname&lt;/span&gt;&lt;span&gt; # 映射方式&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    reactionsEnabled&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;1&quot;&lt;/span&gt;&lt;span&gt; # 启用 reactions (&apos;1&apos; 启用, &apos;0&apos; 禁用)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    emitMetadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;0&quot;&lt;/span&gt;&lt;span&gt; # 发送元数据&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    inputPosition&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; top&lt;/span&gt;&lt;span&gt; # 输入框位置 (&apos;top&apos; | &apos;bottom&apos;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    lang&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; zh-CN&lt;/span&gt;&lt;span&gt; # 语言&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;参数说明：&lt;/strong&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;code&gt;repo&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;&lt;td&gt;GitHub 仓库，格式为 &lt;code&gt;owner/repo&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;repoId&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;&lt;td&gt;仓库 ID，从 giscus.app 获取&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;code&gt;string&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Discussion 分类名称&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;categoryId&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;&lt;td&gt;分类 ID，从 giscus.app 获取&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;mapping&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;&lt;td&gt;页面与 Discussion 的映射方式&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;term&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;&lt;td&gt;当 &lt;code&gt;mapping&lt;/code&gt; 为 &lt;code&gt;specific&lt;/code&gt; 或 &lt;code&gt;number&lt;/code&gt; 时使用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;strict&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&apos;0&apos; | &apos;1&apos;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;严格匹配模式，默认 &lt;code&gt;&apos;0&apos;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;reactionsEnabled&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&apos;0&apos; | &apos;1&apos;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;是否启用 reactions，默认 &lt;code&gt;&apos;1&apos;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;emitMetadata&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&apos;0&apos; | &apos;1&apos;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;是否发送页面元数据，默认 &lt;code&gt;&apos;0&apos;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;inputPosition&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&apos;top&apos; | &apos;bottom&apos;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;评论输入框位置，默认 &lt;code&gt;&apos;top&apos;&lt;/code&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;code&gt;string&lt;/code&gt;&lt;/td&gt;&lt;td&gt;界面语言，默认 &lt;code&gt;&apos;zh-CN&apos;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;host&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;&lt;td&gt;自托管 Giscus 实例的地址（可选）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;theme&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;&lt;td&gt;固定主题（不设置则跟随站点主题切换）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;loading&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&apos;lazy&apos; | &apos;eager&apos;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;加载方式，默认 &lt;code&gt;&apos;lazy&apos;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;映射方式说明：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pathname&lt;/code&gt;（推荐）：使用页面路径匹配，如 &lt;code&gt;/post/my-article&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;url&lt;/code&gt;：使用完整 URL 匹配&lt;/li&gt;
&lt;li&gt;&lt;code&gt;title&lt;/code&gt;：使用页面标题匹配&lt;/li&gt;
&lt;li&gt;&lt;code&gt;og:title&lt;/code&gt;：使用 Open Graph 标题匹配&lt;/li&gt;
&lt;li&gt;&lt;code&gt;specific&lt;/code&gt;：使用 &lt;code&gt;term&lt;/code&gt; 参数指定的值&lt;/li&gt;
&lt;li&gt;&lt;code&gt;number&lt;/code&gt;：使用 &lt;code&gt;term&lt;/code&gt; 参数指定的 Discussion 编号&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;主题自动切换：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;本主题已实现 Giscus 评论框的主题自动切换，会跟随站点的深色/浅色模式自动调整。实现原理：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;组件挂载时读取当前主题&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;MutationObserver&lt;/code&gt; 监听 &lt;code&gt;document.documentElement&lt;/code&gt; 的 &lt;code&gt;class&lt;/code&gt; 变化&lt;/li&gt;
&lt;li&gt;检测到主题切换时通过 &lt;code&gt;postMessage&lt;/code&gt; 通知 Giscus iframe 更新主题&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;参考链接：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://giscus.app/zh-CN&quot;&gt;giscus 官网&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/giscus/giscus-component&quot;&gt;giscus-component 文档&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Twikoo&lt;a href=&quot;#twikoo&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://twikoo.js.org/&quot;&gt;Twikoo&lt;/a&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;li&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;/li&gt;
&lt;li&gt;🛡️ 内置反垃圾评论防护&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;前置要求：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;部署 Twikoo 服务端（腾讯云开发 / 自托管，部署指南）&lt;/li&gt;
&lt;li&gt;配置云开发环境 ID 或 自托管服务地址&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;配置示例：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;comment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  provider&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; twikoo&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  twikoo&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    envId&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; # Twikoo 环境 ID (腾讯云) 或 Vercel 环境地址 (必填)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    region&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; # 环境地域，默认为 ap-shanghai&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    path&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; # 用于区分不同文章的自定义 js 路径，如果您的文章路径不是 location.pathname，需传此参数&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    lang&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; # 语言 (默认: &apos;zh-CN&apos;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;参数说明：&lt;/strong&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;code&gt;envId&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Twikoo 环境 ID (&lt;strong&gt;必填&lt;/strong&gt;，需带 &lt;code&gt;https://&lt;/code&gt; 或 &lt;code&gt;https://&lt;/code&gt;）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;region&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;&lt;td&gt;环境地域，默认为 &lt;code&gt;&apos;ap-shanghai&apos;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;path&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;&lt;td&gt;用于区分不同文章的自定义 js 路径，如果您的文章路径不是 location.pathname，需传此参数&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;code&gt;string&lt;/code&gt;&lt;/td&gt;&lt;td&gt;语言 (默认: &lt;code&gt;&apos;zh-CN&apos;&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;部署 Twikoo 服务端：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;参考 &lt;a href=&quot;https://twikoo.js.org/&quot;&gt;Twikoo 官网&lt;/a&gt; 获取详细部署指南。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;主题自动切换：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Twikoo 已实现主题自动切换&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;参考链接：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://twikoo.js.org/&quot;&gt;Twikoo 官网&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;草稿文章如何预览？&lt;a href=&quot;#草稿文章如何预览&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;运行 &lt;code&gt;pnpm dev&lt;/code&gt; 本地开发模式，草稿会自动显示（带 DRAFT 标识）。&lt;/p&gt;
&lt;h3&gt;如何关闭某些功能？&lt;a href=&quot;#如何关闭某些功能&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;关闭某个系列&lt;/strong&gt;：设置该系列的 &lt;code&gt;enabled: false&lt;/code&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;featuredSeries&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; slug&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; weekly&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    enabled&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt; # 禁用此系列&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    # ...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关闭所有系列&lt;/strong&gt;：将 &lt;code&gt;featuredSeries&lt;/code&gt; 设为空数组 &lt;code&gt;[]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关闭搜索&lt;/strong&gt;：移除 &lt;code&gt;astro.config.mjs&lt;/code&gt; 中的 &lt;code&gt;pagefind()&lt;/code&gt; 集成&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关闭统计&lt;/strong&gt;：设置 &lt;code&gt;analytics.umami.enabled = false&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关闭评论&lt;/strong&gt;：移除 &lt;code&gt;comment.provider&lt;/code&gt; 配置或将其设置为空&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关闭 Shoka 语法&lt;/strong&gt;：在 &lt;code&gt;config/site.yaml&lt;/code&gt; 的 &lt;code&gt;content&lt;/code&gt; 部分将对应功能设为 &lt;code&gt;false&lt;/code&gt;，如 &lt;code&gt;enableShokaContainers: false&lt;/code&gt;（关闭提醒块/折叠块/标签卡）、&lt;code&gt;enableShokaSpoiler: false&lt;/code&gt;（关闭隐藏文字）等&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关闭数学公式&lt;/strong&gt;：设置 &lt;code&gt;content.enableMath = false&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关闭练习题&lt;/strong&gt;：设置 &lt;code&gt;content.enableQuiz = false&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;如何更改文章 URL 格式？&lt;a href=&quot;#如何更改文章-url-格式&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;默认使用文件名作为 URL。可以通过 &lt;code&gt;link&lt;/code&gt; 字段自定义：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; my-custom-url&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;URL 特殊字符处理&lt;a href=&quot;#url-特殊字符处理&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;文章链接（&lt;code&gt;link&lt;/code&gt;）和标签（&lt;code&gt;tags&lt;/code&gt;）支持包含特殊字符，系统会自动进行 URL 编码处理。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;文章链接特殊字符：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; C# 学习笔记&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; test-C#&lt;/span&gt;&lt;span&gt; # 包含 # 字符&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;访问时 URL 会自动编码为 &lt;code&gt;/post/test-C%23&lt;/code&gt;，确保浏览器正确解析。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;标签特殊字符：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tags&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; C#&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; C++&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; .NET&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; Node.js&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;标签会自动转换为 URL 安全的格式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;C#&lt;/code&gt; → &lt;code&gt;/tags/c%23&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C++&lt;/code&gt; → &lt;code&gt;/tags/c%2B%2B&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.NET&lt;/code&gt; → &lt;code&gt;/tags/.net&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Node.js&lt;/code&gt; → &lt;code&gt;/tags/node.js&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;注意事项：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;特殊字符包括：&lt;code&gt;#&lt;/code&gt;、&lt;code&gt;+&lt;/code&gt;、&lt;code&gt;&amp;amp;&lt;/code&gt;、&lt;code&gt;?&lt;/code&gt;、&lt;code&gt;%&lt;/code&gt;、空格等&lt;/li&gt;
&lt;li&gt;标签中的 &lt;code&gt;/&lt;/code&gt; 会被替换为 &lt;code&gt;-&lt;/code&gt;（如 &lt;code&gt;前端/React&lt;/code&gt; → &lt;code&gt;前端-react&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;分类名称通过 &lt;code&gt;categoryMap&lt;/code&gt; 映射，建议使用纯英文 slug 避免编码问题&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;参考资源&lt;a href=&quot;#参考资源&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.astro.build/&quot;&gt;Astro 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tailwindcss.com/docs&quot;&gt;Tailwind CSS 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://motion.dev/docs&quot;&gt;Motion 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pagefind.app/&quot;&gt;Pagefind 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://shoka.lostyu.me/computer-science/note/theme-shoka-doc/&quot;&gt;Shoka 主题文档&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;更新日志&lt;a href=&quot;#更新日志&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;查看 &lt;a href=&quot;https://github.com/cosZone/astro-koharu/blob/main/CHANGELOG.md&quot;&gt;CHANGELOG.md&lt;/a&gt; 了解版本更新历史。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;如有问题或建议，欢迎在 &lt;a href=&quot;https://github.com/cosZone/astro-koharu/issues&quot;&gt;GitHub Issues&lt;/a&gt; 中反馈。&lt;/p&gt;</content:encoded><category>category:工具</category><category>tag:Astro</category><category>tag:博客</category><category>tag:教程</category></item><item><title>在公开文章里藏一小段：局部加密块的用法</title><link>https://www.fon1173.top/ko/post/partial-encryption</link><guid isPermaLink="false">ko:partial-encryption</guid><description>整篇加密太重，有时只想藏起一段资源链接或私人备注。这篇演示 :::encrypted 局部加密块，以及它和提醒块、标签、折叠块的搭配。</description><pubDate>Sun, 09 Nov 2025 11:40:00 GMT</pubDate><content:encoded>&lt;p&gt;主题支持两种加密：在 frontmatter 里写 &lt;code&gt;password&lt;/code&gt; 加密整篇文章，或者用 &lt;code&gt;:::encrypted&lt;/code&gt; 只加密其中一段。这篇只讲后者。&lt;/p&gt;
&lt;p&gt;&lt;span&gt;本文示例密码：koharu&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;什么时候用局部加密&lt;a href=&quot;#什么时候用局部加密&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;p&gt;文章大部分内容可以公开，只有一小段不希望被搜索引擎收录，比如网盘链接、给朋友的留言、还在保密期的计划。&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;如果整篇都不想公开，用整篇加密更合适，可以参考站内的「加密文章演示」。&lt;/p&gt;
&lt;h2&gt;写法&lt;a href=&quot;#写法&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;:::encrypted{password=&quot;koharu&quot;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这里是只给知道密码的人看的内容。&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;渲染出来是这样的，输入 &lt;code&gt;koharu&lt;/code&gt; 试试：&lt;/p&gt;
&lt;div&gt;&lt;/div&gt;
&lt;h2&gt;多个加密块&lt;a href=&quot;#多个加密块&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;一篇文章里可以有多个加密块，每个块的密码相互独立：&lt;/p&gt;
&lt;div&gt;&lt;/div&gt;
&lt;h2&gt;需要注意的地方&lt;a href=&quot;#需要注意的地方&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;p&gt;前端加密的目的是防止明文被直接收录，而不是对抗有针对性的破解。密码强度决定了这段内容到底有多安全。&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;密码会出现在 Markdown 源文件里。如果你的博客仓库是公开的，加密块对仓库访客没有任何作用。&lt;/p&gt;
&lt;/div&gt;

加密块会影响哪些功能？
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;站内搜索&lt;/strong&gt;：页面里只有密文，加密内容不会进入搜索索引&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 摘要与相关文章&lt;/strong&gt;：这两个脚本读取的是 Markdown 源文件，加密块的明文会被读到。所以本文在 frontmatter 里设置了 &lt;code&gt;excludeFromSummary: true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;复制 Markdown&lt;/strong&gt;：含局部加密块的文章不提供原文，「复制 Markdown」「下载」和「在写作室打开」都不会出现，避免明文和密码随源文件一起公开&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

&lt;h2&gt;顺便：标签的几种颜色&lt;a href=&quot;#顺便标签的几种颜色&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span&gt;默认&lt;/span&gt; &lt;span&gt;主要&lt;/span&gt; &lt;span&gt;信息&lt;/span&gt; &lt;span&gt;成功&lt;/span&gt; &lt;span&gt;警告&lt;/span&gt; &lt;span&gt;危险&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;写教程时，我常用标签标出「示例密码」这类需要读者留意的信息，比放在正文里更醒目。&lt;/p&gt;</content:encoded><category>category:工具</category><category>tag:加密</category><category>tag:Markdown</category><category>tag:教程</category></item><item><title>用一道体检题复习贝叶斯公式</title><link>https://www.fon1173.top/ko/post/bayes-quiz</link><guid isPermaLink="false">ko:bayes-quiz</guid><description>检测呈阳性，真正患病的概率有多大？用一道经典的条件概率题复习贝叶斯公式，文末附四道小练习，可以直接在页面上作答。</description><pubDate>Sat, 23 Aug 2025 07:30:00 GMT</pubDate><content:encoded>&lt;p&gt;最近帮朋友看一道概率题，发现自己对贝叶斯公式的印象只剩下「分母很长」。这里重新推一遍，顺便出几道题给自己练手。&lt;/p&gt;
&lt;h2&gt;题目&lt;a href=&quot;#题目&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;假设某种疾病在人群中的患病率是 1%。有一种检测：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;患病的人去检测，99% 会呈阳性&lt;/li&gt;
&lt;li&gt;没患病的人去检测，5% 会被误判为阳性&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一个人检测结果为阳性，他真正患病的概率是多少？&lt;/p&gt;
&lt;p&gt;先凭直觉猜一个数，再往下看。&lt;/p&gt;
&lt;h2&gt;推导&lt;a href=&quot;#推导&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;记 &lt;span&gt;&lt;span&gt;DD&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;D&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 为「患病」，&lt;span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 为「检测阳性」。题目给出的是：&lt;/p&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;P(D)=0.01,P(+∣D)=0.99,P(+∣¬D)=0.05P(D) = 0.01,\quad P(+ \mid D) = 0.99,\quad P(+ \mid \neg D) = 0.05&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;D&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;0.01&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;∣&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;D&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;0.99&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;∣&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;¬&lt;/span&gt;&lt;span&gt;D&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;0.05&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;我们要求的是 &lt;span&gt;&lt;span&gt;P(D∣+)P(D \mid +)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;D&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;∣&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;。贝叶斯公式：&lt;/p&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;P(D∣+)=P(+∣D) P(D)P(+)P(D \mid +) = \frac{P(+ \mid D)\,P(D)}{P(+)}&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;D&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;∣&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;∣&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;D&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;D&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;分母用全概率公式展开：&lt;/p&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;P(+)=P(+∣D) P(D)+P(+∣¬D) P(¬D)P(+) = P(+ \mid D)\,P(D) + P(+ \mid \neg D)\,P(\neg D)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;∣&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;D&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;D&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;∣&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;¬&lt;/span&gt;&lt;span&gt;D&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;¬&lt;/span&gt;&lt;span&gt;D&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;

展开计算过程
&lt;div&gt;
&lt;p&gt;代入数值：&lt;/p&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;P(+)=0.99×0.01+0.05×0.99=0.0099+0.0495=0.0594P(+) = 0.99 \times 0.01 + 0.05 \times 0.99 = 0.0099 + 0.0495 = 0.0594&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;0.99&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;×&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;0.01&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;0.05&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;×&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;0.99&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;0.0099&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;0.0495&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;0.0594&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;于是：&lt;/p&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;P(D∣+)=0.00990.0594=16≈16.7%P(D \mid +) = \frac{0.0099}{0.0594} = \frac{1}{6} \approx 16.7\%&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;D&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;∣&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;0.0594&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;0.0099&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;≈&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;16.7%&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;答案是：大约六分之一，也就是 16.7%&lt;/p&gt;
&lt;h2&gt;为什么和直觉差这么多&lt;a href=&quot;#为什么和直觉差这么多&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;直觉往往会盯着「99% 的准确率」，忽略了患病率本身只有 1%。换成具体人数会更直观：假设有 10000 人去检测，&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;100&lt;/td&gt;&lt;td&gt;99&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;未患病&lt;/td&gt;&lt;td&gt;9900&lt;/td&gt;&lt;td&gt;495&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;阳性的一共 594 人，其中真正患病的只有 99 人，正好是六分之一。没患病的人基数太大，5% 的误判也就不少了。&lt;/p&gt;
&lt;p&gt;这种「忽略基础比率」的倾向，在心理学里叫 &lt;mark&gt;基础比率谬误&lt;/mark&gt;。&lt;/p&gt;
&lt;h2&gt;用代码验证&lt;a href=&quot;#用代码验证&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
Python
JavaScript
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;bayes.py&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;p_d &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 0.01&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;p_pos_given_d &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 0.99&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;p_pos_given_not_d &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 0.05&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;p_pos &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; p_pos_given_d &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; p_d &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; p_pos_given_not_d &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt; p_d&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;p_pos_given_d &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; p_d &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt; p_pos&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;  # 0.1666...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;bayes.js&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; pD &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 0.01&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; pPos &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 0.99&lt;/span&gt;&lt;span&gt; *&lt;/span&gt;&lt;span&gt; pD &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; 0.05&lt;/span&gt;&lt;span&gt; *&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt; pD)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;0.99&lt;/span&gt;&lt;span&gt; *&lt;/span&gt;&lt;span&gt; pD) &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt; pPos)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; // 0.1666...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;练习&lt;a href=&quot;#练习&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;如果患病率从 1% 提高到 10%，其他条件不变，阳性者真正患病的概率会怎样变化？
&lt;ul&gt;
&lt;li&gt;基本不变&lt;/li&gt;
&lt;li&gt;明显升高&lt;/li&gt;
&lt;li&gt;明显降低&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;解析：基础比率变大，分子增长得比分母快。代入计算约为 68.75%。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;以下哪些做法可以提高阳性结果的可信度？
&lt;ul&gt;
&lt;li&gt;降低误判率&lt;/li&gt;
&lt;li&gt;对阳性者再做一次独立检测&lt;/li&gt;
&lt;li&gt;扩大检测人数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;解析：扩大检测人数不改变任何一个概率。第二次独立检测相当于用第一次的结果作为新的先验。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;贝叶斯公式中的分母 &lt;span&gt;&lt;span&gt;P(+)P(+)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 可以用全概率公式展开。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;解析：&lt;span&gt;&lt;span&gt;P(+)P(+)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 按「患病」与「未患病」两种情况分别计算再相加。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;在本题中，&lt;span&gt;&lt;span&gt;P(+∣D)P(+ \mid D)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;∣&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;D&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 叫作检测的 &lt;span&gt;灵敏度&lt;/span&gt;，&lt;span&gt;&lt;span&gt;1−P(+∣¬D)1 - P(+ \mid \neg D)&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;∣&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;¬&lt;/span&gt;&lt;span&gt;D&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 叫作检测的 &lt;span&gt;特异度&lt;/span&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;解析：灵敏度衡量「有病能查出来」，特异度衡量「没病不误报」。&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded><category>category:笔记</category><category>tag:数学</category><category>tag:概率</category><category>tag:练习题</category></item><item><title>示例周刊 Vol.3 | 写作环境</title><link>https://www.fon1173.top/ko/post/weekly-example-3</link><guid isPermaLink="false">ko:weekly-example-3</guid><description>第三期示例周刊：整理一套写博客时的本地环境，从编辑器、预览到发布前检查，也是系列导航里「最新一期」的演示。</description><pubDate>Fri, 04 Jul 2025 13:00:00 GMT</pubDate><content:encoded>&lt;p&gt;距离上一期隔了好几个月。周刊不一定要准时，能接着写下去就好。&lt;/p&gt;
&lt;p&gt;这一期聊写作环境。&lt;/p&gt;
&lt;h2&gt;一篇文章的路径&lt;a href=&quot;#一篇文章的路径&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;infographic sequence-zigzag-steps-underline-text&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  title 从草稿到上线&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  items&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 起草&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 在编辑器或写作室里写下初稿&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 预览&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 本地开发服务器实时查看排版&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 检查&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 跑一遍 lint 和类型检查&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - label 发布&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      desc 推送后由 CI 构建部署&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;本期工具&lt;a href=&quot;#本期工具&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;本地预览&lt;a href=&quot;#本地预览&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;写长文时我习惯开着开发服务器，左边编辑器，右边浏览器：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; dev&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;保存文件后页面会自动刷新。改了 &lt;code&gt;config/site.yaml&lt;/code&gt; 的话需要重启服务器，配置在构建时会被缓存。&lt;/p&gt;
&lt;h3&gt;草稿&lt;a href=&quot;#草稿&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;还没写完的文章在 frontmatter 里加上 &lt;code&gt;draft: true&lt;/code&gt;，生产构建时会被排除，开发环境仍然可见。&lt;/p&gt;
&lt;h3&gt;新建文章&lt;a href=&quot;#新建文章&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;不想手写 frontmatter 的话，可以用 CLI 交互式创建：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; post&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;读到的东西&lt;a href=&quot;#读到的东西&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.astro.build/zh-cn/guides/content-collections/&quot;&gt;Astro 文档：内容集合&lt;/a&gt;：写自定义 frontmatter 字段之前值得读一遍。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/details&quot;&gt;MDN：&lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; 元素&lt;/a&gt;：主题里的折叠块就是类似的交互。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;一句话&lt;a href=&quot;#一句话&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;先写完，再写好。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这是目前的最新一期。翻到页面底部，可以看到它和前两期之间的上一期导航。&lt;/p&gt;</content:encoded><category>category:周刊</category><category>tag:周刊</category><category>tag:写作</category></item><item><title>示例周刊 Vol.2 | 把手边的工具用顺</title><link>https://www.fon1173.top/ko/post/weekly-example-2</link><guid isPermaLink="false">ko:weekly-example-2</guid><description>第二期示例周刊：聊聊静态搜索、代码格式化和博客备份这些不起眼但天天在用的东西，顺便演示系列文章的上一期、下一期导航。</description><pubDate>Fri, 14 Mar 2025 12:30:00 GMT</pubDate><content:encoded>&lt;p&gt;这一期没有大新闻，主要聊几样每天都在用、但很少专门写的工具。顺带一提，从这一期开始，系列页面会把每期标题里 &lt;code&gt;Vol.N&lt;/code&gt; 之后的部分当作本期标题，所以标题写成「示例周刊 Vol.2 | 把手边的工具用顺」这样就行。&lt;/p&gt;
&lt;h2&gt;本期推荐&lt;a href=&quot;#本期推荐&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;本博客主题&lt;a href=&quot;#本博客主题&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;先放一张链接卡片。链接单独占一段时，构建阶段会去抓取页面的 Open Graph 信息，渲染成卡片：&lt;/p&gt;
&lt;div&gt;
  &lt;a href=&quot;https://github.com/cosZone/astro-koharu&quot; target=&quot;_blank&quot;&gt;
    &lt;div&gt;
      &lt;div&gt;
        &lt;div&gt;
          &lt;img src=&quot;https://github.com/fluidicon.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
          &lt;span&gt;github.com&lt;/span&gt;
        &lt;/div&gt;
        &lt;div&gt;GitHub - cosZone/astro-koharu: astro-koharu 是一个萌系/二次元/粉蓝配色的 astro 主题博客，灵感来自 Hexo 的 Shoka 主题，加了很多自己的小巧思，性能优越。&lt;/div&gt;
        &lt;p&gt;astro-koharu 是一个萌系/二次元/粉蓝配色的 astro 主题博客，灵感来自 Hexo 的 Shoka 主题，加了很多自己的小巧思，性能优越。 - cosZone/astro-koharu&lt;/p&gt;
        &lt;div&gt;
          &lt;span&gt;https://github.com/cosZone/astro-koharu&lt;/span&gt;
           
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;div&gt;&lt;img src=&quot;https://opengraph.githubassets.com/bb2d62a8104df4bb03dfd471dbe63677a16e9ff02b58322d8544ffd56fba3029/cosZone/astro-koharu&quot; alt=&quot;GitHub - cosZone/astro-koharu: astro-koharu 是一个萌系/二次元/粉蓝配色的 astro 主题博客，灵感来自 Hexo 的 Shoka 主题，加了很多自己的小巧思，性能优越。&quot; loading=&quot;lazy&quot; /&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;抓取结果会写进 &lt;code&gt;.cache/og-data.json&lt;/code&gt;，下次构建直接读缓存；抓取失败也不会让构建失败，只是退回成普通链接。&lt;/p&gt;
&lt;h3&gt;在 React 里嵌入推文&lt;a href=&quot;#在-react-里嵌入推文&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div&gt;
  &lt;a href=&quot;https://github.com/vercel/react-tweet&quot; target=&quot;_blank&quot;&gt;
    &lt;div&gt;
      &lt;div&gt;
        &lt;div&gt;
          &lt;img src=&quot;https://github.com/fluidicon.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
          &lt;span&gt;github.com&lt;/span&gt;
        &lt;/div&gt;
        &lt;div&gt;GitHub - vercel/react-tweet: Embed tweets in your React application.&lt;/div&gt;
        &lt;p&gt;Embed tweets in your React application. Contribute to vercel/react-tweet development by creating an account on GitHub.&lt;/p&gt;
        &lt;div&gt;
          &lt;span&gt;https://github.com/vercel/react-tweet&lt;/span&gt;
           
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;div&gt;&lt;img src=&quot;https://opengraph.githubassets.com/6394b5d1853cd62418c00b9fd6fce7e7fa79f4d2f6a58e05d416bf470a52f8ad/vercel/react-tweet&quot; alt=&quot;GitHub - vercel/react-tweet: Embed tweets in your React application.&quot; loading=&quot;lazy&quot; /&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;主题的推文嵌入就是基于这个库做的。如果你的文章里经常引用推文，可以在 &lt;code&gt;config/site.yaml&lt;/code&gt; 的 &lt;code&gt;content.enableTweetEmbed&lt;/code&gt; 里开关。&lt;/p&gt;
&lt;h2&gt;工具&lt;a href=&quot;#工具&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;静态搜索&lt;a href=&quot;#静态搜索&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://pagefind.app/&quot;&gt;Pagefind&lt;/a&gt; 在构建后扫描生成的 HTML，产出分片的索引文件。访客搜索时只下载需要的那几片，不需要任何服务端。对于几百篇文章的博客来说，这个方案几乎没有维护成本。&lt;/p&gt;
&lt;h3&gt;格式化与检查&lt;a href=&quot;#格式化与检查&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;仓库用 &lt;a href=&quot;https://biomejs.dev/&quot;&gt;Biome&lt;/a&gt; 同时负责格式化和 lint。提交前跑一次：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; lint:fix&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;备份&lt;a href=&quot;#备份&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;升级主题前先备份一下内容和配置：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; backup&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;一句话&lt;a href=&quot;#一句话&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;工具顺手的标志是你忘了它的存在。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;下一期聊聊写作环境本身。&lt;/p&gt;</content:encoded><category>category:周刊</category><category>tag:周刊</category><category>tag:工具</category></item><item><title>Tailwind CSS v4 升级笔记</title><link>https://www.fon1173.top/ko/post/tailwind-v4-upgrade-notes</link><guid isPermaLink="false">ko:tailwind-v4-upgrade-notes</guid><description>v4.0 发布不久后把一个小项目从 v3 升到 v4 的记录：CSS 优先的配置、自动内容检测、几处工具类改名，以及升级工具没覆盖到的地方。</description><pubDate>Sun, 16 Feb 2025 13:20:00 GMT</pubDate><content:encoded>&lt;p&gt;Tailwind CSS v4.0 正式发布后，我把一个小项目从 v3 升了上去。整体比预想顺利，但有几处改动不看文档很难发现，记在这里。&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;这篇写于 v4.0 发布后不久。后续版本的细节可能有调整，以&lt;a href=&quot;https://tailwindcss.com/docs/upgrade-guide&quot;&gt;官方升级指南&lt;/a&gt;为准。&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;先跑官方升级工具&lt;a href=&quot;#先跑官方升级工具&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;官方提供了一个自动迁移工具，会改依赖、改配置、改模板里的类名：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; @tailwindcss/upgrade&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;建议在干净的 Git 工作区里跑，改完用 diff 逐个看一遍。下面几节是我看 diff 时记下的。&lt;/p&gt;
&lt;h2&gt;配置搬进 CSS&lt;a href=&quot;#配置搬进-css&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;入口文件&lt;a href=&quot;#入口文件&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;v3 的三条指令变成了一行导入：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;global.css&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;/* v3 */&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;@tailwind&lt;/span&gt;&lt;span&gt; base&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;@tailwind&lt;/span&gt;&lt;span&gt; components&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;@tailwind&lt;/span&gt;&lt;span&gt; utilities&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/* v4 */&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;@import&lt;/span&gt;&lt;span&gt; &quot;tailwindcss&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;主题变量&lt;a href=&quot;#主题变量&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;自定义颜色、字体不再写在 &lt;code&gt;tailwind.config.js&lt;/code&gt; 里，而是用 &lt;code&gt;@theme&lt;/code&gt; 声明 CSS 变量：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;global.css&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;@import&lt;/span&gt;&lt;span&gt; &quot;tailwindcss&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;@theme&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --color-sakura: oklch(0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;82&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;08&lt;/span&gt;&lt;span&gt; 0);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --font-display: &quot;Noto Serif SC&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; serif;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;声明之后，&lt;code&gt;bg-sakura&lt;/code&gt;、&lt;code&gt;font-display&lt;/code&gt; 这些类就能直接用，同时 &lt;code&gt;var(--color-sakura)&lt;/code&gt; 也可以在任何地方引用。&lt;/p&gt;
&lt;h3&gt;暂时保留旧配置&lt;a href=&quot;#暂时保留旧配置&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;如果一时迁不完，可以用 &lt;code&gt;@config&lt;/code&gt; 继续加载 JS 配置文件：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;@config&lt;/span&gt;&lt;span&gt; &quot;../../tailwind.config.mjs&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;构建集成&lt;a href=&quot;#构建集成&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;用 Vite 的项目改用官方插件，比走 PostCSS 简单：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vite.config.js&lt;/span&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; defineConfig &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; from&lt;/span&gt;&lt;span&gt; &apos;vite&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; tailwindcss &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;@tailwindcss/vite&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; default&lt;/span&gt;&lt;span&gt; defineConfig&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  plugins&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;tailwindcss&lt;/span&gt;&lt;span&gt;()]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;另外 v4 会自动检测模板文件，不再需要 &lt;code&gt;content&lt;/code&gt; 数组。如果有文件在默认扫描范围之外，用 &lt;code&gt;@source&lt;/code&gt; 补上。&lt;/p&gt;
&lt;h2&gt;改了名字的工具类&lt;a href=&quot;#改了名字的工具类&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;升级工具大部分能自动改，但我还是在几个动态拼接的类名上漏了：&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;v3&lt;/th&gt;&lt;th&gt;v4&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;shadow-sm&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;shadow-xs&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;shadow&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;shadow-sm&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;rounded-sm&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;rounded-xs&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;rounded&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;rounded-sm&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;outline-none&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;outline-hidden&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;还有两处默认值的变化：&lt;code&gt;ring&lt;/code&gt; 的默认宽度从 3px 变成了 1px，&lt;code&gt;border&lt;/code&gt; 的默认颜色变成了 &lt;code&gt;currentColor&lt;/code&gt;。页面上突然多出来的深色边框，基本都是后者导致的。&lt;/p&gt;
&lt;h2&gt;小结&lt;a href=&quot;#小结&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;升级本身花了一个晚上，大部分时间在逐页对比样式。如果你的项目也有用字符串拼接出来的类名，记得手动搜一遍。&lt;/p&gt;</content:encoded><category>category:笔记</category><category>category:前端</category><category>category:CSS</category><category>tag:Tailwind</category><category>tag:CSS</category><category>tag:迁移</category></item><item><title>《我推的孩子》第二季观后感：一出舞台剧，拍了大半季</title><link>https://www.fon1173.top/ko/post/oshi-no-ko-season-2</link><guid isPermaLink="false">ko:oshi-no-ko-season-2</guid><description>补完了《我推的孩子》第二季。大半季都在讲一部 2.5 次元舞台剧的排演，节奏慢，却是我最喜欢的一段。</description><pubDate>Sun, 19 Jan 2025 15:10:00 GMT</pubDate><content:encoded>&lt;p&gt;拖了一个季度，终于把《&lt;ruby&gt;我推の子&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;おしのこ&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt;》第二季补完了。第一季的开头太有冲击力，我一度担心后面撑不住。看完第二季，担心是多余的，只是它换了一种讲法。&lt;/p&gt;
&lt;h2&gt;大半季都在排一出戏&lt;a href=&quot;#大半季都在排一出戏&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;第二季的主体是一部漫画改编的 2.5 次元舞台剧，从剧本会开到首演，几乎占满了整季。如果只是想看主线推进，这段可能会让人着急；但我反而觉得这是整部作品目前最扎实的部分。&lt;/p&gt;
&lt;p&gt;它把「改编」这件事拆得很细：原作者在意什么，编剧要妥协什么，演员又怎么理解角色。几方都不是坏人，只是站的位置不同。原作者和编剧之间那段沟通的戏，我看的时候一直在想现实里的改编纠纷，看完也没觉得哪一方完全有理。&lt;/p&gt;
&lt;h2&gt;舞台上的两个人&lt;a href=&quot;#舞台上的两个人&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这一季最好看的是两位女演员在台上的较劲。一个是童星出身，习惯配合别人；一个是剧团出身、以钻研角色见长的演员。她们在台上互相点燃，台下的关系也跟着微妙起来。&lt;/p&gt;
&lt;p&gt;动画在这里用了不少大胆的演出：舞台背景直接溶解成角色的心象，灯光和镜头一起把情绪推上去。这几集我暂停了好几次，就为了多看几眼画面。&lt;/p&gt;

一点具体的剧透（点击展开）
&lt;div&gt;
&lt;p&gt;主角在舞台上把自己最不愿意回想的过去，变成了表演的燃料。演得越好，代价越大。这一段的演出很克制，没有哭喊，反而更难受。&lt;/p&gt;
&lt;/div&gt;

&lt;h2&gt;季末的转向&lt;a href=&quot;#季末的转向&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;舞台剧落幕之后，故事很快拉回复仇的主线。季末几集的信息量不小，有一个角色的状态变化尤其明显：那个一直很阳光的角色，在得知某个真相之后，眼神变了。&lt;/p&gt;
&lt;p&gt;我对这个结尾的感觉很复杂。一方面，它为第三季埋好了钩子；另一方面，舞台剧那段好不容易建立起来的温度，一下子就被收走了。也许这本来就是这部作品想说的：台前再热闹，台后的事情不会因此消失。&lt;/p&gt;
&lt;h2&gt;一些零碎的想法&lt;a href=&quot;#一些零碎的想法&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;OP 依然很好听，我单曲循环了一周&lt;/li&gt;
&lt;li&gt;配角的戏份比第一季丰富，几位年长演员的台词尤其耐听&lt;/li&gt;
&lt;li&gt;剧中剧的台词写得很用心，可以当成一部独立的短篇来看&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;第三季出了再接着写。&lt;/p&gt;</content:encoded><category>category:随笔</category><category>category:番剧</category><category>tag:番剧</category><category>tag:观后感</category><category>tag:我推的孩子</category></item><item><title>목차 번호 매기기 비활성화 예시</title><link>https://www.fon1173.top/ko/post/toc-no-numbering</link><guid isPermaLink="false">ko:toc-no-numbering</guid><description>게시물의 목차 자동 번호 매기기 기능을 끄는 방법을 보여줍니다.</description><pubDate>Sat, 06 Jan 2024 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;본문은 목차의 자동 번호 매기기 기능을 끄는 방법을 보여줍니다.&lt;/p&gt;
&lt;h2&gt;목차 번호 매기기 기능&lt;a href=&quot;#목차-번호-매기기-기능&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;기본적으로 astro-koharu는 CSS 카운터를 사용하여 다음과 같이 목차에 계층 번호를 자동으로 추가합니다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;제1장&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;1.1. 제1절&lt;/li&gt;
&lt;li&gt;1.2. 제2절&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;제2장&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;번호 매기기 비활성화&lt;a href=&quot;#번호-매기기-비활성화&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;tocNumbering: false&lt;/code&gt;를 설정하여 특정 게시물의 번호 매기기를 끌 수 있습니다:&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 나의 게시물&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tocNumbering&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;효과 비교&lt;a href=&quot;#효과-비교&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;번호 매기기 활성화 (기본값)&lt;a href=&quot;#번호-매기기-활성화-기본값&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;목차 항목에 1., 1.1., 1.1.1.과 같은 번호가 표시됩니다.&lt;/p&gt;
&lt;h3&gt;번호 매기기 비활성화&lt;a href=&quot;#번호-매기기-비활성화-1&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;목차 항목에 번호 접두사 없이 제목 텍스트만 표시됩니다.&lt;/p&gt;
&lt;h2&gt;본문 적용 효과&lt;a href=&quot;#본문-적용-효과&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;이 게시물은 &lt;code&gt;tocNumbering: false&lt;/code&gt;로 설정되어 있습니다. 오른쪽 목차(데스크톱)를 확인하거나 목차를 펼쳐서(모바일) 효과를 확인할 수 있습니다.&lt;/p&gt;
&lt;h2&gt;기술적 구현&lt;a href=&quot;#기술적-구현&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;번호 매기기 기능은 순수 CSS 카운터를 통해 구현되어 런타임 오버헤드가 전혀 없습니다:&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toc-numbering&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  counter-reset&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; h2&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toc-numbering&lt;/span&gt;&lt;span&gt; h2&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;before&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  counter-increment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; h2&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  content&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; counter&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;h2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &quot;. &quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;사용 권장 사항&lt;a href=&quot;#사용-권장-사항&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&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;h2&gt;요약&lt;a href=&quot;#요약&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;목차 번호 매기기는 선택 사항이므로, 게시물의 유형에 따라 유연하게 사용하면 됩니다.&lt;/p&gt;</content:encoded><category>category:笔记</category><category>tag:目录</category><category>tag:教程</category></item><item><title>Hello World</title><link>https://www.fon1173.top/ko/post/hello-world</link><guid isPermaLink="false">ko:hello-world</guid><description>안녕, 세상아! 이것은 저의 첫 번째 에세이입니다.
이 글에 대하여
이 글은 다음과 같은 기능을 테스트하기 위해 의도적으로 description 필드를 설정하지 않았습니다:

자동 설명 추출 - 시스템이 본문 앞부분의 150자를 자동으로 추출하여 설명으로 사용합니다.</description><pubDate>Thu, 04 Jan 2024 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;안녕, 세상아! 이것은 저의 첫 번째 에세이입니다.&lt;/p&gt;
&lt;h2&gt;이 글에 대하여&lt;a href=&quot;#이-글에-대하여&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;이 글은 다음과 같은 기능을 테스트하기 위해 의도적으로 &lt;code&gt;description&lt;/code&gt; 필드를 설정하지 않았습니다:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;자동 설명 추출&lt;/strong&gt; - 시스템이 본문 앞부분의 150자를 자동으로 추출하여 설명으로 사용합니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 요약&lt;/strong&gt; - &lt;code&gt;pnpm generate:summaries&lt;/code&gt;를 실행하면 AI가 생성한 요약을 사용합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;에세이 카테고리&lt;a href=&quot;#에세이-카테고리&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&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;h2&gt;글쓰기 제안&lt;a href=&quot;#글쓰기-제안&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;블로그를 쓰는 것은 즐거운 일입니다. 여기 몇 가지 제안이 있습니다:&lt;/p&gt;
&lt;h3&gt;꾸준히 업데이트하기&lt;a href=&quot;#꾸준히-업데이트하기&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;정기적인 업데이트는 블로그에 활력을 불어넣습니다. 비록 짧은 기록일지라도 오랫동안 침묵하는 것보다 낫습니다.&lt;/p&gt;
&lt;h3&gt;진실하게 기록하기&lt;a href=&quot;#진실하게-기록하기&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;완벽한 문장보다 진실한 기록이 더 가치 있습니다. 모든 글이 명작이어야 한다는 부담을 가질 필요는 없습니다.&lt;/p&gt;
&lt;h3&gt;과정 즐기기&lt;a href=&quot;#과정-즐기기&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;글쓰기 자체는 사고를 정리하는 과정입니다. 이 과정을 즐겨보세요.&lt;/p&gt;
&lt;h2&gt;맺음말&lt;a href=&quot;#맺음말&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;이것으로 간단한 에세이 예시를 마칩니다. 여러분도 이곳에 자신만의 이야기를 기록해 보시길 바랍니다.&lt;/p&gt;
&lt;p&gt;즐거운 글쓰기 되세요!&lt;/p&gt;</content:encoded><category>category:随笔</category><category>tag:随笔</category><category>tag:生活</category></item><item><title>예시 주간지 Vol.1</title><link>https://www.fon1173.top/ko/post/weekly-example-1</link><guid isPermaLink="false">ko:weekly-example-1</guid><description>주간지 기능의 사용법을 보여주는 예시 주간지입니다. 주간지는 정기적으로 업데이트되는 시리즈 콘텐츠를 게시하기에 적합합니다.</description><pubDate>Wed, 03 Jan 2024 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;주간지/시리즈 기사 기능의 사용법을 보여주는 예시 주간지입니다.&lt;/p&gt;
&lt;h2&gt;주간지 기능에 대하여&lt;a href=&quot;#주간지-기능에-대하여&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;주간지는 astro-koharu의 특징적인 기능 중 하나로, 다음과 같이 정기적으로 업데이트되는 시리즈 콘텐츠를 게시하기에 적합합니다:&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;h2&gt;주간지 설정&lt;a href=&quot;#주간지-설정&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;config/site.yaml&lt;/code&gt;에서 설정합니다:&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;featuredSeries&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  categoryName&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 주간지&lt;/span&gt;&lt;span&gt;       # 카테고리 이름&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  label&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 나의 주간지&lt;/span&gt;&lt;span&gt;          # 표시 라벨&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  fullName&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 나의 기술 주간지&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  description&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 주간지 설명...&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  cover&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; /img/weekly_header.webp&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  enabled&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;            # false로 설정 시 비활성화&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;주간지 특징&lt;a href=&quot;#주간지-특징&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;전용 페이지&lt;/strong&gt; - 주간지는 독립된 &lt;code&gt;/weekly&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;/li&gt;
&lt;li&gt;&lt;strong&gt;시리즈 내비게이션&lt;/strong&gt; - 주간지 간에 이전/다음 글 내비게이션이 제공됩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;이번 호 내용 예시&lt;a href=&quot;#이번-호-내용-예시&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;추천 읽을거리&lt;a href=&quot;#추천-읽을거리&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://astro.build&quot;&gt;Astro 5.0 신기능 소개&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tailwindcss.com&quot;&gt;Tailwind CSS 4.0 출시&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;도구 추천&lt;a href=&quot;#도구-추천&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&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;th&gt;링크&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Biome&lt;/td&gt;&lt;td&gt;코드 린트&lt;/td&gt;&lt;td&gt;biome.dev&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Motion&lt;/td&gt;&lt;td&gt;애니메이션 라이브러리&lt;/td&gt;&lt;td&gt;motion.dev&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;이번 주 학습&lt;a href=&quot;#이번-주-학습&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;이번 주에는 다음 내용들을 학습했습니다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; Astro 콘텐츠 컬렉션&lt;/li&gt;
&lt;li&gt; Tailwind 테마 설정&lt;/li&gt;
&lt;li&gt; Motion 애니메이션 심화&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;다음 호 예고&lt;a href=&quot;#다음-호-예고&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;다음 호에서는 더 많은 심화 기능을 소개할 예정이니 기대해 주세요!&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;이번 호 주간지를 읽어주셔서 감사합니다!&lt;/p&gt;</content:encoded><category>category:周刊</category><category>tag:周刊</category></item><item><title>主题定制指南</title><link>https://www.fon1173.top/ko/post/theme-customization</link><guid isPermaLink="false">ko:theme-customization</guid><description>介绍如何定制 astro-koharu 的外观，包括配色、布局和动画效果。</description><pubDate>Tue, 02 Jan 2024 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本文介绍如何定制 astro-koharu 的外观和样式。&lt;/p&gt;
&lt;h2&gt;嵌套分类说明&lt;a href=&quot;#嵌套分类说明&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;本文使用了嵌套分类 &lt;code&gt;[笔记, 前端]&lt;/code&gt;，这会创建层级关系：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;URL: &lt;code&gt;/categories/note/front-end&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;面包屑: 笔记 → 前端&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在 frontmatter 中这样配置：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;categories&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;笔记&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; 前端&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;配色定制&lt;a href=&quot;#配色定制&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;CSS 变量&lt;a href=&quot;#css-变量&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;主题颜色通过 CSS 变量定义，位于 &lt;code&gt;src/styles/index.css&lt;/code&gt;：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;root&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --primary-color&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; #&lt;/span&gt;&lt;span&gt;ff6b9d&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --secondary-color&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; #&lt;/span&gt;&lt;span&gt;7dd3fc&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  /* ...更多变量 */&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;dark&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --primary-color&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; #&lt;/span&gt;&lt;span&gt;f472b6&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --secondary-color&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; #&lt;/span&gt;&lt;span&gt;38bdf8&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Tailwind 配置&lt;a href=&quot;#tailwind-配置&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;编辑 &lt;code&gt;tailwind.config.ts&lt;/code&gt; 自定义主题：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; default&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  theme&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    extend&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      colors&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        primary&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &apos;var(--primary-color)&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        secondary&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &apos;var(--secondary-color)&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      },&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;布局调整&lt;a href=&quot;#布局调整&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;内容宽度&lt;a href=&quot;#内容宽度&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;src/constants/layout.ts&lt;/code&gt; 中调整布局常量：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; const&lt;/span&gt;&lt;span&gt; LAYOUT &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  maxWidth&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &apos;1200px&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  sidebarWidth&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &apos;300px&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  contentPadding&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &apos;1.5rem&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;响应式断点&lt;a href=&quot;#响应式断点&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;主题使用 Tailwind 的默认断点：&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;sm&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;md&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;lg&lt;/td&gt;&lt;td&gt;1024px&lt;/td&gt;&lt;td&gt;桌面&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;xl&lt;/td&gt;&lt;td&gt;1280px&lt;/td&gt;&lt;td&gt;大屏幕&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;动画效果&lt;a href=&quot;#动画效果&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;Motion 配置&lt;a href=&quot;#motion-配置&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;动画使用 Motion 库，配置位于 &lt;code&gt;src/constants/anim/&lt;/code&gt;：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;// spring.ts - 弹簧动画&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; const&lt;/span&gt;&lt;span&gt; springConfig &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  stiffness&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 100&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  damping&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 10&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// variants.ts - 动画变体&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; const&lt;/span&gt;&lt;span&gt; fadeIn &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  hidden&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; opacity&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  visible&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; opacity&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;禁用动画&lt;a href=&quot;#禁用动画&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;对于偏好减少动画的用户，主题会自动响应 &lt;code&gt;prefers-reduced-motion&lt;/code&gt; 媒体查询。&lt;/p&gt;
&lt;h2&gt;圣诞特效&lt;a href=&quot;#圣诞特效&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;主题内置可选的圣诞特效，在 &lt;code&gt;site-config.ts&lt;/code&gt; 中配置：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; const&lt;/span&gt;&lt;span&gt; christmasConfig &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  enabled&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;  // 设为 true 启用&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  features&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    snowfall&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;        // 雪花飘落&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    christmasColorScheme&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;  // 圣诞配色&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    christmasHat&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;    // 圣诞帽&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;通过修改以上配置，你可以轻松打造属于自己风格的博客。如有问题，欢迎在 GitHub 提 Issue。&lt;/p&gt;</content:encoded><category>category:笔记</category><category>category:前端</category><category>tag:定制</category><category>tag:CSS</category><category>tag:Tailwind</category></item></channel></rss>