<?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://atechark.com</link><item><title>deepseek-v4.1-flash论文阅读笔记</title><link>https://atechark.com/post/deepseek-v4-1-flash</link><guid isPermaLink="false">deepseek-v4-1-flash</guid><description>展示如何设置文章关键词。</description><pubDate>Wed, 28 Oct 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;论文链接 &lt;a href=&quot;https://arxiv.org/pdf/2609.19969&quot;&gt;deepseek-v4.1&lt;/a&gt;&lt;/p&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;date: 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;/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;
&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;p&gt;随着长周期智能体（Long-horizon Agents）的广泛应用，模型工作负载正变得越来越依赖输入处理。尽管此前的研究已经大幅降低了长上下文计算的成本，但 Prefill（预填充）阶段仍然具有较高的计算开销，而庞大的 KV Cache（键值缓存）则持续给 HBM（高带宽内存）和 SSD 的存储容量及数据传输带宽带来巨大压力。计算、存储和带宽方面的综合需求，已成为进一步降低模型部署成本的主要瓶颈。
为解决这一挑战，我们推出了 DeepSeek-V4.1-Flash，这是一款多模态混合专家模型（Mixture-of-Experts，MoE），拥有 5520 亿（552B）骨干网络参数，支持最长 100 万 Token 的上下文窗口。
通过采用因果编码器—解码器（Causal Encoder-Decoder，CED）架构，该模型在 Decode（解码）阶段每个 Token 激活 160 亿（16B）参数，而在 Prefill（预填充）阶段每个 Token 仅激活 80 亿（8B）参数，从而显著提升了面向智能体工作负载的成本效率。
为了进一步突破 KV Cache 压缩的极限，DeepSeek-V4.1-Flash 将压缩稀疏注意力机制 2（Compressed Sparse Attention 2，CSA2）中的跨层 KV Cache 复用技术与 FP4 KV Cache 相结合。这些设计将其全局 KV Cache 占用量（始终存储在 HBM 中）降低至每个 Token 890 字节，约为 DeepSeek-V4-Flash 对应占用量的四分之一。
此外，通过一项专门的部署优化技术——SWA Bounded Replay（滑动窗口注意力有界重放），DeepSeek-V4.1-Flash 将其持久化 KV Cache 的占用量（始终存储在 SSD 或主机内存中）降低至 DeepSeek-V4-Flash 的约八分之一。
尽管 KV Cache 占用量大幅减少，该模型的性能仍然显著优于基线模型。
此外，我们对 DeepSeek-V4 架构进行了精简，并引入了多项高效的架构扩展。在预训练阶段，DeepSeek-V4.1-Flash 使用了包含 45 万亿（45T）Token 的多模态语料库。随后，我们开展了全面的后训练，使模型在多种基于文本和多模态的智能体应用场景中均表现出色。
模型文件（Model Checkpoints）现已开放获取：&lt;a href=&quot;https://huggingface.co/deepseek-ai/DeepSeek-V4.1-Flash&quot;&gt;https://huggingface.co/deepseek-ai/DeepSeek-V4.1-Flash&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;The widespread adoption of long-horizon agents has made model workloads increasingly inputheavy. Although prior work has substantially reduced the cost of long-context computation,
prefill remains computationally expensive, and large KV caches continue to strain HBM and
SSD capacity and data-transfer bandwidth. Together, these compute, storage, and bandwidth
demands constitute the primary bottleneck to further lowering deployment costs. To address
this challenge, we introduce DeepSeek-V4.1-Flash, a multimodal Mixture-of-Experts (MoE)
model with 552B backbone parameters and support for contexts of up to one million tokens.
With its Causal Encoder-Decoder (CED) architecture, the model activates 16B parameters
per token during decode but only 8B parameters during prefill, substantially improving cost
efficiency for agentic workloads. To push the limits of KV cache compression, DeepSeek-V4.1-
Flash combines cross-layer KV cache reuse in Compressed Sparse Attention 2 (CSA2) with FP4
KV caching. These designs reduce its global KV cache footprint (always in HBM) to 890 bytes
per token, roughly 1/4 of the corresponding footprint of DeepSeek-V4-Flash. Further, through
a dedicated deployment optimization known as SWA Bounded Replay, DeepSeek-V4.1-Flash
reduces its persistent KV cache footprint (always on SSD or in host memory) to roughly 1/8 of
that of DeepSeek-V4-Flash. Despite its much smaller KV cache footprint, the model delivers
substantially better performance than the baseline. In addition, we streamline the DeepSeek-V4
architecture and introduce several efficient architectural extensions. We pretrain DeepSeek-V4.1-
Flash on a multimodal corpus comprising 45T tokens and conduct comprehensive post-training,
yielding strong performance across diverse text-based and multimodal agentic scenarios. Model
checkpoints are available at &lt;a href=&quot;https://huggingface.co/deepseek-ai/DeepSeek-V4.1-Flash&quot;&gt;https://huggingface.co/deepseek-ai/DeepSeek-V4.1-Flash&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr /&gt;
&lt;h1&gt;Introduction&lt;a href=&quot;#introduction&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;Applications of long-horizon agents have expanded rapidly in recent years, making ultra-longcontext processing an increasingly important model workload. Supporting such workloads
requires not only efficient long-sequence processing, but also the persistent storage, reuse,
and transfer of large KV caches. KV cache management has therefore become a foundational
capability for model deployment, while introducing substantial challenges across computation,
storage, and communication. Prior advances in sparse attention (DeepSeek-AI, 2025, 2026b) have
significantly reduced the computational cost of long-sequence processing, making persistent
storage and data movement increasingly prominent bottlenecks.&lt;/p&gt;
&lt;p&gt;Specifically, DeepSeek-V4 (DeepSeek-AI, 2026b) combines a global attention branch spanning
the full context with local Sliding-Window Attention (SWA). The global branch maintains global
KV, comprising main KV and indexer K, while SWA maintains local KV states. For a fixed
window size, SWA KV storage is bounded independently of sequence length. For sufficiently
long sequences, global KV therefore dominates the runtime KV footprint, which is constrained
by HBM capacity. In addition, certain KV are persisted for prefix reuse, referred to as persistent
KV caches, which are constrained by SSD and host memory capacity. I/O and interconnect
bandwidth also limit cache migration and loading. Together, these constraints limit serving
throughput, increase deployment costs, and ultimately hinder the deployment and adoption of
agents over longer task horizons and across broader application scenarios.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr /&gt;
&lt;p&gt;基于开源的model.py生成的模型结构&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;Transformer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  (&lt;/span&gt;&lt;span&gt;embed&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ParallelEmbedding&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  (&lt;/span&gt;&lt;span&gt;layers&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ModuleList&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&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Block&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;attn&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Attention&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wq_a&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;q_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wq_b&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ColumnParallelLinear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wkv&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;kv_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wo_a&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ColumnParallelLinear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wo_b&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RowParallelLinear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;ffn&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; MoE&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;gate&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Gate&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;experts&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ModuleList&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&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;7&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; 8&lt;/span&gt;&lt;span&gt; x &lt;/span&gt;&lt;span&gt;Expert&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            (&lt;/span&gt;&lt;span&gt;w1&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            (&lt;/span&gt;&lt;span&gt;w2&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            (&lt;/span&gt;&lt;span&gt;w3&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;shared_experts&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Expert&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;w1&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;w2&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;w3&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;attn_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;ffn_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&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; Block&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;attn&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Attention&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wq_a&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;q_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wq_b&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ColumnParallelLinear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wkv&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;kv_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wo_a&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ColumnParallelLinear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wo_b&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RowParallelLinear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;compressor&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Compressor&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;wkv&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;wgate&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;indexer&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Indexer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;wq_b&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ColumnParallelLinear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;weights_proj&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ColumnParallelLinear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;wk&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;k_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;ffn&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; MoE&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;gate&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Gate&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;experts&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ModuleList&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&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;7&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; 8&lt;/span&gt;&lt;span&gt; x &lt;/span&gt;&lt;span&gt;Expert&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            (&lt;/span&gt;&lt;span&gt;w1&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            (&lt;/span&gt;&lt;span&gt;w2&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            (&lt;/span&gt;&lt;span&gt;w3&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;shared_experts&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Expert&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;w1&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;w2&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;w3&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;attn_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;ffn_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&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; Block&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;attn&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Attention&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wq_a&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;q_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wq_b&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ColumnParallelLinear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wkv&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;kv_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wo_a&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ColumnParallelLinear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wo_b&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RowParallelLinear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;ffn&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; MoE&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;gate&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Gate&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;experts&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ModuleList&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&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;7&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; 8&lt;/span&gt;&lt;span&gt; x &lt;/span&gt;&lt;span&gt;Expert&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            (&lt;/span&gt;&lt;span&gt;w1&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            (&lt;/span&gt;&lt;span&gt;w2&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            (&lt;/span&gt;&lt;span&gt;w3&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;shared_experts&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Expert&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;w1&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;w2&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;w3&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;attn_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;ffn_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    )&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; Block&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;attn&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Attention&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wq_a&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;q_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wq_b&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ColumnParallelLinear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wkv&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;kv_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wo_a&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ColumnParallelLinear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wo_b&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RowParallelLinear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;compressor&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Compressor&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;wkv&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;indexer&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Indexer&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;wq_b&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ColumnParallelLinear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;weights_proj&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ColumnParallelLinear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;wk&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;k_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;ffn&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; MoE&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;gate&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Gate&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;experts&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ModuleList&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&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;7&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; 8&lt;/span&gt;&lt;span&gt; x &lt;/span&gt;&lt;span&gt;Expert&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            (&lt;/span&gt;&lt;span&gt;w1&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            (&lt;/span&gt;&lt;span&gt;w2&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            (&lt;/span&gt;&lt;span&gt;w3&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;shared_experts&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Expert&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;w1&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;w2&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;w3&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;attn_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;ffn_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    )&lt;/span&gt;&lt;/span&gt;
&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;19&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; 16&lt;/span&gt;&lt;span&gt; x &lt;/span&gt;&lt;span&gt;Block&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;attn&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Attention&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wq_a&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;q_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wq_b&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ColumnParallelLinear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wkv&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;kv_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wo_a&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ColumnParallelLinear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wo_b&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RowParallelLinear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;ffn&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; MoE&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;gate&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Gate&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;experts&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ModuleList&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&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;7&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; 8&lt;/span&gt;&lt;span&gt; x &lt;/span&gt;&lt;span&gt;Expert&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            (&lt;/span&gt;&lt;span&gt;w1&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            (&lt;/span&gt;&lt;span&gt;w2&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            (&lt;/span&gt;&lt;span&gt;w3&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;shared_experts&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Expert&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;w1&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;w2&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;w3&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;attn_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;ffn_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  (&lt;/span&gt;&lt;span&gt;norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  (&lt;/span&gt;&lt;span&gt;head&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ParallelHead&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  (&lt;/span&gt;&lt;span&gt;mtp&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ModuleList&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&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; DSparkBlock&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;attn&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; DSparkAttention&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wq_a&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;q_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wq_b&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ColumnParallelLinear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wkv&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;kv_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wo_a&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ColumnParallelLinear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;wo_b&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RowParallelLinear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;ffn&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; MoE&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;gate&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Gate&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;experts&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ModuleList&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&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;7&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; 8&lt;/span&gt;&lt;span&gt; x &lt;/span&gt;&lt;span&gt;Expert&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            (&lt;/span&gt;&lt;span&gt;w1&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            (&lt;/span&gt;&lt;span&gt;w2&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            (&lt;/span&gt;&lt;span&gt;w3&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;shared_experts&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Expert&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;w1&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;w2&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          (&lt;/span&gt;&lt;span&gt;w3&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;attn_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;ffn_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;main_proj&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;main_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; RMSNorm&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;markov_head&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; DSparkMarkovHead&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;embed&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ParallelEmbedding&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;head&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ParallelHead&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;confidence_head&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; DSparkConfidenceHead&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;proj&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; Linear&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;embed&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ParallelEmbedding&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      (&lt;/span&gt;&lt;span&gt;head&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;span&gt; ParallelHead&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    )&lt;/span&gt;&lt;/span&gt;
&lt;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;
</content:encoded><category>category:笔记</category><category>tag:论文</category></item><item><title>从 Astro 5 到 Astro 6：astro-koharu 的一次完整迁移实录</title><link>https://atechark.com/post/astro-6-migration</link><guid isPermaLink="false">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://atechark.com/post/container-queries</link><guid isPermaLink="false">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://atechark.com/post/markdown-pipeline</link><guid isPermaLink="false">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://atechark.com/post/rainy-afternoon</link><guid isPermaLink="false">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://atechark.com/post/custom-keywords_a</link><guid isPermaLink="false">custom-keywords_a</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;date: 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;/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://atechark.com/post/note/encrypted-post-demo</link><guid isPermaLink="false">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://atechark.com/post/note/shoka-features</link><guid isPermaLink="false">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://atechark.com/post/infographic-guide</link><guid isPermaLink="false">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://atechark.com/post/year-in-review-2025</link><guid isPermaLink="false">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://atechark.com/post/astro-koharu-guide</link><guid isPermaLink="false">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://atechark.com/post/partial-encryption</link><guid isPermaLink="false">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://atechark.com/post/bayes-quiz</link><guid isPermaLink="false">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://atechark.com/post/weekly-example-3</link><guid isPermaLink="false">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://atechark.com/post/weekly-example-2</link><guid isPermaLink="false">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://atechark.com/post/tailwind-v4-upgrade-notes</link><guid isPermaLink="false">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://atechark.com/post/oshi-no-ko-season-2</link><guid isPermaLink="false">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://atechark.com/post/toc-no-numbering</link><guid isPermaLink="false">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;第一章&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;1.1. 第一节&lt;/li&gt;
&lt;li&gt;1.2. 第二节&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;第二章&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://atechark.com/post/hello-world</link><guid isPermaLink="false">hello-world</guid><description>你好，世界！这是我的第一篇随笔。
关于这篇文章
这篇文章故意没有设置 description 字段，用于测试以下功能：

自动描述提取 - 系统会自动从正文提取前 150 字作为描述
AI 摘要 - 如果运行了 pnpm generate:summaries，会使用 AI 生成的摘要

随笔分类</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://atechark.com/post/weekly-example-1</link><guid isPermaLink="false">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></channel></rss>