<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>喵斯基部落</title><description>运维之美，在乎折腾与分享</description><link>https://blog.moewah.com/</link><templateTheme>Firefly</templateTheme><templateThemeVersion>6.9.4</templateThemeVersion><templateThemeUrl>https://github.com/CuteLeaf/Firefly</templateThemeUrl><lastBuildDate>2026年6月17日 00:58:58</lastBuildDate><item><title>告别国内 AI 订阅生态：OpenCode Go 接入 Claude Code 部署全流程</title><link>https://blog.moewah.com/posts/opencode-go-claude-code-setup/</link><guid isPermaLink="true">https://blog.moewah.com/posts/opencode-go-claude-code-setup/</guid><description>受不了国内 AI 订阅服务的封号和收割？用 OpenCode Go 每月 10 刀平替，通过 oc-go-cc 代理接入 Claude Code 的完整部署教程，附带多 Agent 省 token 方案。</description><pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;DeepSeek-V4-Pro、GLM5.1、Kimi-K2.6、Qwen3.7-Max——这些国产一线模型，我其实都挺看好的。有的在中文理解上比 GPT 还顺手，有的代码生成追得很紧。模型本身不差。&lt;/p&gt;&lt;p&gt;但把这些模型包成服务的那些平台，一个比一个离谱。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;opencode-go-claude-code-setup&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;619&quot; src=&quot;/_astro/opencode-go-claude-code-setup.BB81ceAY_17aY8F.webp&quot; srcset=&quot;/_astro/opencode-go-claude-code-setup.BB81ceAY_1SpiGm.webp 640w, /_astro/opencode-go-claude-code-setup.BB81ceAY_Z2qM7xF.webp 750w, /_astro/opencode-go-claude-code-setup.BB81ceAY_ZGzwAf.webp 828w, /_astro/opencode-go-claude-code-setup.BB81ceAY_17aY8F.webp 1080w&quot; /&gt;&lt;figcaption&gt;opencode-go-claude-code-setup&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;封号说封就封。你今天充了年费，明天可能就登不上去了——没解释，没预警，申诉渠道形同虚设。规则朝令夕改是常态，月初 Coding Plan 卖得火热，月底直接砍掉换 Token Plan，契约精神？不存在的。&lt;/p&gt;&lt;p&gt;慢。&lt;/p&gt;&lt;p&gt;高峰期 API 响应拉到十几秒，报错率比成功率还高。不是偶尔抖一下，是稳定地慢，稳定地崩。这不是在写代码，是在修炼耐心。&lt;/p&gt;&lt;p&gt;我对模型没有意见。我的愤怒，是冲着那些把好模型包成烂服务的平台去的。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;只有 DeepSeek&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;deepseek&quot; loading=&quot;lazy&quot; width=&quot;1808&quot; height=&quot;1064&quot; src=&quot;/_astro/deepseek.CDYpzBHG_Z2bPajB.webp&quot; srcset=&quot;/_astro/deepseek.CDYpzBHG_ZTeGXb.webp 640w, /_astro/deepseek.CDYpzBHG_Z2jshn6.webp 750w, /_astro/deepseek.CDYpzBHG_Z1YPQJw.webp 828w, /_astro/deepseek.CDYpzBHG_2aOU3R.webp 1080w, /_astro/deepseek.CDYpzBHG_ZhouhA.webp 1280w, /_astro/deepseek.CDYpzBHG_1Iirke.webp 1668w, /_astro/deepseek.CDYpzBHG_Z2bPajB.webp 1808w&quot; /&gt;&lt;figcaption&gt;deepseek&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;别的厂火急火燎上线 Token Plan 收割，DeepSeek 反手一个 &lt;strong&gt;2.5 折永久降价&lt;/strong&gt;。不饥饿营销，不玩文字游戏。这种体面，在国内 AI 订阅市场是稀有物种。&lt;/p&gt;&lt;p&gt;但 DeepSeek 只是一家。它解决不了整个生态的问题。我需要一个能彻底脱离这套体系的东西——不只是换一家服务商，是换一种玩法。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;OpenCode Go：能打的过渡方案&lt;a href=&quot;#opencode-go能打的过渡方案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://opencode.ai/go?ref=WAQ03GAAVM&quot; target=&quot;_blank&quot;&gt;OpenCode Go&lt;/a&gt; 是我目前找到最实际的出口。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;opencode-1&quot; loading=&quot;lazy&quot; width=&quot;2112&quot; height=&quot;934&quot; src=&quot;/_astro/opencode-1.CY19rAol_bHQMm.webp&quot; srcset=&quot;/_astro/opencode-1.CY19rAol_7SJkP.webp 640w, /_astro/opencode-1.CY19rAol_Z12yHmW.webp 750w, /_astro/opencode-1.CY19rAol_ZmuaCR.webp 828w, /_astro/opencode-1.CY19rAol_1DGzj6.webp 1080w, /_astro/opencode-1.CY19rAol_Z22vLUG.webp 1280w, /_astro/opencode-1.CY19rAol_1TwVbx.webp 1668w, /_astro/opencode-1.CY19rAol_E1mqe.webp 2048w, /_astro/opencode-1.CY19rAol_bHQMm.webp 2112w&quot; /&gt;&lt;figcaption&gt;opencode-1&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;首月 5 刀，续费 10 刀/月&lt;/strong&gt;，无代理工具限制。用&lt;a href=&quot;https://opencode.ai/go?ref=WAQ03GAAVM&quot; target=&quot;_blank&quot;&gt;这个链接&lt;/a&gt;订阅还能额外拿 5 刀额度。拿国内那几家动辄 200 软妹币对比——我订两个 OpenCode Go 账号加起来都比那便宜一截。&lt;/p&gt;&lt;p&gt;新模型跟进速度也够快，开源模型一发布几乎第一时间就能用，不用等厂商排期。主流 Agent 支持也到位：Hermes-Agent、Pi、OpenCode、OpenClaw、LobeHub、ChatWise——都直接接入，不需要中间层折腾。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;opencode-2&quot; loading=&quot;lazy&quot; width=&quot;2128&quot; height=&quot;1074&quot; src=&quot;/_astro/opencode-2.B07ga1lh_19uV2Y.webp&quot; srcset=&quot;/_astro/opencode-2.B07ga1lh_1ES7Ki.webp 640w, /_astro/opencode-2.B07ga1lh_Z24TG2M.webp 750w, /_astro/opencode-2.B07ga1lh_Z1oNr4y.webp 828w, /_astro/opencode-2.B07ga1lh_ZnSFm1.webp 1080w, /_astro/opencode-2.B07ga1lh_1kVsuX.webp 1280w, /_astro/opencode-2.B07ga1lh_DhBs6.webp 1668w, /_astro/opencode-2.B07ga1lh_Z1HA6cC.webp 2048w, /_astro/opencode-2.B07ga1lh_19uV2Y.webp 2128w&quot; /&gt;&lt;figcaption&gt;opencode-2&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;算一笔账：一个月 10 刀，折人民币 70 出头。国内随便一个像样的订阅套餐 200 元起步，额度还用不完——月消耗只有 10%-20% 的大有人在，等于每个月白扔一百多块。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;但 Claude Code 连不上&lt;a href=&quot;#但-claude-code-连不上&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;说得这么好，坑在哪？&lt;/p&gt;&lt;p&gt;OpenCode Go 的 API 对 Anthropic 格式支持不够，直接接入 Claude Code 会报错。这是目前最大的硬伤。&lt;/p&gt;&lt;p&gt;不是无解。社区里有三个项目在补这个坑：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/farion1231/cc-switch&quot; target=&quot;_blank&quot;&gt;cc-switch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/samueltuyizere/oc-go-cc&quot; target=&quot;_blank&quot;&gt;oc-go-cc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Lordymine/opencode-go-cli&quot; target=&quot;_blank&quot;&gt;opencode-go-cli&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;综合更新频率和个人偏好，我选了 oc-go-cc。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;OC-GO-CC 部署：6 步搞定&lt;a href=&quot;#oc-go-cc-部署6-步搞定&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;oc-go-cc 是一个 Go CLI 代理，拦截 Claude Code 的 Anthropic API 请求，转成 OpenAI 格式后发到 OpenCode Go。Claude Code 以为在跟 Anthropic 通信——实际走的是便宜的开源模型。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;cc-go-cc&quot; loading=&quot;lazy&quot; width=&quot;1574&quot; height=&quot;1180&quot; src=&quot;/_astro/cc-go-cc.DeSqFtvv_jzK7N.webp&quot; srcset=&quot;/_astro/cc-go-cc.DeSqFtvv_1eOAhz.webp 640w, /_astro/cc-go-cc.DeSqFtvv_8XSGn.webp 750w, /_astro/cc-go-cc.DeSqFtvv_1LTbo4.webp 828w, /_astro/cc-go-cc.DeSqFtvv_ZKpbXM.webp 1080w, /_astro/cc-go-cc.DeSqFtvv_Z2rQROT.webp 1280w, /_astro/cc-go-cc.DeSqFtvv_jzK7N.webp 1574w&quot; /&gt;&lt;figcaption&gt;cc-go-cc&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;section&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;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# macOS / Linux&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;brew tap samueltuyizere/tap &amp;amp;&amp;amp; brew install oc-go-cc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Windows&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;scoop bucket add oc-go-cc https://github.com/samueltuyizere/scoop-bucket &amp;amp;&amp;amp; scoop install oc-go-cc&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;oc-go-cc init&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;默认生成配置文件 &lt;code&gt;~/.config/oc-go-cc/config.json&lt;/code&gt;，编辑添加你的 OpenCode Go API 密钥，或者设环境变量：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export OC_GO_CC_API_KEY=sk-opencode-your-key-here&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;oc-go-cc serve -b&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4、配置 Claude Code&lt;a href=&quot;#4配置-claude-code&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export ANTHROPIC_BASE_URL=http://127.0.0.1:3456&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export ANTHROPIC_AUTH_TOKEN=unused&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;也可以直接编辑 &lt;code&gt;~/.claude/settings.json&lt;/code&gt;，修改 &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt; 和 &lt;code&gt;ANTHROPIC_AUTH_TOKEN&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5、运行 Claude Code&lt;a href=&quot;#5运行-claude-code&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;claude&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;进入后输入提示词做简单对话测试。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6、开机自启动&lt;a href=&quot;#6开机自启动&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;oc-go-cc autostart enable&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这里有个坑需要提一下，服务自启动脚本无法通过环境变量获取 &lt;code&gt;$OC_GO_CC_API_KEY&lt;/code&gt;而导致服务自启动成功但却无法使用 cc，解决方案我给两个：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;建议直接将 OpenCode Go 订阅的 api_key 以硬编码形式直接写入到 配置文件 &lt;code&gt;~/.config/oc-go-cc/config.json&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;若一定要通过环境变量 &lt;code&gt;$OC_GO_CC_API_KEY&lt;/code&gt; ，可以避开自启动脚本，使用 shell alias 方式，在 &lt;code&gt;~/.zshrc&lt;/code&gt; 中增加下面这一行 ：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;alias cc=&quot;oc-go-cc serve -b &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; sleep 5; claude --permission-mode bypassPermissions&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;然后 &lt;code&gt;source ~/.zshrc&lt;/code&gt;，运行 cc 命令即可启动。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;oc-go-cc serve              # 启动代理服务&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;oc-go-cc serve -b           # 后台运行（脱离终端）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;oc-go-cc serve --port 8080  # 自定义端口&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;oc-go-cc stop               # 停止服务&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;oc-go-cc status             # 检查运行状态&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;oc-go-cc init               # 创建配置文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;oc-go-cc validate           # 验证配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;oc-go-cc models             # 查看可用模型列表&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;oc-go-cc autostart enable   # 开启开机自启&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;oc-go-cc autostart disable  # 关闭开机自启&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;oc-go-cc autostart status   # 查看自启状态&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;oc-go-cc --version          # 查看版本&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三个 Agent，两个订阅&lt;a href=&quot;#三个-agent两个订阅&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我现在日常用三个 Agent：Hermes-Agent、Claude Code、Pi。&lt;/p&gt;&lt;p&gt;Pi 是目前最对我胃口的编码 Agent。设计精简、省 token、扩展性强——玩 Pi 的过程像在搭乐高，社区插件生态长得飞快。在 OpenRouter 上已经杀进前五了。赶工时我会切回 Claude Code，但日常开发 Pi 完全够用。&lt;/p&gt;&lt;p&gt;省 token 这件事上，&lt;strong&gt;Pi 的设计哲学本身就赢了一半&lt;/strong&gt;。上下文管理克制，不会像某些 Agent 那样一个会话就把额度烧光。同样的编码任务，Pi 的 token 消耗大概只有其他 Agent 的六到七成。&lt;/p&gt;&lt;p&gt;一个 OpenCode Go 订阅喂三个 Agent，额度确实有点紧。&lt;/p&gt;&lt;p&gt;我订了两个 Go 会员，API Key 轮询切换。用 Pi 的话推荐装一个 &lt;a href=&quot;https://github.com/lnilluv/pi-opencode-go-rotation&quot; target=&quot;_blank&quot;&gt;pi-opencode-go-rotation&lt;/a&gt;，自动检测速率限制后在多个 Key 之间切换：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pi install npm:@lnilluv/pi-opencode-go-rotation&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 进入 Pi，添加多个 Key&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/opencode add personal sk-xxxx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/opencode add work sk-yyyy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/opencode add backup sk-zzzz&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;两个订阅轮着用，一个月下来没再遇到额度焦虑——比之前单订阅国内某厂 200 块套餐还省心。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;Q：OpenCode Go 适合谁？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A：两类人。国内 200 元档订阅但月消耗只有 10%-20% 的轻度用户，以及怕封号、需要灵活切换多个模型进行文字协作和轻度编码的群体。如果你是重度编码、每天烧几百 M token 的，这个方案可能不太够——但那个用量，国内套餐一样扛不住。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：怎么控制 Token 消耗？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A：四条。提示词别写废话，同一个会话别串不相关的任务，简单的编码场景优先用 Pi，切记按需合理化配比SKILL和TOOL。控制上下文长度既能省钱，还能减少幻觉——上下文越长，模型越容易跑偏。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：MoeWah 推荐的 Pi 插件安装清单&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A：以下是我常用的 Pi 插件：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pi-powerline-footer&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pi-goal&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pi-btw&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pi-web-access&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pi-mcp-adapter&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pi-simplify&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pi-context-prune&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@devkade/pi-plan&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@tintinweb/pi-tasks&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pi-caveman&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@tintinweb/pi-subagents&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pi-schedule-prompt&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@juicesharp/rpiv-ask-user-question&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pi-markdown-preview&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@ff-labs/pi-fff&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pi-autoresearch&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded></item><item><title>博客关键词排名怎么做？从挖词到内容修剪的实战策略</title><link>https://blog.moewah.com/posts/blog-keyword-ranking-strategy-small-site-seo/</link><guid isPermaLink="true">https://blog.moewah.com/posts/blog-keyword-ranking-strategy-small-site-seo/</guid><description>博客关键词排名怎么做？避开高竞争词，用GSC正则批量挖掘中低难度长尾词。详解搜索意图判断、难度分阶策略、内容修剪三步法。七年实战复盘，选词与内容优化双线推进。</description><pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;之前翻 GSC 数据的时候，我发现一个挺扎心的数字。&lt;/p&gt;
&lt;p&gt;博客玩了几年时间，80% 的流量来自 20% 的页面。剩下 80% 的内容呢？展示量寥寥无几，排名在第三页开外晃悠，像个养不熟的白眼狼。我当时就在想，这些页面到底是该删，还是该救。&lt;/p&gt;
&lt;p&gt;后来我花了一些时间，把这套逻辑跑通了。现在想跟大家聊聊，特别是个人博客及新站点在 SEO 这件事上，到底该怎么玩。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&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;SEO 圈子里有句话，大公司停止尝试的地方，就是机会窗口。&lt;/p&gt;&lt;p&gt;这不是鸡汤，是事实。&lt;/p&gt;&lt;p&gt;大公司的内容团队，要么追求快速出结果，要么被 KPI 绑着去做流量词。那些搜索量小、竞争度低的长尾词，他们看不上。&lt;/p&gt;&lt;p&gt;但是不是所有词都值得做呢？也不是。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;避开高竞争词，批量挖掘低难度长尾，是唯一可行的路径。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这里有个数字挺有意思。Ahrefs 做过一项研究，超过 90% 的页面拿不到任何搜索流量（来源：&lt;a href=&quot;https://ahrefs.com/blog/search-traffic-study/&quot; target=&quot;_blank&quot;&gt;Ahrefs 博客&lt;/a&gt;）。为什么？因为大部分人在抢那几个头部词。&lt;/p&gt;&lt;p&gt;长尾词的优势在于，大公司懒得做，竞争对手又不多。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;strong&gt;先说一个误区：很多人只盯着 GSC 里的词。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;GSC 筛出来的词，本质上是本站已经有展示的词。对于小站点来说，真正的增量空间往往在本站还没覆盖的长尾词。&lt;/p&gt;&lt;p&gt;所以我把找词分成两条路径： &lt;strong&gt;存量优化&lt;/strong&gt; （提升已有页面）和 &lt;strong&gt;增量挖掘&lt;/strong&gt; （找新机会）。&lt;/p&gt;&lt;hr /&gt;&lt;section&gt;&lt;h3&gt;存量优化：GSC 正则表达式筛词（免费）&lt;a href=&quot;#存量优化gsc-正则表达式筛词免费&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;2025 年 4 月，GSC 新增了正则表达式筛词功能。这个功能很多人不知道，但非常好用。直接在 GSC 内筛选长尾词，不用导出到 Excel。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第一步：打开 GSC，进入效果报告&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;登录 &lt;a href=&quot;https://search.google.com/search-console&quot; target=&quot;_blank&quot;&gt;Google Search Console&lt;/a&gt;，点击左侧”效果”。这里能看到你网站所有关键词的展示量、点击量、排名。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第二步：时间范围拉长到 12-16 个月&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;默认是 3 个月，数据太少。把时间范围改成 12 个月或 16 个月，能看到更完整的关键词表现趋势。2025 年 GSC 还新增了每周/每月维度数据，查看趋势更方便。&lt;/p&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;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&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;span&gt;*&lt;/span&gt;&lt;span&gt;\s&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;{4,}?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这个表达式的作用：筛选字数大于 4 的关键词。4 可以改成 5 或 6，根据你的需求调整。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;筛问题类关键词的表达式：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;^&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;who&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;what&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;where&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;when&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;why&lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;how&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&quot; &quot;]&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这样能筛出”怎么……&quot;&quot;什么是……”这类问题型长尾词。&lt;/p&gt;&lt;p&gt;点击”应用”，GSC 会直接显示筛选结果。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第四步：按展示量排序，找出机会词&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;筛出来的长尾词，按展示量排序。重点关注展示量在 10-100 之间的词。&lt;/p&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;新站（DA &amp;lt; 20）：KD 0-20，成功率 68%&lt;/li&gt;
&lt;li&gt;积累期小站（DA 20-40）：KD 15-30，成功率 42-50%&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;（数据来源：&lt;a href=&quot;https://www.ranktracker.com/zh/blog/keyword-difficulty-statistics-2025&quot; target=&quot;_blank&quot;&gt;RankTracker KD 统计报告&lt;/a&gt;，SEMrush/Ahrefs/Moz 2024）&lt;/p&gt;&lt;p&gt;词长 ≥ 4，展示量 10-100。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;看前 10 名的 DR/DA。如果你的 DR 是 20，前 10 名平均 DR 是 50，这个词太难了。&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;这套流程跑一遍，大概 5 分钟。适合优化已有页面，提升排名。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&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;长尾词的选择标准：词数 ≥ 4，搜索量 100-500。难度分阶段：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;新站起步期（DA &amp;lt; 20）：KD 0-20&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这个区间成功率 68%，排名周期 3-4 个月（数据来源同上）。&lt;/p&gt;&lt;p&gt;太低难度（KD &amp;lt; 5）的词虽然容易排，但搜索量通常只有几十，性价比不高。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;积累期小站（DA 20-40）：KD 15-30&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;有一定内容和外链积累后，可以尝试中等难度。成功率 42-50%，排名周期 4-6 个月（同上）。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;为什么不建议新站直接做 KD 30+？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;DA 15 的网站做 KD 35 的词，成功率只有 15%（同上）。付出同样的努力，不如选 KD 15 的词，成功率 60%+。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;核心原则：难度要与网站权重匹配。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;用 &lt;a href=&quot;https://semrush.com&quot; target=&quot;_blank&quot;&gt;Semrush&lt;/a&gt; 或 Ahrefs 查词时，看一眼前 10 名的 DR/DA。如果你的 DR 是 20，而前 10 名平均 DR 是 50，这个词就太难了。&lt;/p&gt;&lt;p&gt;下面这些方法，都是用来挖这个区间的词。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;方法一：Google 下拉框 + 字母扩展&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这个方法最简单，也是最直接的长尾词来源。&lt;/p&gt;&lt;p&gt;在 Google 搜索框输入你的主关键词，看下拉推荐。这些词都是用户真实搜索过的，搜索量不大，但竞争低。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;更进阶的做法：字母扩展。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;比如你做假发站，输入”human wigs a”，看推荐词。再输入”human wigs b”，依次扩展到 z。&lt;/p&gt;&lt;p&gt;这样能挖出一批长尾词，比如：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;human wigs affordable&lt;/li&gt;
&lt;li&gt;human wigs blonde&lt;/li&gt;
&lt;li&gt;human wigs curly texture&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;每个字母组合都是潜在的长尾词。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;方法二：Google 相关搜索 + People Also Ask&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;搜索结果页底部有”相关搜索”，这是 Google 推荐的长尾词。&lt;/p&gt;&lt;p&gt;还有一个地方很多人忽略：搜索结果中间的”人们还在问”（People Also Ask）。&lt;/p&gt;&lt;p&gt;比如搜”LM Studio”，会出现这些问题：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;LM Studio 怎么下载模型？&lt;/li&gt;
&lt;li&gt;LM Studio 支持哪些模型格式？&lt;/li&gt;
&lt;li&gt;LM Studio 下载速度慢怎么办？&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这些都是问题类长尾词，用户意图非常明确。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;方法三：AnswerThePublic（问题类长尾词）&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://answerthepublic.com&quot; target=&quot;_blank&quot;&gt;AnswerThePublic&lt;/a&gt; 是专门挖掘问题类长尾词的工具。&lt;/p&gt;&lt;p&gt;输入一个关键词，它会生成一堆问题短语：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;how to…&lt;/li&gt;
&lt;li&gt;what is…&lt;/li&gt;
&lt;li&gt;where can I…&lt;/li&gt;
&lt;li&gt;why does…&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这些问题的搜索量通常很低，但转化率高。因为用户在问具体问题，说明需求明确。&lt;/p&gt;&lt;p&gt;每天免费额度有限，建议配合 Google 下拉框一起用。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;方法四：Reddit / Quora / 论坛挖词&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这个方法很多人不知道，但效果很好。&lt;/p&gt;&lt;p&gt;去 Reddit 或 Quora 搜你的关键词，看用户在问什么问题。&lt;/p&gt;&lt;p&gt;比如在 Reddit 搜”NAS”，会看到这些问题：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Which NAS for home backup?&lt;/li&gt;
&lt;li&gt;Synology vs QNAP for Plex?&lt;/li&gt;
&lt;li&gt;Best budget NAS 2025?&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这些问题都是真实用户提问。Google 会优先展示 UGC 内容（用户生成内容），因为这类内容贴近用户需求。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;长尾词的一个规律：如果 Reddit/Quora 排在 Google 前三，说明这个词竞争度不高。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;你可以写一篇更详细的教程，把这些问答内容整合进去，很容易超越他们。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;方法五：竞品长尾词筛选（付费工具）&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;用 Ahrefs 或 Semrush，查竞品的页面。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;筛选条件：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;词数 ≥ 4（长尾词特征）&lt;/li&gt;
&lt;li&gt;搜索量 100-500（有流量价值）&lt;/li&gt;
&lt;li&gt;KD 0-20（新站）或 KD 15-30（积累期小站）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;导出来，看竞品有排名但你没有的词。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;重要：看前 10 名的 DR/DA。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果竞品 DR 是 40，你的 DR 是 15，这个词你暂时做不了。优先选择前 10 名 DR 与你相近的词。&lt;/p&gt;&lt;p&gt;这是 content gap —— 内容缺口。补上这些缺口，就是增量流量。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;有个注意事项：永远不要相信关键词工具的搜索量数据。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://ads.google.com/home/tools/keyword-planner/&quot; target=&quot;_blank&quot;&gt;Google Keyword Planner&lt;/a&gt;、Ahrefs、Semrush 的搜索量都是估算。真正准确的，是你把这个词做上去之后，Google Search Console 显示的实际展示量。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;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;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;/td&gt;&lt;td&gt;教程、指南、问答、对比文章&lt;/td&gt;&lt;td&gt;”怎么……&quot;&quot;什么是……&quot;&quot;XX vs XX”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;导航类&lt;/td&gt;&lt;td&gt;找某个网站、品牌、工具&lt;/td&gt;&lt;td&gt;工具推荐、品牌介绍页、评测&lt;/td&gt;&lt;td&gt;”最好的XX工具&quot;&quot;XX官网”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;交易类&lt;/td&gt;&lt;td&gt;想买、想下载、想注册&lt;/td&gt;&lt;td&gt;产品页、测评、优惠信息、下载页&lt;/td&gt;&lt;td&gt;”XX价格&quot;&quot;XX下载&quot;&quot;哪里买XX”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;本地类&lt;/td&gt;&lt;td&gt;找附近的店、服务&lt;/td&gt;&lt;td&gt;本地服务页、门店信息、地图优化&lt;/td&gt;&lt;td&gt;”XX附近的……&quot;&quot;XX哪家好”&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;判断方法很简单：把关键词丢进 Google，看前三名的结果类型。&lt;/p&gt;&lt;p&gt;如果前三名都是教程文章，那就是信息类，你写教程。如果前三名都是产品页，那就是交易类，你写测评或产品介绍。&lt;/p&gt;&lt;p&gt;举个例子。我在 GSC 里筛到一个词：“LM Studio 下载模型慢”。&lt;/p&gt;&lt;p&gt;丢进 Google，前三名都是教程类文章：hosts 文件修改、网络代理配置、DNS 解析优化。这就说明搜索意图是信息类，用户遇到了下载慢的问题，想找解决方案。&lt;/p&gt;&lt;p&gt;于是我写了一篇《&lt;a href=&quot;https://blog.moewah.com/posts/lm-studio-model-download-slow-3-step-hosts-speed-up&quot;&gt;LM Studio 下载模型巨慢？修改 hosts 文件提速&lt;/a&gt;》的教程。结构是：问题现象 → 原因分析（DNS 解析） → 解决步骤（nslookup 查询 + hosts 配置）。&lt;/p&gt;&lt;p&gt;文章发布后，两周内排到了第 1 位。因为这个关键词的搜索意图非常明确：用户要的是”怎么解决”，不是”为什么慢”。&lt;/p&gt;&lt;p&gt;反过来，如果我写成”LM Studio 模型下载原理详解”，用户点进来发现没有解决方案，直接走掉。bounce rate 上去，排名迟早掉。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;搜索意图是内容策略的第一步。判断错了，后面再怎么优化都是浪费。&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;你的博客可能已经有 50 篇、100 篇文章了。每天想新选题、写新内容，累得要死。但流量还是上不去。&lt;/p&gt;&lt;p&gt;我当时也是这样。后来换了个思路： &lt;strong&gt;把精力集中在那 20% 的核心内容上。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;怎么做？两条路径：修剪旧文（取巧），或者写稀缺内容（长期）。&lt;/p&gt;&lt;hr /&gt;&lt;section&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;内容修剪的 ROI，比创作新内容高太多了。&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;th&gt;预期效果&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;第 1 位&lt;/td&gt;&lt;td&gt;前三节铺垫太多，bounce rate 高&lt;/td&gt;&lt;td&gt;重写前三节，直奔主题，补充深度内容（数据、案例、步骤）&lt;/td&gt;&lt;td&gt;排名稳定，流量上涨&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;第二页（11-20 位）&lt;/td&gt;&lt;td&gt;离首页差一点，没人翻到第二页&lt;/td&gt;&lt;td&gt;加 500 字细节 + 3 个内链指向站内优质内容&lt;/td&gt;&lt;td&gt;两周内可能跳到首页&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;90 天零流量&lt;/td&gt;&lt;td&gt;占用爬虫配额，分散权重&lt;/td&gt;&lt;td&gt;删除或 301 重定向到整合后的长文&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;第一种：一篇文章从 1500 字扩到 2500 字，重写前三节后，排名稳住了。&lt;/li&gt;
&lt;li&gt;第二种：13 位的那篇，加 500 字 + 3 个内链，两周跳到第 5 位。&lt;/li&gt;
&lt;li&gt;第三种：硬着心肠删了十几篇零流量文章，整站平均排名上去了。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&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;/p&gt;&lt;p&gt;很多人觉得，流量大的词才是好词。但对于小站点来说，流量大 ≠ 有价值。&lt;/p&gt;&lt;p&gt;我后来发现一个规律： &lt;strong&gt;技术门槛的小众搜索需求 + 自己的经验长处 = 稀缺内容。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;举个例子。我写过一篇《&lt;a href=&quot;https://blog.moewah.com/posts/1301/&quot;&gt;群晖 DSM 7.x SSL 证书自动化部署教程&lt;/a&gt;》。&lt;/p&gt;&lt;p&gt;搜索量很小，但我为什么写？因为 DSM 7.x 的证书机制变了，旧教程失效。我花了两周写了个自动化脚本，把 acme.sh、DNS 验证、自动续期全部封装好。&lt;/p&gt;&lt;p&gt;文章发布后，两个月内被 4 个 NAS 论坛转载，V2EX 上还引发了讨论，带来了几十个外链。至今还在持续引流。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;稀缺内容的逻辑是这样的：&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;小众需求 + 技术门槛 → 大公司懒得做&lt;/li&gt;
&lt;li&gt;个人经验 + 真实踩坑 → AI 写不出来&lt;/li&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;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;前六个月，我的博客流量涨得很慢。每个月 10%、15% 这样爬。有时候还往下掉一掉。那段时间，我也怀疑过，是不是方向错了。&lt;/p&gt;&lt;p&gt;但后来我想明白一件事。&lt;/p&gt;&lt;p&gt;大多数人做 SEO，第三个月就放弃了。看不到效果，觉得是方法有问题。然后换一个方向，再来三个月，又放弃。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;小站点对大公司的唯一优势，是持续执行力。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;大公司的人员流动快，项目容易换方向。但个人站不一样，你可以死磕一个方向，做一年、两年。&lt;/p&gt;&lt;p&gt;每日发布的复利效应，在后期才会显现。流量不是线性增长的，是指数级爆发的。前提是你要熬过那前六个月。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;p&gt;后来慢慢摸出来一些规律：稀缺长尾词才是小站点的出路，内容修剪比疯狂生产更有价值，持续执行是唯一的护城河。&lt;/p&gt;&lt;p&gt;Google Search Console 是免费的金矿，Ahrefs 是付费的效率工具。用哪个都能做，区别在于时间成本。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;不要被那些”30 天流量翻倍”的标题骗了。&lt;/strong&gt; SEO 是一场马拉松，不是百米冲刺。&lt;/p&gt;&lt;p&gt;如果你也在做个人站，希望这篇文章能给你一些方向。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Gitea Webhook 自动部署：零依赖实现 Astro 博客多端同步发布</title><link>https://blog.moewah.com/posts/gitea-webhook-astro-blog-auto-deploy-zero-dependency/</link><guid isPermaLink="true">https://blog.moewah.com/posts/gitea-webhook-astro-blog-auto-deploy-zero-dependency/</guid><description>如何在多个地方(家里、公司)推送代码后实现博客自动构建?本文分享基于 Gitea Webhook 的零依赖解决方案,重点解决 Astro 博客多端同步发布的痛点,助你实现代码一推,博客自动更新的理想工作流。</description><pubDate>Sun, 15 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;之前我每次写完文章都要重复这些流程：SSH 登录服务器 -&amp;gt; 手动拉取代码 -&amp;gt; 等待 &lt;code&gt;pnpm install&lt;/code&gt; 安装依赖 -&amp;gt; 执行 &lt;code&gt;pnpm build&lt;/code&gt; 构建博客 -&amp;gt; 手动复制构建产物到 Nginx 目录。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;在家里和公司两地办公的时候，这种重复性的机械劳动让人崩溃。&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;section&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;a href=&quot;https://github.com/moewah/gitea-astro-webhook&quot; target=&quot;_blank&quot;&gt;https://github.com/moewah/gitea-astro-webhook&lt;/a&gt;&lt;/p&gt;&lt;p&gt;在多个地方(家里、公司)推送代码后，服务器上的 Webhook 服务会自动触发构建流程，拉取最新代码、安装依赖、构建博客，全程无需人工干预。&lt;/p&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;: 仅使用 Node.js 原生模块，无需 &lt;code&gt;npm install&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;异步构建&lt;/strong&gt;: 立即响应 Gitea，不超时&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;systemd 管理&lt;/strong&gt;: 开机自启，崩溃自动重启&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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://blog.moewah.com/posts/2221/&quot;&gt;Gitea 个人代码托管服务&lt;/a&gt;，并在此服务器中有一个 Astro 等静态博客，下面的操作指引帮助你实现从家里及公司的电脑中随时随地的发布管理文章。&lt;/p&gt;&lt;section&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;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# SSH 登录服务器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ssh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;root@your-server&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/opt&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://github.com/moewah/gitea-astro-webhook.git&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 进入服务器项目目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/opt/gitea-astro-webhook&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 复制配置文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.env.example&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.env&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 编辑配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nano&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.env&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Webhook 服务端口&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;PORT&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;28080&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Gitea Webhook 密钥&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;WEBHOOK_SECRET&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;your-webhook-secret-here&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 博客项目路径&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;BLOG_PATH&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;/home/wwwroot/blog&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Git 仓库地址(SSH 格式)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;GIT_REPO&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;ssh://git@git.example.com:222/username/blog.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 监听的 Git 分支&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;GIT_BRANCH&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 日志级别:info | error&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LOG_LEVEL&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;info&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;生成密钥&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;openssl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rand&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-hex&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;32&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;将生成的密钥粘贴到 &lt;code&gt;WEBHOOK_SECRET&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 配置 systemd 服务&lt;a href=&quot;#3-配置-systemd-服务&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 修改服务文件中的路径&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nano&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gitea-astro-webhook.service&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;将以下三个路径改为实际路径：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;WorkingDirectory=/opt/gitea-astro-webhook&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ExecStart=/usr/bin/node /opt/gitea-astro-webhook/webhook.js&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;EnvironmentFile=/opt/gitea-astro-webhook/.env&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装服务&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gitea-astro-webhook.service&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/systemd/system/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 重新加载 systemd&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;daemon-reload&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 启动服务&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gitea-astro-webhook&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 设置开机自启&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;enable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gitea-astro-webhook&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 查看服务状态&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;status&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gitea-astro-webhook&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. 配置 Nginx 反向代理&lt;a href=&quot;#4-配置-nginx-反向代理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 编辑你的 Nginx 配置文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nano&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/nginx/conf.d/blog.example.com.conf&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;添加以下配置：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/webhook &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_pass &lt;/span&gt;&lt;span&gt;&lt;span&gt;http://127.0.0.1:28080/webhook&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 传递必要的请求头&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_pass_request_headers &lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;Host &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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Real-IP &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;remote_addr&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Forwarded-For &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_add_x_forwarded_for&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Forwarded-Proto &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;scheme&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 传递 Gitea 签名头&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Gitea-Signature &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;http_x_gitea_signature&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Gitea-Event &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;http_x_gitea_event&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 增加超时时间&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_connect_timeout &lt;/span&gt;&lt;span&gt;600s&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_send_timeout &lt;/span&gt;&lt;span&gt;600s&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_read_timeout &lt;/span&gt;&lt;span&gt;600s&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 禁用缓冲&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_buffering &lt;/span&gt;&lt;span&gt;off&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 测试并重启 Nginx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&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;-t&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;restart&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nginx&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. 测试服务&lt;a href=&quot;#5-测试服务&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 健康检查&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;http://localhost:28080/health&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 通过 Nginx 测试 Webhook 端点&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://blog.example.com/webhook&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 查看日志&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;journalctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-u&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gitea-astro-webhook&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-f&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6. 配置 Gitea Webhook&lt;a href=&quot;#6-配置-gitea-webhook&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在 Gitea 中：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;打开仓库 → &lt;strong&gt;设置&lt;/strong&gt; → &lt;strong&gt;Webhooks&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;添加 Webhook：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;URL&lt;/strong&gt;： &lt;code&gt;https://blog.example.com/webhook&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content Type&lt;/strong&gt;：&lt;code&gt;application/json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secret&lt;/strong&gt;：粘贴 &lt;code&gt;.env&lt;/code&gt; 中的 &lt;code&gt;WEBHOOK_SECRET&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Events&lt;/strong&gt;：Push Events&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Branch&lt;/strong&gt;: &lt;code&gt;main&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;blockquote&gt;&lt;p&gt;如果是 Astro，注意测试时上传的文章 Frontmatter 属性要符合规范要求，Astro 对这一块校验很严格。&lt;/p&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/path/to/your/blog&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;test &lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;)&quot;&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;&lt;span&gt;test.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;test.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;commit&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-m&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;test: 测试自动部署&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;origin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;在服务器查看日志：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;journalctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-u&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gitea-astro-webhook&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-f&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;：检查 Gitea 和 &lt;code&gt;.env&lt;/code&gt; 中的 &lt;code&gt;WEBHOOK_SECRET&lt;/code&gt; 是否完全一致。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git 拉取失败&lt;/strong&gt;：测试 SSH 连接 &lt;code&gt;ssh -T -p 222 git@git.example.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务无法启动&lt;/strong&gt;：检查 Node.js 版本(需要 &amp;gt;= 18.0.0),手动启动测试 &lt;code&gt;node webhook.js&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;也许刚开始接触 Git 命令有点懵 —— 这一大堆命令要记到什么时候？但其实，你只需要掌握几个基础操作就完全够用了。我整理了一份 超实用的👉 &lt;a href=&quot;https://blog.moewah.com/posts/2292/&quot;&gt;《Git 常用命令速查与使用详解》&lt;/a&gt;&lt;/p&gt;&lt;p&gt;一旦你上手了，就会真香 —— Git 真的超级顺手，commit、push、pull 这几个命令敲多了，根本不用过脑子就完成了。&lt;/p&gt;&lt;p&gt;而且，最骚的来了：当你把这个流程调通之后，你完全可以自己写个 SKILL 交给 OpenClaw 来帮你自动发布内容。想想就很美对吧？&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>8 个提问技巧，让 AI 问答质量翻几倍！</title><link>https://blog.moewah.com/posts/8-ai-questioning-tips-increase-response-quality/</link><guid isPermaLink="true">https://blog.moewah.com/posts/8-ai-questioning-tips-increase-response-quality/</guid><description>如何让AI的回答更精准？本文揭秘8个实用提问技巧，从角色设定到思考过程展示，教你通过优化提问方式大幅提升AI输出质量，解决信息模糊、答案笼统等常见问题。</description><pubDate>Mon, 26 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;前两天问 AI 怎么写好文章，它说要清晰结构、生动语言、准确表达。&lt;strong&gt;听起来都对，就是没用。&lt;/strong&gt; 就像问怎么变有钱，人家说努力工作、理性消费、合理投资——你也知道是对的。&lt;/p&gt;&lt;p&gt;Reddit 上有人测试了一堆提示词技巧，发现一个规律：&lt;strong&gt;提问方式稍微改一改，回答质量能翻好几倍。&lt;/strong&gt; 他分享了 8 个方法，我试了试，确实有用。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;8 个实用技巧&lt;a href=&quot;#8-个实用技巧&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;01. 先让 AI 问你问题&lt;a href=&quot;#01-先让-ai-问你问题&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;AI 会切换到采访模式，连续问 10 到 15 个你压根没想到的问题。你让它写工作报告，它会问报告给谁看、公司风格偏正式还是轻松、需要哪些数据、重点突出什么。等它拿到这些信息，再输出的内容就精准很多。&lt;strong&gt;本质上就是让 AI 主动收集信息，而不是瞎猜。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;02. 给 AI 一个超具体的角色&lt;a href=&quot;#02-给-ai-一个超具体的角色&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;很多人都知道要给 AI 设定角色，但往往设得太笼统。&lt;/p&gt;&lt;p&gt;别说它是个营销专家，要说它是个在制造业工作了 15 年的工业工程师，或者纽约时报的文字编辑。&lt;strong&gt;角色越具体，AI 用的术语、语气和例子就越贴切。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;你想了解怎么优化生产流程，让它扮演普通管理顾问，它会给你一堆理论框架。但说它是工厂待了 20 年的生产主管，它会告诉你哪些环节容易出问题、工人们会在哪里偷懒、设备维护要注意什么。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;03. 说清楚受众是谁&lt;a href=&quot;#03-说清楚受众是谁&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;与其让 AI 解释人工智能是什么，不如说给没有技术背景的小企业老板解释，他想知道这玩意儿能不能帮他省时间省钱。&lt;/p&gt;&lt;p&gt;这样一来，AI 就不会扯神经网络和深度学习，而是告诉你 AI 能帮你自动回复客户消息、分析哪些产品卖得好、预测库存需求。&lt;strong&gt;受众决定了内容的深度和角度。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;04. 让 AI 展示思考过程&lt;a href=&quot;#04-让-ai-展示思考过程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;遇到复杂问题时，别让 AI 直接给答案，让它把思考过程说出来。&lt;/p&gt;&lt;p&gt;加一句 &lt;strong&gt;“请一步步解释你的推理过程”&lt;/strong&gt; ，它会慢下来认真思考每一步，而不是凭直觉跳到结论。你问商业决策问题，如果直接要答案，它可能给你一个看起来合理但经不起推敲的建议。但让它展示思考过程，它会列出考虑了哪些因素、权衡了哪些利弊、为什么选择这个方案而不是那个。&lt;/p&gt;&lt;p&gt;你看到这个过程，也能判断它的逻辑是否靠谱。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;05. 自己开个头，让 AI 接着写&lt;a href=&quot;#05-自己开个头让-ai-接着写&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;需要固定格式的任务，自己开个头让 AI 接着写。&lt;/p&gt;&lt;p&gt;想要一个列表，就写 &lt;strong&gt;“以下是三个主要原因：1.”&lt;/strong&gt; ，AI 会自动按照你的模式继续写 2、3。想要对比表格，就把表头写好，它会填充剩下的内容。这个方法能保证输出格式的一致性，批量处理同类任务时特别省事。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;06. 提前喂背景信息&lt;a href=&quot;#06-提前喂背景信息&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;AI 不是你肚子里的蛔虫，它不知道你的具体情况。很多人问问题时默认 AI 了解自己的背景，但你不说它只能瞎猜。不如提前把相关信息告诉它。&lt;/p&gt;&lt;p&gt;你让 AI 写邮件，别说只写一封商务邮件，要告诉它公司风格是什么样的、你和收件人是什么关系、之前有过哪些沟通、这次邮件的目的是什么。这就像开会前给同事发背景资料，大家提前了解情况，会议效率会高很多。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;信息越充分，输出越精准。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;07. 用多种方法解决同一问题&lt;a href=&quot;#07-用多种方法解决同一问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;当答案真的很重要时，别只问一次。让 AI 用 3 到 5 种不同方法解决同一个问题，然后告诉你哪个答案出现得最多。&lt;/p&gt;&lt;p&gt;AI 有时候会自信满满地给出错误答案，但如果从不同角度思考，错误的答案往往只会出现一次，而正确答案会反复出现。这招对数学题、逻辑题或者需要推理的问题特别有效。&lt;/p&gt;&lt;p&gt;一个推理路径可能把你带偏，但多试几条路，大概率能找到正确方向。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;08. 直接问 AI 该怎么问&lt;a href=&quot;#08-直接问-ai-该怎么问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果你不知道怎么问才能得到好答案，就直接问 AI：&lt;strong&gt;我想得到某某结果，应该怎么问你最好？&lt;/strong&gt; 然后用它给你的提示词再问一遍。&lt;/p&gt;&lt;p&gt;AI 确实比我们更了解自己喜欢什么样的提问方式。这就像你问一个厨师怎么点菜能吃到他最拿手的菜，他肯定比你更清楚自己擅长什么。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;那个 Reddit 作者总结了一个规律：&lt;strong&gt;AI 本身没变聪明&lt;/strong&gt;，但你提问方式的小改变，能让输出质量产生巨大差异。关键在于减少 AI 的猜测空间。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;你给的约束越清晰，提供的背景越充分，举的例子越具体，AI 瞎编的空间就越小，答案自然越靠谱。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;就像跟朋友聊天，你只说最近有点烦，他只能安慰你几句。但你说清楚是工作上的事还是感情上的事、具体遇到了什么问题，他才能给你真正有用的建议。&lt;/p&gt;&lt;p&gt;AI 不是魔法，它只是一个需要明确指令的工具。那个作者说光是先让 AI 问问题这一招，就让他的 AI 对话质量翻了一倍。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;说到底，和 AI 对话就像和人对话，你说得越清楚，对方回应得越到位。&lt;/strong&gt; 只不过 AI 比人更老实，你不说，它真的不会主动问。&lt;/p&gt;&lt;p&gt;下次再用 AI 时，别急着扔一个问题过去。想想你到底想要什么，把背景说清楚，把要求讲明白，让它少猜一点，多做一点。你会发现 AI 突然变聪明了。&lt;em&gt;其实不是它变了，是你的提问方式变了。&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Typecho文章批量导出到Astro Markdown工具</title><link>https://blog.moewah.com/posts/typecho-to-astro-markdown-migration-tool/</link><guid isPermaLink="true">https://blog.moewah.com/posts/typecho-to-astro-markdown-migration-tool/</guid><description>如何将Typecho网站的高流量文章批量导出为Astro 5.0兼容的Markdown文件？本文提供一个支持自动处理图片、附件和Frontmatter生成的工具，适配Firefly主题，一键迁移核心内容。</description><pubDate>Wed, 14 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;strong&gt;20%&lt;/strong&gt; 的页面。通过 Google Search Console 等平台拉取近一年的数据，可以佐证这个铁铮铮的事实：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;“大部分人写的文章没价值，网站的大多数文章没流量。”&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;因此，当你的网站拥有较庞大的文章及页面体量时，可以通过 &lt;strong&gt;Google Search Console&lt;/strong&gt; 的数据获取占比 &lt;strong&gt;80%&lt;/strong&gt; 流量的页面列表(&lt;strong&gt;流量 TOP 20 的页面&lt;/strong&gt;) + 近半年产生的新页面清单，合并得到的页面 URL 清单，单独创建一个包含这些页面 URL 列表的 &lt;code&gt;links.txt&lt;/code&gt; 文件。这一部分才是整个网站的核心价值（当然，重要的笔记等内容另当别论）。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;我想从 Typecho 导出有用的文章（包含站内图片和附件），同时希望导出的 md 文章页面能直接适配 Astro 静态博客框架并兼容 Firefly 主题，该怎么办呢？&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;这个工具正是面向这个需求而定制的。基于 &lt;code&gt;links.txt&lt;/code&gt; 清单，批量导出文章 md 文件，并同时下载页面的图片和附件进行存储，在 md 文档中自动替换为相对地址重新引用。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;links.txt&lt;/code&gt; 读取指定文章链接进行导出，只导出清单内的文章。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分类组织&lt;/strong&gt;：按 Typecho 文章分类目录导出到对应的子目录，保持原有分类结构。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Astro 5.0 标准 Frontmatter&lt;/strong&gt;：生成符合 Astro 5.0 标准的 YAML Frontmatter，包含标题、日期、作者、标签、分类、摘要等字段。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;智能图片处理&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;自动处理引用式图片（&lt;code&gt;![alt][id]&lt;/code&gt;）和直接链接图片（&lt;code&gt;![alt](url)&lt;/code&gt;），转换为直接链接格式并下载到本地。&lt;/li&gt;
&lt;li&gt;清理图片 URL 中的查询参数（保留片段标识，避免误匹配 Markdown 标题）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文章摘要生成&lt;/strong&gt;：自动从内容中提取前 100 字作为描述（&lt;code&gt;description&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自定义封面图片&lt;/strong&gt;：支持通过配置为文章添加封面图片（&lt;code&gt;image&lt;/code&gt; 属性），可使用 Firefly 主题内置的随机二次元图片 API 或自定义 URL。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;媒体资源下载&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;可选下载图片和附件到本地。&lt;/li&gt;
&lt;li&gt;媒体文件按 &lt;code&gt;images/[年份]/[文章ID]/&lt;/code&gt; 和 &lt;code&gt;attachments/[年份]/[文章ID]/&lt;/code&gt; 组织。&lt;/li&gt;
&lt;li&gt;Markdown 中的媒体链接自动替换为相对路径。&lt;/li&gt;
&lt;/ul&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;hr /&gt;&lt;/section&gt;
&lt;section&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;：需要 PHP 7.4+，并启用 &lt;strong&gt;MySQL PDO&lt;/strong&gt; 扩展。建议开启 &lt;strong&gt;cURL&lt;/strong&gt; 扩展以获得更好的下载性能。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网站备份&lt;/strong&gt;：使用前请务必全量备份 Typecho 数据库和网站文件，防止误操作！！！&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文件权限&lt;/strong&gt;：确保 PHP 有权限在当前目录创建文件夹和写入文件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络连接&lt;/strong&gt;：下载图片和附件需要能访问原站点的域名（可通过 &lt;code&gt;siteDomain&lt;/code&gt; 配置）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链接文件格式&lt;/strong&gt;：&lt;code&gt;links.txt&lt;/code&gt; 每行一个完整的文章 URL，如 &lt;code&gt;https://www.moewah.com/archives/123.html&lt;/code&gt;，程序会自动提取文章 ID（&lt;code&gt;123&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;导出目录&lt;/strong&gt;：程序会在运行目录下创建 &lt;code&gt;astro_posts&lt;/code&gt;（可配置）文件夹，所有导出的文章和媒体文件将存放在其中。&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;?&lt;/span&gt;&lt;span&gt;php&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* Typecho 文章导出工具 (适配 Astro 5.0 + Firefly 主题)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 功能特性：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 1. 从链接文件读取指定文章链接进行导出（默认 links.txt）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 2. 按分类目录导出文章到对应的子目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 3. 构建符合 Astro 5.0 标准的 YAML Frontmatter&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 4. 自动处理引用式图片，转换为直接链接格式并下载到本地&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 5. 清理图片 URL 中的查询参数（保留片段标识，避免误匹配Markdown标题）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 6. 生成文章摘要（自动截取前100字）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 7. 支持自定义文章封面图片配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 8. 可选下载媒体资源（图片/附件）到本地&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 9. 媒体文件按年份/文章ID组织：images/[年份]/[文章ID]/ 和 attachments/[年份]/[文章ID]/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 10. Markdown 中媒体链接替换为相对路径&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 11. 可选忽略头图（跳过下载且删除引用标记）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 使用前请先配置数据库连接信息和导出选项&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 运行后会在指定目录生成按分类组织的 Markdown 文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 1. 基础配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;error_reporting&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;E_ALL&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ini_set&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;display_errors&lt;/span&gt;&lt;span&gt;&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;1&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dbConfig&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;localhost&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;数据库名&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;数据库用户名&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;pass&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;数据库密码&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;baseDir&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro_posts&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;api&lt;/span&gt;&lt;span&gt;&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;// 文章封面图片配置：默认值为 &apos;api&apos;，将使用 Firefly 主题内置的随机二次元图片 API&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;// 可自定义为其他图片 URL，例如：&apos;https://example.com/image.jpg&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;// 或者保留为空字符串 &apos;&apos; 则不生成 image 属性&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 媒体下载配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;downloadMedia&lt;/span&gt;&lt;span&gt;&apos;&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;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;ignoreFirstImage&lt;/span&gt;&lt;span&gt;&apos;&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;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;maxFileSize&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;10&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;1024&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;1024&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 10MB限制&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;timeout&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;30&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;retryCount&lt;/span&gt;&lt;span&gt;&apos;&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;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;skipFailed&lt;/span&gt;&lt;span&gt;&apos;&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;&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;// 跳过失败的下载（保留原URL）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;userAgent&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;Mozilla/5.0 (Typecho Exporter)&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;linksFile&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;links.txt&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;siteDomain&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;https://www.moewah.com&lt;/span&gt;&lt;span&gt;&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;// 网站域名，用于构建完整图片URL&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;try&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 创建数据库连接&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dsn&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &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;mysql:host=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;{$&lt;/span&gt;&lt;span&gt;dbConfig&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;[&apos;&lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt;&apos;]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;dbname=&lt;/span&gt;&lt;span&gt;&lt;span&gt;{$&lt;/span&gt;&lt;span&gt;dbConfig&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;[&apos;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&apos;]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&lt;span&gt;;charset=utf8mb4&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;51&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pdo&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PDO&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dsn&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dbConfig&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span&gt;&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;dbConfig&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;pass&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;52&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;PDO&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;ATTR_ERRMODE&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;&lt;span&gt;PDO&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;ERRMODE_EXCEPTION&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;53&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;PDO&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;ATTR_DEFAULT_FETCH_MODE&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;&lt;span&gt;PDO&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;FETCH_ASSOC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;54&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;55&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 1.1 从链接文件提取文章ID&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;56&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;articleIds&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;extractArticleIdsFromLinks&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dbConfig&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;linksFile&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;]);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;57&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;empty&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;articleIds&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;58&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;die&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;❌ &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;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dbConfig&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;linksFile&lt;/span&gt;&lt;span&gt;&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;&quot;&lt;/span&gt;&lt;span&gt;中没有有效的文章ID&lt;/span&gt;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;59&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;60&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;61&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 2. 执行 SQL 查询&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;62&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;placeholders&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;implode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&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;array_fill&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;articleIds&lt;/span&gt;&lt;/span&gt;&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;&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;63&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;64&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;65&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;c.cid, c.title, c.text, c.slug, c.created, c.modified,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;66&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;u.name as author,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;67&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(SELECT GROUP_CONCAT(m.name) FROM typecho_relationships r&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;68&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;         &lt;/span&gt;&lt;/span&gt;&lt;span&gt;JOIN typecho_metas m ON r.mid = m.mid&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;69&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;         &lt;/span&gt;&lt;/span&gt;&lt;span&gt;WHERE r.cid = c.cid AND m.type = &apos;tag&apos;) as tags,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;70&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(SELECT m.name FROM typecho_relationships r&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;71&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;         &lt;/span&gt;&lt;/span&gt;&lt;span&gt;JOIN typecho_metas m ON r.mid = m.mid&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;72&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;         &lt;/span&gt;&lt;/span&gt;&lt;span&gt;WHERE r.cid = c.cid AND m.type = &apos;category&apos; LIMIT 1) as category&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;73&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;FROM typecho_contents c&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;74&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;LEFT JOIN typecho_users u ON c.authorId = u.uid&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;75&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;WHERE c.type = &apos;post&apos; AND c.status = &apos;publish&apos; AND c.cid IN (&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;placeholders&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;76&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ORDER BY c.created DESC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;77&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;78&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;79&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 执行查询获取所有已发布的文章&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;80&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;stmt&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pdo&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;prepare&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;81&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;stmt&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;execute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;articleIds&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;82&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;posts&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;stmt&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;fetchAll&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;83&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;84&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt;!&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;posts&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;die&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;❌ 没有找到文章&lt;/span&gt;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;85&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;86&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;foreach&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;posts&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;index&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;&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;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;87&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&lt;span&gt;[&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; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;index&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;&quot;&lt;/span&gt;&lt;span&gt;/&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;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;posts&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &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;] 处理文章: &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;[&apos;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&apos;]&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;&lt;span&gt;post&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;[&apos;&lt;/span&gt;&lt;span&gt;cid&lt;/span&gt;&lt;span&gt;&apos;]&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;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;88&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;89&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 3. 处理分类目录：根据文章分类创建对应的导出目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;90&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&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;!&lt;/span&gt;&lt;/span&gt;&lt;span&gt;empty&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;category&lt;/span&gt;&lt;span&gt;&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;post&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;category&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;Uncategorized&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;91&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;targetFolder&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dbConfig&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;baseDir&lt;/span&gt;&lt;span&gt;&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;DIRECTORY_SEPARATOR&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sanitize_filename&lt;/span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;92&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt;!&lt;/span&gt;&lt;/span&gt;&lt;span&gt;is_dir&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;targetFolder&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;93&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;mkdir&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;targetFolder&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;0755&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;94&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;95&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;96&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 4. 处理文件名：移除非法字符，确保文件名安全&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;97&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;fileName&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sanitize_filename&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;]);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;98&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;exportPath&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;targetFolder&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DIRECTORY_SEPARATOR&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;fileName&lt;/span&gt;&lt;/span&gt;&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;.md&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;99&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// Windows 系统需要转换编码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;100&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;strpos&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;PHP_OS&lt;/span&gt;&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;WIN&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;!==&lt;/span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;101&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;exportPath&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;iconv&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;UTF-8&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;GBK//IGNORE&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;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;exportPath&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;102&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;103&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;104&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 5. 处理文章内容：移除 Typecho 的 Markdown 注释标记&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;105&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;rawContent&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&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&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;106&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;107&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;str_replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;&amp;lt;!--markdown--&amp;gt;&lt;/span&gt;&lt;span&gt;&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;&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;rawContent&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;108&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;109&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 6. 生成文章摘要：从内容中提取前100字作为描述&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;110&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 6.1 清理文本：移除所有 HTML 和 Markdown 标记&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;111&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;strip_tags&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;&lt;span&gt;// 去除 HTML 标签&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;112&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;\[&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt;\]\(&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt;\)&lt;/span&gt;&lt;span&gt;/s&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;&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;cleanText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;113&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;\[&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt;\]\[&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt;\]&lt;/span&gt;&lt;span&gt;/s&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;&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;cleanText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;114&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;\[&lt;/span&gt;&lt;span&gt;(.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;?)&lt;/span&gt;&lt;span&gt;\]\(&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt;\)&lt;/span&gt;&lt;span&gt;/s&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;&apos;&lt;/span&gt;&lt;span&gt;$1&lt;/span&gt;&lt;span&gt;&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;cleanText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;115&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;\s&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;/&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;&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;cleanText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;116&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;/&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;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&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;cleanText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;117&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;trim&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;118&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;119&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 6.2 截取前100字作为摘要&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;120&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;mb_substr&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanText&lt;/span&gt;&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;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;UTF-8&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;121&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;mb_strlen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanText&lt;/span&gt;&lt;/span&gt;&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;&lt;/span&gt;&lt;span&gt;UTF-8&lt;/span&gt;&lt;span&gt;&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;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;122&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;123&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;124&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;125&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 7. 准备 Frontmatter（符合 Astro 5.0 标准）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;126&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pubDate&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;Y-m-d&lt;/span&gt;&lt;span&gt;&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;post&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;created&lt;/span&gt;&lt;span&gt;&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;// 发布日期，格式：YYYY-MM-DD&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;127&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&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;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;Y-m-d&lt;/span&gt;&lt;span&gt;&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;post&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;modified&lt;/span&gt;&lt;span&gt;&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;// 更新日期，格式：YYYY-MM-DD&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;128&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&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;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;tags&lt;/span&gt;&lt;span&gt;&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;explode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&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;post&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;tags&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;])&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[];&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 标签字符串转数组&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;129&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&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;&lt;span&gt;array_filter&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;array_map&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;trim&lt;/span&gt;&lt;span&gt;&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;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;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;130&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;131&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &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;---&lt;/span&gt;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;132&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;json_encode&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&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;JSON_UNESCAPED_UNICODE&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&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;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;133&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&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;published: &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pubDate&lt;/span&gt;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;134&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&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;updated: &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;upDate&lt;/span&gt;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;135&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&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;author: &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;&lt;span&gt;json_encode&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;&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;JSON_UNESCAPED_UNICODE&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&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;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;136&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 生成 image 属性，如果配置不为空则添加&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;137&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt;!&lt;/span&gt;&lt;/span&gt;&lt;span&gt;empty&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dbConfig&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;138&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&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;image: &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;&lt;span&gt;json_encode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dbConfig&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;&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;JSON_UNESCAPED_UNICODE&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&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;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;139&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;140&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&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;description: &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;&lt;span&gt;json_encode&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;&lt;span&gt;JSON_UNESCAPED_UNICODE&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&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;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;141&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&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;category: &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;&lt;span&gt;json_encode&lt;/span&gt;&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;JSON_UNESCAPED_UNICODE&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&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;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;142&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;143&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 7.2 处理标签：生成正确的 YAML 数组格式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;144&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&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;&amp;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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;145&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&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;tags:&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;&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;implode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&lt;span&gt;  - &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;&lt;span&gt;array_map&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt;(&lt;/span&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;)&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;json_encode&lt;/span&gt;&lt;span&gt;(&lt;/span&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;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;JSON_UNESCAPED_UNICODE&lt;/span&gt;&lt;span&gt;&lt;span&gt;),&lt;/span&gt;&lt;span&gt; &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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;146&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;else&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;147&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&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;tags: []&lt;/span&gt;&lt;/span&gt;&lt;span&gt;\n&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;// 空数组，避免生成 `- []` 的错误格式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;148&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;149&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;150&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&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;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;&lt;span&gt;json_encode&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;slug&lt;/span&gt;&lt;span&gt;&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;JSON_UNESCAPED_UNICODE&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&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;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;151&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&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;draft: false&lt;/span&gt;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;152&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&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;toc: true&lt;/span&gt;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;153&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&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;---&lt;/span&gt;&lt;/span&gt;&lt;span&gt;\n\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;154&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;155&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 8. 处理正文内容并下载媒体资源&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;156&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;createYear&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;Y&lt;/span&gt;&lt;span&gt;&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;post&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;created&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;]);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;157&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;158&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 初始化媒体下载器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;159&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;downloader&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;160&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dbConfig&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;downloadMedia&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;161&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;downloader&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MediaDownloader&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dbConfig&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;baseDir&lt;/span&gt;&lt;span&gt;&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;dbConfig&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;162&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;163&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;164&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 处理内容：下载媒体资源并替换为相对路径&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;165&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;downloader&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;166&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;processContentWithMediaDownload&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;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;downloader&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&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&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;cid&lt;/span&gt;&lt;span&gt;&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;createYear&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dbConfig&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;ignoreFirstImage&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;]);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;167&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;168&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;169&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 9. 合并 Frontmatter 和正文内容&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;170&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;fullOutput&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;171&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;172&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 10. 写入文件到指定路径&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;173&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;file_put_contents&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;exportPath&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;fullOutput&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;174&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;[&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; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;index&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;&quot;&lt;/span&gt;&lt;span&gt;/&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;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;posts&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &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;] &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;[&apos;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&apos;]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;175&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;176&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;177&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;178&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;✅ 完成！共导出 &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;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;posts&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &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; 篇文章&lt;/span&gt;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;179&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;180&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;catch&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Exception&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;181&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;die&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;❌ 错误: &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;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;getMessage&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&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;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;182&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;183&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;184&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;185&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 从链接文件提取文章ID&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;186&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;187&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; $linksFile 链接文件路径&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;188&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;array&lt;/span&gt;&lt;span&gt; 文章ID数组&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;189&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;190&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extractArticleIdsFromLinks&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;linksFile&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;191&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;ids&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;192&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt;!&lt;/span&gt;&lt;/span&gt;&lt;span&gt;file_exists&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;linksFile&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;193&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;die&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&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;linksFile&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;194&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;195&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;196&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;lines&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;linksFile&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;FILE_IGNORE_NEW_LINES&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;FILE_SKIP_EMPTY_LINES&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;197&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;foreach&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;lines&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &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;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;198&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;preg_match&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;/&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;html&lt;/span&gt;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;/&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;url&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;matches&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;199&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;ids&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;[]&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&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&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;matches&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;200&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;201&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;202&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;203&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;array_unique&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;ids&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;204&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;205&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;206&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;207&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 媒体下载器类&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;208&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;209&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MediaDownloader&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;210&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 支持的图片后缀&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;211&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;IMAGE_EXTS&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&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;&lt;/span&gt;&lt;span&gt;jpg&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;jpeg&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;png&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;gif&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;webp&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;bmp&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;svg&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;avif&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;ico&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;212&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;213&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 支持下载的附件后缀（白名单）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;214&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ATTACHMENT_EXTS&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;215&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 文档类&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;216&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;pdf&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;doc&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;docx&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;xls&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;xlsx&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;ppt&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;pptx&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;txt&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;rtf&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;odt&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;217&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 压缩包&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;218&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;zip&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;rar&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;7z&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;gz&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;bz2&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;xz&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;219&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 群晖相关&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;220&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;spk&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;221&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 音视频&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;222&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;mp3&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;mp4&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;avi&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;mkv&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;mov&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;flv&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;wav&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;ogg&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;223&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 其他&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;224&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;apk&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;exe&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;dmg&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;iso&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;img&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;225&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;226&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;227&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;baseDir&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;228&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;downloaded&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[];&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// URL缓存&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;229&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&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;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;230&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;hasCurl&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;231&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;downloadCount&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;232&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;images&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;233&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;attachments&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;234&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;failed&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;235&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;236&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;237&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;__construct&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;baseDir&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&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;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;238&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;baseDir&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;rtrim&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;baseDir&lt;/span&gt;&lt;/span&gt;&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;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;\\&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;239&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&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;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;240&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;241&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 检查cURL扩展&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;242&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;hasCurl&lt;/span&gt;&lt;span&gt;&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_exists&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;curl_init&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;243&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;244&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;245&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;246&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 构建完整URL&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;247&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;248&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;buildFullUrl&lt;/span&gt;&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;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;249&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 如果已经是完整URL，直接返回&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;250&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;preg_match&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;^&lt;/span&gt;&lt;span&gt;&lt;span&gt;https?:&lt;/span&gt;&lt;span&gt;\/\/&lt;/span&gt;&lt;span&gt;/i&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;url&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;251&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&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;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;252&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;253&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;254&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 如果是相对路径，添加域名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;255&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;domain&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;siteDomain&lt;/span&gt;&lt;span&gt;&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;&apos;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;256&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;domain&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;strpos&lt;/span&gt;&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;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&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;0&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;257&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;// 移除域名末尾的斜杠&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;258&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;domain&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;rtrim&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;domain&lt;/span&gt;&lt;/span&gt;&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;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;259&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;domain&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&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;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;260&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;261&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;262&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 无法处理的URL&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;263&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&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;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;264&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;265&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;266&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;267&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 下载媒体资源并返回相对路径&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;268&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;269&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;download&lt;/span&gt;&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;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;articleId&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;createYear&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;270&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 构建完整URL（处理相对路径）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;271&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;fullUrl&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;buildFullUrl&lt;/span&gt;&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;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;272&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;273&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 清理URL参数：移除查询字符串和Typecho特有的片段参数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;274&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 处理格式: https://example.com/image.jpg?width=100#vwid=760&amp;amp;vhei=440&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;275&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanUrl&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;\?&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;^#\s&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;/&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;&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;fullUrl&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;276&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanUrl&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;#.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;/&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;&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;cleanUrl&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;);&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 移除整个片段（Typecho使用片段存储尺寸参数）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;277&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;278&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 检查缓存&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;279&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;urlHash&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;md5&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanUrl&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;280&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;isset&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;downloaded&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;urlHash&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;281&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;downloaded&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;urlHash&lt;/span&gt;&lt;/span&gt;&lt;span&gt;][&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;relative_path&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;282&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;283&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;284&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 确定资源类型&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;285&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;getMediaType&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanUrl&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;286&lt;/div&gt;&lt;/div&gt;&lt;div&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;&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;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;287&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&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;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;288&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;289&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;290&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 创建目标目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;291&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;targetDir&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;&lt;span&gt;{$&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;baseDir&lt;/span&gt;&lt;span&gt;}&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;&lt;span&gt;s/&lt;/span&gt;&lt;span&gt;&lt;span&gt;{$&lt;/span&gt;&lt;span&gt;createYear&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&lt;span&gt;{$&lt;/span&gt;&lt;span&gt;articleId&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;292&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt;!&lt;/span&gt;&lt;/span&gt;&lt;span&gt;is_dir&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;targetDir&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;293&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;mkdir&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;targetDir&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;0755&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;294&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;295&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;296&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 生成文件名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;297&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;filename&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;generateFilename&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanUrl&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;articleId&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&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;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;298&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;fullPath&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;&lt;span&gt;{$&lt;/span&gt;&lt;span&gt;targetDir&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&lt;span&gt;{$&lt;/span&gt;&lt;span&gt;filename&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;299&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;300&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 下载文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;301&lt;/div&gt;&lt;/div&gt;&lt;div&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;this&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;downloadFile&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanUrl&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;fullPath&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;302&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;303&lt;/div&gt;&lt;/div&gt;&lt;div&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;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;304&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;relativePath&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &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;../&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;&lt;span&gt;s/&lt;/span&gt;&lt;span&gt;&lt;span&gt;{$&lt;/span&gt;&lt;span&gt;createYear&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&lt;span&gt;{$&lt;/span&gt;&lt;span&gt;articleId&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&lt;span&gt;{$&lt;/span&gt;&lt;span&gt;filename&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;305&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;downloaded&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;urlHash&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;306&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanUrl&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;307&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;relative_path&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;relativePath&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;308&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&apos;&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;&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;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;309&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;full_path&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;fullPath&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;310&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;311&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;downloadCount&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;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;312&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;313&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;relativePath&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;314&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;else&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;315&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;downloadCount&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;failed&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;316&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&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;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 失败返回原URL&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;317&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;318&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;319&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;320&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;321&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 判断是否为内部域名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;322&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;323&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;isInternalUrl&lt;/span&gt;&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;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;324&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;domain&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;siteDomain&lt;/span&gt;&lt;span&gt;&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;&apos;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;325&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt;!&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;domain&lt;/span&gt;&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; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;326&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;327&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&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; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;parse_url&lt;/span&gt;&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;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;PHP_URL_HOST&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;328&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt;!&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;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;329&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;330&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 移除协议和端口，只比较域名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;331&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanConfigDomain&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;parse_url&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;domain&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;PHP_URL_HOST&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;?:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;domain&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;332&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanUrlDomain&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;parse_url&lt;/span&gt;&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;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;PHP_URL_HOST&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;?:&lt;/span&gt;&lt;span&gt; &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;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;333&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;334&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanConfigDomain&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanUrlDomain&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;335&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;336&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;337&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;338&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 判断媒体类型&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;339&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;340&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getMediaType&lt;/span&gt;&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;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;341&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 1. 检查协议：只支持 http/https&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;342&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;scheme&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;parse_url&lt;/span&gt;&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;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;PHP_URL_SCHEME&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;343&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;scheme&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;/span&gt;&lt;span&gt;in_array&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;scheme&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&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;&lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;https&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;344&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;345&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;346&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;347&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 2. 检查是否为内部域名：外部链接不下载&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;348&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt;!&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;isInternalUrl&lt;/span&gt;&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;))&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;349&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;350&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;351&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;352&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;parse_url&lt;/span&gt;&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;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;PHP_URL_PATH&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;353&lt;/div&gt;&lt;/div&gt;&lt;div&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;&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; &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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;354&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;355&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;356&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;357&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 3. 提取文件后缀&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;358&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;ext&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;strtolower&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;pathinfo&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;&lt;span&gt;PATHINFO_EXTENSION&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;359&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;360&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 4. 无后缀URL跳过（内部链接但不带后缀，不处理）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;361&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt;!&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;ext&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;362&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;363&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;364&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;365&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 5. 根据后缀判断类型&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;366&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;in_array&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;ext&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;IMAGE_EXTS&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;367&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;368&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;369&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;in_array&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;ext&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;ATTACHMENT_EXTS&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;370&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;attachment&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;371&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;372&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;373&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 6. 其他后缀不下载&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;374&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;375&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;376&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;377&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;378&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 生成安全文件名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;379&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;380&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;generateFilename&lt;/span&gt;&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;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;articleId&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&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;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;381&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;parse_url&lt;/span&gt;&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;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;PHP_URL_PATH&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;382&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;ext&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;strtolower&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;pathinfo&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;&lt;span&gt;PATHINFO_EXTENSION&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;383&lt;/div&gt;&lt;/div&gt;&lt;div&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;pathinfo&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;&lt;span&gt;PATHINFO_FILENAME&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;384&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;385&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 生成唯一文件名：文章ID_时间戳_哈希.扩展名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;386&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;timestamp&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;time&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;387&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;hash&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;substr&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;md5&lt;/span&gt;&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;),&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;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;388&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;safeName&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;/[&lt;/span&gt;&lt;span&gt;^a-zA-Z0-9_-&lt;/span&gt;&lt;span&gt;]/&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;&apos;&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;&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;name&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;389&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;390&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;empty&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;safeName&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;391&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;safeName&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;&lt;span&gt;{$&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;&lt;span&gt;{$&lt;/span&gt;&lt;span&gt;timestamp&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;392&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;393&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;394&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;{$&lt;/span&gt;&lt;span&gt;articleId&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;&lt;span&gt;{$&lt;/span&gt;&lt;span&gt;safeName&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;&lt;span&gt;{$&lt;/span&gt;&lt;span&gt;hash&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;&lt;span&gt;{$&lt;/span&gt;&lt;span&gt;ext&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;395&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;396&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;397&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;398&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 文件下载实现&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;399&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;400&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;downloadFile&lt;/span&gt;&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;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;localPath&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;401&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;timeout&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;timeout&lt;/span&gt;&lt;span&gt;&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;30&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;402&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;maxSize&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;maxFileSize&lt;/span&gt;&lt;span&gt;&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;10&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;1024&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;1024&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;403&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;404&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;hasCurl&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;405&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;// 使用 cURL 下载&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;406&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;ch&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;curl_init&lt;/span&gt;&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;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;407&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;curl_setopt&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;ch&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;CURLOPT_RETURNTRANSFER&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;408&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;curl_setopt&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;ch&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;CURLOPT_FOLLOWLOCATION&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;409&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;curl_setopt&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;ch&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;CURLOPT_TIMEOUT&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;timeout&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;410&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;curl_setopt&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;ch&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;CURLOPT_MAXFILESIZE&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;maxSize&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;411&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;curl_setopt&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;ch&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;CURLOPT_USERAGENT&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;userAgent&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;Mozilla/5.0 (Typecho Exporter)&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;412&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;413&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&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; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;curl_exec&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;ch&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;414&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;httpCode&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;curl_getinfo&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;ch&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;CURLINFO_HTTP_CODE&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;415&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;curl_error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;ch&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;416&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;curl_close&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;ch&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;417&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;418&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;httpCode&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;200&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&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; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;strlen&lt;/span&gt;&lt;span&gt;(&lt;/span&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;)&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;0&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;419&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;file_put_contents&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;localPath&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&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;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;!==&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;420&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;421&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;else&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;422&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;// 使用 file_get_contents 作为备选&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;423&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;stream_context_create&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;424&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;span&gt;&apos;&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;[&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;425&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;timeout&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;timeout&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;426&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;user_agent&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;userAgent&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;Mozilla/5.0 (Typecho Exporter)&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;427&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;428&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;429&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;430&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&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; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;/span&gt;&lt;span&gt;file_get_contents&lt;/span&gt;&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;,&lt;/span&gt;&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;context&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;431&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&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; &lt;/span&gt;&lt;span&gt;!==&lt;/span&gt;&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;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;strlen&lt;/span&gt;&lt;span&gt;(&lt;/span&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;)&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;0&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;strlen&lt;/span&gt;&lt;span&gt;(&lt;/span&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;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;maxSize&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;432&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;file_put_contents&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;localPath&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&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;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;!==&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;433&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;434&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;435&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;436&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;437&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;438&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;439&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;440&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 获取下载统计&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;441&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;442&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getStats&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;443&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;downloadCount&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;444&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;445&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;446&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;447&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;448&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 处理内容并下载媒体资源&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;449&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;450&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; $content 文章内容&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;451&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MediaDownloader&lt;/span&gt;&lt;span&gt; $downloader 媒体下载器实例&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;452&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; $articleId 文章ID&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;453&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; $createYear 文章创建年份&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;454&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bool&lt;/span&gt;&lt;span&gt; $ignoreFirstImage 是否忽略头图（跳过下载且删除引用标记）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;455&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; 处理后的内容&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;456&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;457&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;processContentWithMediaDownload&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;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;downloader&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;articleId&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;createYear&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;ignoreFirstImage&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;458&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&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;articleId&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt;, 年份: &lt;/span&gt;&lt;span&gt;&lt;span&gt;{$&lt;/span&gt;&lt;span&gt;createYear&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;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;459&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;460&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 收集引用定义（需在URL清理之前执行）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;461&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;allRefs&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;462&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;preg_match_all&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;\[&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;^\&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;\]&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;\S&lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;/im&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;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;$&lt;/span&gt;&lt;span&gt;refMatches&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;PREG_SET_ORDER&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;463&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;foreach&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;refMatches&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;match&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;464&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;refId&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;trim&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;match&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;465&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&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; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;match&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;466&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;allRefs&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;refId&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &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;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;467&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;468&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;469&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;470&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 下载引用定义中的所有附件（即使未被引用）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;471&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;foreach&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;allRefs&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;refId&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;&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;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;472&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;downloader&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;download&lt;/span&gt;&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;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;articleId&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;createYear&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;473&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;474&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;475&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 忽略头图：删除正文开头直接引用的图片（无任何文本段落的图片）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;476&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 判断标准：内容最开头就是图片标记才算头图，段落后的图片保留&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;477&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;ignoreFirstImage&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;478&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;^&lt;/span&gt;&lt;span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;\[&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;^\&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;\]\(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;^)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;\)\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;/&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;479&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace&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;,&lt;/span&gt;&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;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;1&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;480&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;^&lt;/span&gt;&lt;span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;\[&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;^\&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;\]\[&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;^\&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;\]\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;/&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;481&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace&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;,&lt;/span&gt;&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;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;1&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;482&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;483&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;484&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 清理URL参数：仅清理直接链接中的查询参数（不清理#，避免误匹配Markdown标题）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;485&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace_callback&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;486&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;\[&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;^\&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;\]\(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;^)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&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;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;487&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;matches&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;488&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;altText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;matches&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;489&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&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; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;matches&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;490&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanUrl&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&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;/&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;&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;url&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;491&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&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;altText&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt;](&lt;/span&gt;&lt;span&gt;&lt;span&gt;{$&lt;/span&gt;&lt;span&gt;cleanUrl&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;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;492&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;493&lt;/div&gt;&lt;/div&gt;&lt;div&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;494&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;495&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;496&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 处理引用式链接：[text][id]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;497&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;foreach&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;allRefs&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;refId&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;&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;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;498&lt;/div&gt;&lt;/div&gt;&lt;div&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; &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;&lt;/span&gt;&lt;span&gt;/\[([^\]]+)\]\[\s*&lt;/span&gt;&lt;span&gt;&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;preg_quote&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;refId&lt;/span&gt;&lt;/span&gt;&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;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;\s*\]/&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;499&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace_callback&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;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;matches&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&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;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;downloader&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;articleId&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;createYear&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;500&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;linkText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;matches&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;501&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;localPath&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;downloader&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;download&lt;/span&gt;&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;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;articleId&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;createYear&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;502&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&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;linkText&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt;](&lt;/span&gt;&lt;span&gt;&lt;span&gt;{$&lt;/span&gt;&lt;span&gt;localPath&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;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;503&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;504&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;505&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;506&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 处理引用式图片：![alt][id]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;507&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;foreach&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;allRefs&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;refId&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;&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;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;508&lt;/div&gt;&lt;/div&gt;&lt;div&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; &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;&lt;/span&gt;&lt;span&gt;/!\[([^\]]*)\]\[\s*&lt;/span&gt;&lt;span&gt;&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;preg_quote&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;refId&lt;/span&gt;&lt;/span&gt;&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;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;\s*\]/&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;509&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace_callback&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;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;matches&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&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;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;downloader&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;articleId&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;createYear&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;510&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;altText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;matches&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;511&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;localPath&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;downloader&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;download&lt;/span&gt;&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;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;articleId&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;createYear&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;512&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&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;altText&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt;](&lt;/span&gt;&lt;span&gt;&lt;span&gt;{$&lt;/span&gt;&lt;span&gt;localPath&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;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;513&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;514&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;515&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;516&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 处理直接链接图片：![alt](url)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;517&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace_callback&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;518&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;\[&lt;/span&gt;&lt;span&gt;(.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;?)&lt;/span&gt;&lt;span&gt;\]\(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;^\s\)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;\)&lt;/span&gt;&lt;span&gt;/i&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;519&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;matches&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;downloader&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;articleId&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;createYear&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;520&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;altText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;matches&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;521&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;imageUrl&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;matches&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;522&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;localPath&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;downloader&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;download&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;imageUrl&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;articleId&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;createYear&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;523&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&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;altText&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt;](&lt;/span&gt;&lt;span&gt;&lt;span&gt;{$&lt;/span&gt;&lt;span&gt;localPath&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;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;524&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;525&lt;/div&gt;&lt;/div&gt;&lt;div&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;526&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;527&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;528&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 处理附件链接：[文字](url)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;529&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace_callback&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;530&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;\[&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;^\&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;\]\(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;^\s)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&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;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;531&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;matches&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;downloader&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;articleId&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;createYear&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;532&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;linkText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;matches&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;533&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;fileUrl&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;matches&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;534&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;localPath&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;downloader&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;download&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;fileUrl&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;articleId&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;createYear&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;535&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;localPath&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;!==&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;fileUrl&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;536&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&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;linkText&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt;](&lt;/span&gt;&lt;span&gt;&lt;span&gt;{$&lt;/span&gt;&lt;span&gt;localPath&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;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;537&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;538&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;matches&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;539&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;540&lt;/div&gt;&lt;/div&gt;&lt;div&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;541&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;542&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;543&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 移除引用定义行&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;544&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;^&lt;/span&gt;&lt;span&gt;\s&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;\[&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;^\&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;span&gt;\]&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;\S&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&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;&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;content&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;545&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;546&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 清理多余空行&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;547&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;\n\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;\n\s&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;/&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;&quot;&lt;/span&gt;&lt;span&gt;\n\n&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;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;content&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;548&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;549&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;trim&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;550&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;551&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;552&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;553&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 文件名清理函数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;554&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;555&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; $filename 原始文件名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;556&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; 清理后的安全文件名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;557&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;558&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 功能：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;559&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 1. 替换非法字符为连字符&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;560&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 2. 限制文件名长度不超过80个字符&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;561&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 3. 去除文件名两端的点和连字符&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;562&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;563&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sanitize_filename&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;filename&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;564&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 定义需要替换的非法字符&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;565&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;invalid&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;array&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;?&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;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\\&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;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;|&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;*&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;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\&quot;&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;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&amp;lt;&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;566&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;filename&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;str_replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;invalid&lt;/span&gt;&lt;/span&gt;&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;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&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;filename&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;567&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;568&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 限制文件名长度，避免过长的文件名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;569&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;filename&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;mb_substr&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;filename&lt;/span&gt;&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;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;80&lt;/span&gt;&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;&lt;/span&gt;&lt;span&gt;utf-8&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;570&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;571&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 去除文件名两端的点和连字符（避免隐藏文件或非法文件）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;572&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;trim&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;filename&lt;/span&gt;&lt;/span&gt;&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;&lt;/span&gt;&lt;span&gt;.-&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;573&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;574&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;?&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;👆完整复制上方代码，保存命名为&lt;code&gt;typecho-export-md.php&lt;/code&gt; 文件。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;使用方法步骤&lt;a href=&quot;#使用方法步骤&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;从 Google Search Console 或其他渠道获取高流量页面 URL 列表，创建一个名为 &lt;code&gt;links.txt&lt;/code&gt; 的文件，每行一个完整的文章 URL，例如：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;https://www.moewah.com/archives/123.html&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;https://www.moewah.com/archives/456.html&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;code&gt;typecho-export-md.php&lt;/code&gt;，找到 &lt;code&gt;$dbConfig&lt;/code&gt; 数组，修改以下配置：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;host&lt;/code&gt;：Typecho 数据库主机地址（通常是 &lt;code&gt;localhost&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;name&lt;/code&gt;：Typecho 数据库名&lt;/li&gt;
&lt;li&gt;&lt;code&gt;user&lt;/code&gt;：数据库用户名&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pass&lt;/code&gt;：数据库密码&lt;/li&gt;
&lt;li&gt;&lt;code&gt;siteDomain&lt;/code&gt;：你的网站域名（用于构建完整的图片/附件 URL）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;p&gt;根据需要调整其他配置项：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;baseDir&lt;/code&gt;：导出文件存放的目录（默认 &lt;code&gt;astro_posts&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;image&lt;/code&gt;：文章封面图片配置（默认 &lt;code&gt;&apos;api&apos;&lt;/code&gt; 使用 Firefly 主题内置随机二次元图片 API）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;downloadMedia&lt;/code&gt;：是否下载媒体资源（图片/附件）到本地&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ignoreFirstImage&lt;/code&gt;：是否忽略第一张图片（头图）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;code&gt;typecho-export-md.php&lt;/code&gt; 和 &lt;code&gt;links.txt&lt;/code&gt; 上传到网站根目录（两文件放在同一目录），通过命令行或浏览器访问该 PHP 文件（确保 PHP 环境支持）。例如在命令行中：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;php&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;typecho-export-md.php&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第 5 步：获取导出结果&lt;a href=&quot;#第-5-步获取导出结果&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;程序运行后，会在当前目录下创建 &lt;code&gt;astro_posts&lt;/code&gt; 文件夹（或你指定的目录），其中按分类存放了所有导出的 Markdown 文件，同时图片和附件会按年份/文章ID组织在 &lt;code&gt;images/&lt;/code&gt; 和 &lt;code&gt;attachments/&lt;/code&gt; 子目录中。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第 6 步：导入 Astro 项目&lt;a href=&quot;#第-6-步导入-astro-项目&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;将导出的 &lt;code&gt;astro_posts&lt;/code&gt; 整个文件夹复制到你的 Astro 项目的 &lt;code&gt;src/content/blog/&lt;/code&gt;（或你配置的 content 目录）下，即可直接使用。Frontmatter 已适配 Astro 5.0 标准，并兼容 Firefly 主题。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;核心配置说明&lt;a href=&quot;#核心配置说明&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;




















































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;配置项&lt;/th&gt;&lt;th&gt;默认值&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;host&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&apos;localhost&apos;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Typecho 数据库主机地址&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&apos;数据库名&apos;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Typecho 数据库名称&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;user&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&apos;数据库用户名&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;pass&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&apos;数据库密码&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;baseDir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&apos;astro_posts&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;image&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&apos;api&apos;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;文章封面图片配置。&lt;code&gt;&apos;api&apos;&lt;/code&gt; 表示使用 Firefly 主题内置的随机二次元图片 API；可改为其他图片 URL 或留空 &lt;code&gt;&apos;&apos;&lt;/code&gt; 不生成 image 属性&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;downloadMedia&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;ignoreFirstImage&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;maxFileSize&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;10 * 1024 * 1024&lt;/code&gt;&lt;/td&gt;&lt;td&gt;下载文件大小限制（10MB）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;timeout&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;30&lt;/code&gt;&lt;/td&gt;&lt;td&gt;下载超时时间（秒）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;retryCount&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;&lt;td&gt;下载失败重试次数&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;skipFailed&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;true&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;userAgent&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&apos;Mozilla/5.0 (Typecho Exporter)&apos;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;下载时使用的 User-Agent&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;linksFile&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&apos;links.txt&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;siteDomain&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&apos;https://www.moewah.com&apos;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;网站域名，用于构建完整的图片/附件 URL（重要！）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;这个工具帮助你从 Typecho 中精准导出 &lt;strong&gt;有价值的文章&lt;/strong&gt;，并自动处理媒体资源，生成完全适配 &lt;strong&gt;Astro 5.0 + Firefly 主题&lt;/strong&gt; 的 Markdown 文件。通过结合 Google Search Console 的数据，你可以在搬家时专注于保留真正带来流量和价值的页面，避免无谓的数据迁移。&lt;/p&gt;&lt;p&gt;如果你在使用过程中遇到问题，请检查以下几点：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;数据库连接信息是否正确&lt;/li&gt;
&lt;li&gt;PHP 是否已安装 MySQL PDO 扩展&lt;/li&gt;
&lt;li&gt;&lt;code&gt;links.txt&lt;/code&gt; 文件是否存在且格式正确&lt;/li&gt;
&lt;li&gt;网站域名配置是否与图片/附件的原始域名一致&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;祝你的博客迁移顺利，在新平台上焕发新生！&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>戴尔S2725QS Mac调色+120Hz高刷开启指南</title><link>https://blog.moewah.com/posts/dell-s2725qs-mac-color-calibration-120hz-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/dell-s2725qs-mac-color-calibration-120hz-guide/</guid><description>如何让戴尔S2725QS显示器接近Mac原色显示？本文详细拆解120Hz高刷开启方法与sRGB色彩校准步骤，助你实现Mac用户最佳外接屏体验。</description><pubDate>Mon, 21 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;戴尔 S2725QS 这块显示器最近真的很火！其实我最开始下单的是 &lt;strong&gt;S2725QC&lt;/strong&gt;，毕竟对于 Mac 用户来说，Type-C 一线直连才是标配。&lt;/p&gt;
&lt;p&gt;但后来我发现，两款型号面板基本一致，区别就在接口。刚好我手里有一根闲置的 &lt;strong&gt;USB-C 转 DP 线&lt;/strong&gt;，转头就换成了 &lt;strong&gt;S2725QS&lt;/strong&gt;。这一通操作下来，不仅保住了 &lt;strong&gt;120Hz 高刷&lt;/strong&gt;体验，还立省了 &lt;strong&gt;300 多块钱&lt;/strong&gt;，真香！&lt;/p&gt;
&lt;p&gt;不过，这块屏幕刚开机时的色彩确实需要“调教”一下。为了让你少走弯路，我把这套接近 MacBook 原色的设置方案分享给你：&lt;/p&gt;
&lt;hr /&gt;
&lt;section&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;S2725QS 默认色调偏黄绿，如果你习惯了 Mac 的屏幕，一定要按下面这个步骤改：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. Mac 系统设置&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;进入 &lt;strong&gt;系统设置&lt;/strong&gt; -&amp;gt; &lt;strong&gt;显示器&lt;/strong&gt; -&amp;gt; 选择 &lt;strong&gt;S2725QS&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;颜色描述文件&lt;/strong&gt;：手动切换为 &lt;strong&gt;sRGB IEC61966-2.1&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;2. 显示器硬件设置（OSD 菜单）&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;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;增益 (Gain)&lt;/strong&gt;：R 93% | G 90% | B 96%&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;偏移 (Offset)&lt;/strong&gt;：R 50% | G 47% | B 48%&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;色调 (Hue)&lt;/strong&gt;：全部设为 &lt;strong&gt;50%&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;饱和度 (Saturation)&lt;/strong&gt;：全部设为 &lt;strong&gt;46%&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;调校反馈&lt;/strong&gt;：调完后色彩会比 Mac 原生屏稍暖一点点，但比开机时的观感要好非常多，颜色更纯净。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;🚀 刷新率：如何开启 120Hz？&lt;a href=&quot;#-刷新率如何开启-120hz&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果你是用 HDMI 线连接 M1 芯片的 MacBook，可能会发现最高只能到 60Hz。这是因为 M1 的 HDMI 接口协议限制。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;解决方案：&lt;/strong&gt; 别买 HDMI 线了。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;建议：&lt;/strong&gt; 买一条 &lt;strong&gt;USB-C 转 DisplayPort 1.4&lt;/strong&gt; 的连接线（比如绿联的）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;结果：&lt;/strong&gt; 插上就能直接支持 &lt;strong&gt;4K 120Hz&lt;/strong&gt;，丝滑感提升不止一倍！&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;虽然 S2725QS 调完之后很香，但实话实说，比起更贵的 U2723QE，它的观感还是略微硬一些。毕竟“一分钱一分货”，U 系列在柔和度和黑场表现上依然是老大哥。&lt;/p&gt;&lt;p&gt;不过，作为入门级 4K 120Hz 显示器，配上这套调色参数，它绝对是你的 Mac 性价比之选！&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>从WindTerm到Kitty：30分钟搞定SSH免密登录与多服务器管理</title><link>https://blog.moewah.com/posts/windterm-to-kitty-ssh-passwordless-login-multi-server-management/</link><guid isPermaLink="true">https://blog.moewah.com/posts/windterm-to-kitty-ssh-passwordless-login-multi-server-management/</guid><description>如何实现SSH免密登录并跨设备无缝同步？本文详细拆解从WindTerm到Kitty的迁移方案，提供一键配置、密钥生成与多服务器管理的完整实战指南，助你高效连接所有服务器。</description><pubDate>Sat, 05 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;说实话，我刚从WindTerm转到Kitty的时候，真的有点崩溃。以前在WindTerm里点几下就能连上的服务器，现在每台都要背IP、记端口、敲密码，每天光是登录就浪费了半小时。&lt;/p&gt;
&lt;p&gt;更绝的是，我有一次在公司电脑配好了所有连接，回家想用Mac继续工作，结果发现所有配置都在WindTerm里，导出来还得折腾半天。那时候我就想，能不能有一套方案，既能让SSH像WindTerm一样”一键直达”，还能在多台Mac之间无缝同步？&lt;/p&gt;
&lt;p&gt;后来我花了一下午研究，还真搞出来了。今天就把这套方案分享给你，30分钟就能搞定，从此告别背IP和敲密码的痛苦。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;为什么要抛弃WindTerm，拥抱Kitty？&lt;a href=&quot;#为什么要抛弃windterm拥抱kitty&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;你可能会想，WindTerm用得好好的，为啥要换？我跟你讲，Kitty是真的香。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;数据说话&lt;/strong&gt;：Kitty基于GPU加速，滚动大型日志时，性能比WindTerm快3-5倍。WindTerm卡顿的地方，Kitty丝滑得不像话。而且Kitty是macOS原生的终端，配合iTerm2的配色和快捷键，体验直接拉满。&lt;/p&gt;&lt;p&gt;但我最看重的是：&lt;strong&gt;Kitty是纯SSH客户端，不搞那些花里胡哨的连接管理&lt;/strong&gt;。这意味着什么？你的所有配置都是标准的SSH config，换了台电脑，拷个配置文件就能用，完全不依赖某个特定软件。&lt;/p&gt;&lt;p&gt;说白了，Kitty是”专业选手”，WindTerm是”多功能瑞士军刀”。如果你像我一样，每天要连十几个服务器，Kitty的高效会让你回不去。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;咱们先搞定密钥。这是SSH免密登录的基础，你只有一把钥匙，能开所有的门。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;在终端里敲这行命令&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ssh-keygen&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;ed25519&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;&quot;&lt;/span&gt;&lt;span&gt;mac_kitty_office&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;为什么选ed25519？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;老实说，我之前一直用RSA，4096位的密钥生成一次要好几秒。后来换成ed25519，瞬间就搞定了。ed25519的密钥更小（RSA是几百KB，ed25519只有几十B），但安全性反而更高，连接速度也快。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;全程回车就行&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;它提示你输入密码（Passphrase）的时候，直接回车跳过。我知道你可能会担心”不设密码不安全吗？“但说实话，你的私钥留在本地，Mac本身就有密码保护，再设一层SSH密码反而麻烦。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;生成完之后&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;你的密钥对在 &lt;code&gt;~/.ssh/&lt;/code&gt; 目录下：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;id_ed25519&lt;/code&gt; 是私钥（绝对别泄露给别人）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;id_ed25519.pub&lt;/code&gt; 是公钥（这个可以随便发）&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;strong&gt;方法A：自动分发（推荐）&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ssh-copy-id&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;22&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;root@你的服务器IP&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这命令我超爱用，一行就搞定。它会自动把你的公钥加到服务器的 &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; 文件里。第一次还得输一次密码，之后就免密了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;方法B：手动创建（备选方案）&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你已经登录了服务器，或者ssh-copy-id用不了，手动来也行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir&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;~/.ssh&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;chmod&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;700&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.ssh&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;你的公钥内容&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;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;~/.ssh/authorized_keys&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;chmod&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;600&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.ssh/authorized_keys&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;把这行命令复制到服务器终端里，把”你的公钥内容”替换成你本地的 &lt;code&gt;id_ed25519.pub&lt;/code&gt; 文件内容，回车就完事。&lt;/p&gt;&lt;p&gt;我踩过一个坑：&lt;strong&gt;记得把公钥的换行符删掉&lt;/strong&gt;。直接复制的时候会多一行空格，会导致SSH认证失败。这个问题我折腾了半小时才发现，你说尴尬不尴尬。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;ssh root@1.2.3.4&lt;/code&gt; 输IP，还是太麻烦。咱们来个更高级的：给每个服务器起个”绰号”，以后直接 &lt;code&gt;ssh 绰号&lt;/code&gt; 就能连上。&lt;/p&gt;&lt;p&gt;SSH有个超级强大的功能：&lt;code&gt;config&lt;/code&gt; 配置文件。你可以把它理解为”通讯录”，每个Host就是一条联系人记录。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;打开配置文件&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nano&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.ssh/config&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 基础设置（对所有Host生效）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Host&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;IdentityFile&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.ssh/id_ed25519&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ServerAliveInterval&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;60&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 防止长时间不动被断开&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 服务器A：生产环境&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Host&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;prod-web&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;HostName&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.1.100&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;User&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;root&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;Port&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2222&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 服务器B：测试环境&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Host&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;test-db&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;HostName&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.1.50&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;User&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;admin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;Port&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;22&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 服务器C：公司服务器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Host&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;office-server&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;HostName&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;your.domain.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;User&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;deploy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;Port&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;22&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;配置完之后&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;现在你想连服务器A，直接敲 &lt;code&gt;ssh prod-web&lt;/code&gt; 就能上。想连测试数据库，&lt;code&gt;ssh test-db&lt;/code&gt; 搞定。是不是比背IP强太多了？&lt;/p&gt;&lt;p&gt;&lt;strong&gt;进阶技巧&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;如果你的服务器有分组，比如生产环境和测试环境分开，可以用 &lt;code&gt;Host&lt;/code&gt; 通配符：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 所有生产环境服务器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Host&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;prod-&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;IdentityFile&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.ssh/id_ed25519_prod&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;User&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;root&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Host&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;prod-web&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;HostName&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.1.100&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Host&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;prod-db&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;HostName&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.1.101&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 所有测试环境服务器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Host&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;test-&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;IdentityFile&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.ssh/id_ed25519_test&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;User&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;admin&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这样不同的组可以用不同的密钥，安全性更高。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;第四步：多Mac设备同步，不用重复配置&lt;a href=&quot;#第四步多mac设备同步不用重复配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我有个朋友，公司和家里各有一台Mac，每次换电脑都要重新配SSH，烦得不行。我跟他说，直接拷配置文件就完事。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;方案一：老老实实重新生成（最安全）&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在新Mac上重新生成密钥，然后把公钥发给所有服务器。这样每台Mac都有独立的身份，丢了其中一台也不怕。缺点是：服务器多的话，要发很多次。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;方案二：直接拷贝老配置（最快捷）&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你像我一样，懒得重复劳动，直接把老Mac的SSH配置搬过去：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;拷贝文件&lt;/strong&gt;：用AirDrop把 &lt;code&gt;~/.ssh/&lt;/code&gt; 整个文件夹发到新Mac&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修复权限&lt;/strong&gt;：拷贝完之后，权限会乱，这是生死攸关的一步！&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;700&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.ssh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;600&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.ssh/id_ed25519&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;644&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.ssh/config&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：如果权限不对，SSH会直接报错，说”permissions are too open”。我第一次拷贝就踩了这个坑，还以为是密钥坏了，排查了半天才发现是权限问题。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;方案三：iCloud实时同步（最酷炫）&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你经常在两台Mac间切换，建议把 &lt;code&gt;config&lt;/code&gt; 文件放到iCloud里，然后用软链接指向它：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ln&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-s&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/Library/Mobile&lt;/span&gt;&lt;span&gt;\ &lt;/span&gt;&lt;span&gt;Documents/com~apple~CloudDocs/ssh_config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.ssh/config&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这样你在任何一台Mac上修改服务器配置，另一台会自动同步。我试过，体验真的丝滑，再也不用手动同步了。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;第五步：在Kitty里一键启动&lt;a href=&quot;#第五步在kitty里一键启动&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;SSH config配好了，现在在Kitty里调用超简单。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;推荐用法&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;kitten&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ssh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;prod-web&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;注意不是普通的 &lt;code&gt;ssh&lt;/code&gt;，是 &lt;code&gt;kitten ssh&lt;/code&gt;。这个命令会自动同步Kitty的终端描述符，确保远程环境的vim、tmux配置都能完美工作。我之前用普通 &lt;code&gt;ssh&lt;/code&gt; 连服务器，vim配色总是乱，后来换成 &lt;code&gt;kitten ssh&lt;/code&gt; 直接解决。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;设置快捷别名&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;在 &lt;code&gt;~/.zshrc&lt;/code&gt; 里加一行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;alias&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;kitten ssh&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;以后你只需要敲 &lt;code&gt;s prod-web&lt;/code&gt;，瞬间登录。是不是很爽？&lt;/p&gt;&lt;p&gt;&lt;strong&gt;更酷的玩法&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;Kitty支持多窗口快捷启动，你可以直接在配置文件里预设窗口布局。比如一键打开3个窗口：一个连生产环境，一个连测试环境，一个连数据库。这个有点进阶，等你熟练了可以再研究。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;strong&gt;坑1：权限问题&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;~/.ssh/&lt;/code&gt; 目录必须是700，私钥和 &lt;code&gt;authorized_keys&lt;/code&gt; 必须是600。这个是铁律，不按这个来，SSH直接报错。我之前把目录设成了755，结果连了三天才发现问题。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;坑2：从WindTerm迁移.ppk密钥&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你有WindTerm里存的Putty格式的 &lt;code&gt;.ppk&lt;/code&gt; 密钥，不能直接用。得先用 &lt;code&gt;puttygen&lt;/code&gt; 工具转成OpenSSH格式，或者干脆重新生成一对新的。我一开始不知道，拿着 &lt;code&gt;.ppk&lt;/code&gt; 文件去配，折腾了一下午。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;坑3：多身份管理冲突&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你为不同项目用了不同的密钥对，记得在 &lt;code&gt;config&lt;/code&gt; 里给每个Host指定正确的 &lt;code&gt;IdentityFile&lt;/code&gt;。不然SSH会默认用 &lt;code&gt;~/.ssh/id_ed25519&lt;/code&gt;，导致认证失败。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;ol&gt;
&lt;li&gt;&lt;strong&gt;免密登录&lt;/strong&gt;：生成一把密钥，发给所有服务器，再也不用敲密码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;别名管理&lt;/strong&gt;：给服务器起”绰号”，&lt;code&gt;ssh 绰号&lt;/code&gt; 一键直达&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多设备同步&lt;/strong&gt;：拷贝配置或iCloud同步，新Mac立即可用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kitty增强&lt;/strong&gt;：&lt;code&gt;kitten ssh&lt;/code&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;在你的Mac上生成 &lt;code&gt;ed25519&lt;/code&gt; 密钥&lt;/li&gt;
&lt;li&gt;把公钥发给你要管理的所有服务器&lt;/li&gt;
&lt;li&gt;编辑 &lt;code&gt;~/.ssh/config&lt;/code&gt;，给每个服务器起个别名&lt;/li&gt;
&lt;li&gt;测试 &lt;code&gt;ssh 别名&lt;/code&gt;，一键登录&lt;/li&gt;
&lt;li&gt;（可选）配置iCloud同步，多设备无缝切换&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;说句实话，这套方案配好之后，我再也不想用WindTerm了。每天至少节省30分钟登录时间，多出来的时间写代码不香吗？&lt;/p&gt;&lt;p&gt;如果你在配置过程中遇到问题，欢迎在评论区留言。看到我会回复，咱们一起讨论。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>OpenWrt 固件自编译从入门到精通</title><link>https://blog.moewah.com/posts/4003/</link><guid isPermaLink="true">https://blog.moewah.com/posts/4003/</guid><description>如何在群晖DS920+上自定义编译OpenWrt固件？本文手把手教你从环境准备到插件定制的全流程，解决插件缺失或过多问题，打造专属旁路由固件。</description><pubDate>Fri, 16 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt; 之前陆陆续续使用过不少基于 OpenWrt 编译的固件都差强人意，不是插件太多了就是少了自己需要的插件。而如今有了群晖 DS920+ 配备了 12GB 的内存条件，想过自行定制插件编译固件作为旁路由使用，也才有了今天的文章。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;openwrt.png&quot; loading=&quot;lazy&quot; width=&quot;860&quot; height=&quot;400&quot; src=&quot;/_astro/4106_30968971_69d812.CMrA-1Zh_Z1SJlKv.webp&quot; srcset=&quot;/_astro/4106_30968971_69d812.CMrA-1Zh_Z85y5R.webp 640w, /_astro/4106_30968971_69d812.CMrA-1Zh_15KBR.webp 750w, /_astro/4106_30968971_69d812.CMrA-1Zh_Z26Pkgb.webp 828w, /_astro/4106_30968971_69d812.CMrA-1Zh_Z1SJlKv.webp 860w&quot; /&gt;&lt;figcaption&gt;openwrt.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;个人非常不建议在国内的本地环境进行固件编译（自备美国区富强全局模式），若非使用 GitHub Actions 进行云编译，那么我强烈推荐首选存储空间不要少于 40GB 的美国区 VPS 作为编译环境，我遇到的很多坑都是墙大环境造成的，以此为鉴。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;openwrt_gowah-1.png&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;674&quot; src=&quot;/_astro/4003_921593386_cb2f05.BePO2SSz_ZMaYce.webp&quot; srcset=&quot;/_astro/4003_921593386_cb2f05.BePO2SSz_Z171D6h.webp 640w, /_astro/4003_921593386_cb2f05.BePO2SSz_ZYHyWk.webp 750w, /_astro/4003_921593386_cb2f05.BePO2SSz_2mbYNo.webp 828w, /_astro/4003_921593386_cb2f05.BePO2SSz_ZMaYce.webp 1024w&quot; /&gt;&lt;figcaption&gt;openwrt_gowah-1.png&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img alt=&quot;openwrt_gowah.png&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;674&quot; src=&quot;/_astro/4003_1972042919_537f3c.B1sjO95f_lEHvv.webp&quot; srcset=&quot;/_astro/4003_1972042919_537f3c.B1sjO95f_Zaz4XR.webp 640w, /_astro/4003_1972042919_537f3c.B1sjO95f_1viV0I.webp 750w, /_astro/4003_1972042919_537f3c.B1sjO95f_CFAOD.webp 828w, /_astro/4003_1972042919_537f3c.B1sjO95f_lEHvv.webp 1024w&quot; /&gt;&lt;figcaption&gt;openwrt_gowah.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;编译环境准备&lt;a href=&quot;#编译环境准备&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;root&lt;/code&gt;用户进行编译，所以先使用&lt;code&gt;root&lt;/code&gt;权限创建一个用户，以创建&lt;code&gt;helloworld&lt;/code&gt;用户为例。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 添加用户&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adduser helloworld&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;为新用户设置密码&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;passwd helloworld&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;为该用户指定命令解释程序&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;usermod -s /bin/bash helloworld&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;为该用户添加&lt;code&gt;sudo&lt;/code&gt;权限&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod u+w /etc/sudoers&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;因&lt;code&gt;/etc/sudoers&lt;/code&gt;文件默认是只读文件，因此需先添加&lt;code&gt;sudoers&lt;/code&gt;文件的写权限&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod u+w /etc/sudoers&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;编辑 &lt;code&gt;sudoers&lt;/code&gt; 文件&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vim /etc/sudoers&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#找到这行 root ALL=(ALL) ALL 追加新行&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;helloworld ALL=(ALL:ALL) ALL&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;保存修改后，安全考虑建议撤销 &lt;code&gt;sudoers&lt;/code&gt; 文件写权限&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod u-w /etc/sudoers&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;创建新用户会自动创建一个以用户名命名的新目录，需要为新目录添加读写权限&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chown helloworld:helloworld -R /home/helloworld/&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;从&lt;code&gt;root&lt;/code&gt;用户切换使用新用户&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 运行两次，并输入新用户的密码进行切换&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;su helloworld&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;从此刻开始，以非&lt;code&gt;root&lt;/code&gt;用户执行编译过程的所有操作。&lt;/p&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 更新软件列表、升级软件包&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo sh -c &quot;apt update &amp;amp;&amp;amp; apt upgrade -y&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;ubuntu 20.04 （推荐系统），安装依赖&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch python3 python2.7 unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler g++-multilib antlr3 gperf wget curl swig rsync&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;ubuntu 18.04 安装依赖&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs gcc-multilib g++-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler antlr3 gperf wget swig rsync&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;code&gt;root&lt;/code&gt; 用户！&lt;/p&gt;&lt;/blockquote&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git clone https://github.com/coolsnowwolf/lede.git openwrt&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 进入openwrt目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd ~/openwrt&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 添加自定义源&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat &amp;gt;&amp;gt; feeds.conf.default &amp;lt;&amp;lt;EOF&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;src-git kenzo https://github.com/kenzok8/openwrt-packages&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;src-git passwall https://github.com/xiaorouji/openwrt-passwall&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;EOF&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;更新下载软件仓库的源码到本地，并安装自定义源包含的软件包&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;./scripts/feeds update -a &amp;amp;&amp;amp; ./scripts/feeds install -a&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;如果需要单独添加软件，请拉取源码到 package  目录之下。示例如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 添加 OpenAppFilter 应用过滤插件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git clone https://github.com/destan19/OpenAppFilter package/OpenAppFilter&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;注：此操作请在编译前执行，设置 argon 为默认主题，以此为例举一反三&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 删除自定义源默认的 argon 主题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm -rf package/lean/luci-theme-argon&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 部分第三方源自带 argon 主题，上面命令删除不掉的请运行下面命令&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;find ./ -name luci-theme-argon | xargs rm -rf;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 针对 LEDE 项目拉取 argon 原作者的源码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git clone -b 18.06 https://github.com/jerrykuku/luci-theme-argon.git package/lean/luci-theme-argon&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 替换默认主题为 luci-theme-argon&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sed -i &apos;s/luci-theme-bootstrap/luci-theme-argon/&apos; feeds/luci/collections/luci/Makefile&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;设置路由器默认的 LAN IP（可选项）&lt;a href=&quot;#设置路由器默认的-lan-ip可选项&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;注：此操作请在编译前执行&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 设置默认IP为 192.168.199.1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sed -i &apos;s/192.168.1.1/192.168.199.1/g&apos; package/base-files/files/bin/config_generate&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;&lt;strong&gt;仅制作.config文件，无需本地编译固件&lt;/strong&gt; （可选项）&lt;a href=&quot;#仅制作config文件无需本地编译固件-可选项&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;根据自己的定制需求，调整 Open­Wrt 系统组件&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;make menuconfig&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;通过以下命令行获得 &lt;code&gt;seed.config&lt;/code&gt;配置文件，然后使用 GitHub Actions 云编译。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 若在调整OpenWrt系统组件的过程有多次保存操作，则建议先删除.config.old文件再继续操作&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm -f .config.old&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 根据编译环境生成默认配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;make defconfig&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 对比默认配置的差异部分生成配置文件（可以理解为增量）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;./scripts/diffconfig.sh &amp;gt; seed.config&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;&lt;strong&gt;若需要编译固件&lt;/strong&gt;&lt;a href=&quot;#若需要编译固件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;根据自己的定制需求，调整 Open­Wrt 系统组件&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;make menuconfig&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;下载编译所需的软件包&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;make download -j8 V=s&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;编译 OpenWrt 固件&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# -j1：单线程编译&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;make -j1 V=s&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;单线程编译可提高编译成功率，但过程非常漫长，也完全取决于机器的性能。编译完成后固件输出路径： &lt;code&gt;/openwrt/bin/targets/&lt;/code&gt;之下。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;code&gt;root&lt;/code&gt; 用户！&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;更新本地编译环境&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 更新软件列表、升级软件包&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo sh -c &quot;apt update &amp;amp;&amp;amp; apt upgrade -y&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 拉取最新源码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd ~/openwrt &amp;amp;&amp;amp; git pull&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 更新下载安装订阅源包含的软件包&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd ~/openwrt&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;./scripts/feeds update -a &amp;amp;&amp;amp; ./scripts/feeds install -a&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;清理旧文件&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 删除/bin和/build_dir目录中的文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;make clean&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果要更换架构，例如要从 &lt;code&gt;x86_64&lt;/code&gt; 换到 &lt;code&gt;MediaTek Ralink MIPS&lt;/code&gt; 建议执行以下命令深度清理&lt;code&gt;/bin&lt;/code&gt;和&lt;code&gt;/build_dir&lt;/code&gt;目录的中的文件(&lt;code&gt;make clean&lt;/code&gt;)以及&lt;code&gt;/staging_dir&lt;/code&gt;、&lt;code&gt;/toolchain&lt;/code&gt;、&lt;code&gt;/tmp&lt;/code&gt;和&lt;code&gt;/logs&lt;/code&gt;中的文件。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;make dirclean&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果需要对组件重新调整，则建议先删除旧配置&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm -rf ./tmp &amp;amp;&amp;amp; rm -rf .config&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;根据自己的定制需求，再次调整 Open­Wrt 系统组件&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;make menuconfig&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;下载编译所需的软件包&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;make download -j8 V=s&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;编译 OpenWrt 固件&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;make -j$(nproc) || make -j1 || make -j1 V=s&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;二次编译可以优先使用多线程，报错会自动使用单线程，仍然报错会单线程执行编译并输出详细日志。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;make menuconfig&lt;/code&gt;命令配置目标架构完成后，进入 &lt;code&gt;LUCI --&amp;gt; Applications&lt;/code&gt; 选择需要的插件，进入 &lt;code&gt;LUCI --&amp;gt; Themes&lt;/code&gt; 选择喜欢的主题皮肤，编译即可。&lt;/p&gt;&lt;p&gt;如果是硬路由且需要闭源的 Wi-Fi 驱动，务必记得勾选&lt;code&gt;luci-app-mtwifi&lt;/code&gt;&lt;/p&gt;&lt;section&gt;&lt;h3&gt;1. x86_64 平台&lt;a href=&quot;#1-x86_64-平台&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Target System (x86)  ---&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Subtarget (x86_64)  ---&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Target Profile (Generic x86/64)  ---&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;无特殊需求，那么 &lt;code&gt;Target Images&lt;/code&gt; 勾选&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[*] squashfs (NEW)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[*] Build GRUB images (Linux x86 or x86_64 host only) (NEW)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[*] GZip images (NEW)&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;自定义固件大小&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(32) Kernel partition size (in MB) (NEW)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(400) Root filesystem partition size (in MB) (NEW)&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果因为勾选基于 EXT4 文件系统编译固件而造成编译报错，建议调高&lt;code&gt;Root filesystem partition size&lt;/code&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&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;在调整 OpenWrt 系统组件时：&lt;code&gt;[*] &lt;/code&gt;表示编译软件包并加入到固件；&lt;code&gt;[M]&lt;/code&gt; 表示编译软件包但不加入固件；&lt;code&gt;[ ]&lt;/code&gt;则表示不对软件包进行任何设置。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 插件类&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Applications ---&amp;gt; luci-app-accesscontrol #上网时间控制&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Applications ---&amp;gt; luci-app-adbyby-plus   #去广告&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Applications ---&amp;gt; luci-app-arpbind  #IP/MAC绑定&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Applications ---&amp;gt; luci-app-autoreboot  #高级重启&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Applications ---&amp;gt; luci-app-aliddns   #阿里DDNS客户端&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Applications ---&amp;gt; luci-app-ddns   #动态域名 DNS&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Applications ---&amp;gt; luci-app-filetransfer  #文件传输&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Applications ---&amp;gt; luci-app-firewall   #添加防火墙&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Applications ---&amp;gt; luci-app-frpc   #内网穿透 Frp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Applications ---&amp;gt; luci-app-mwan3   #MWAN负载均衡&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Applications ---&amp;gt; luci-app-nlbwmon   #网络带宽监视器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Applications ---&amp;gt; luci-app-ramfree  #释放内存&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Applications ---&amp;gt; luci-app-samba   #网络共享(Samba)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Applications ---&amp;gt; luci-app-sqm  #流量智能队列管理(QOS)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Applications ---&amp;gt; luci-app-openclash #你懂的那只猫&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Applications ---&amp;gt; luci-app-dnsfilter #广告过滤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Applications ---&amp;gt; luci-app-passwall #不敢解释&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Applications ---&amp;gt; luci-app-mtwifi #闭源Wi-Fi驱动&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Applications ---&amp;gt; luci-app-eqos #根据IP控制网速&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Applications ---&amp;gt; luci-app-syncdial #薛定谔的多拨应用&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Applications ---&amp;gt; luci-app-zerotier #虚拟局域网&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Applications ---&amp;gt; luci-app-oaf #应用过滤神器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Applications ---&amp;gt; luci-app-watchcat #断网检测功能与定时重启&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Applications ---&amp;gt; luci-app-wol   #WOL网络唤醒&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Applications ---&amp;gt; luci-app-wrtbwmon  #实时流量监测&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Applications ---&amp;gt; luci-app-upnp   #通用即插即用UPnP(端口自动转发)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Applications ---&amp;gt; luci-app-argon-config #Argon主题设置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 常用主题类&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Themes ---&amp;gt; luci-theme-argon&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 网络相关 (普通用户用不上）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Network ---&amp;gt; IP Addresses and Names ---&amp;gt; ddns-scripts_cloudflare.com-v4 # 动态域名解析（DDNS）的 Cloudflare IPv4 支持脚本&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Network ---&amp;gt; IP Addresses and Names ---&amp;gt;  bind-dig # ISC BIND 9 提供的经典 DNS 详细诊断与查询工具（dig 命令）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Network ---&amp;gt; IP Addresses and Names ---&amp;gt;  bind-host # ISC BIND 9 标准 DNS 查询工具（host 命令）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Network ---&amp;gt; IP Addresses and Names ---&amp;gt;  drill # 专为 DNSSEC 调试而生的高级 DNS 查询工具&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Network ---&amp;gt; Routing and Rediction ---&amp;gt; ip-full # 完整版的 IP 路由管理工具（提供完整的 ip 命令，支持高级策略路由）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Network ---&amp;gt; File Transfer ---&amp;gt; curl # 强大的命令行 URL 传输与下载工具（支持多协议及 API 调用）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Network ---&amp;gt; File Transfer ---&amp;gt; wget-ssl # 支持 SSL/TLS 加密的安全下载工具（常用于脚本自动化下载）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Network ---&amp;gt; iperf3 # 网络带宽与吞吐量测试工具（常用于测试局域网/无线网络跑满速度）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Network ---&amp;gt; ipset # IP 集合管理工具（可将大量 IP 归类为一个集合，供防火墙高效批量调用）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Network ---&amp;gt; socat #多功能的网络工具（常用于端口转发、数据流重定向等）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Base system --&amp;gt; dnsmasq-full #DNS缓存和DHCP服务（dnsmasq-full和dnsmasq二者不可共存）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 内核与网络加速扩展 (高级用户进阶）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Kernel modules ---&amp;gt; Netfilter Extensions ---&amp;gt; kmod-nft-fullcone # NFTables 的 Full Cone NAT 补丁，提升 NAT1 游戏/P2P 体验&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 工具类 (普通用户用不上）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Utilities ---&amp;gt; acpid  #电源管理接口（适用于x86平台）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;51&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Utilities ---&amp;gt; Editors ---&amp;gt; nano #Nano 编辑器（轻量直观的文本编辑器）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;52&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Utilities ---&amp;gt; Editors ---&amp;gt; vim #经典的 Vim 文本编辑器（功能强大、适合熟手的高级编辑器）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;53&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Utilities ---&amp;gt; Shells ---&amp;gt; bash #命令解释程序（提供比默认 Ash 更丰富、兼容性更好的脚本运行环境）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;54&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Utilities ---&amp;gt; disc ---&amp;gt; eject #弹出可移动介质&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;55&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Utilities ---&amp;gt; disc ---&amp;gt; fdisk #MBR分区工具（传统的磁盘分区管理工具）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;56&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Utilities ---&amp;gt; disc ---&amp;gt; gdisk #GBT分区工具（适用于大容量硬盘的 GPT 分区管理工具）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;57&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Utilities ---&amp;gt; disc ---&amp;gt; lsblk #列出磁盘设备及分区查看工具&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;58&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Utilities ---&amp;gt; Filesystem ---&amp;gt; resize2fs #调整文件系统大小（常用于固件扩容后调整分区容量）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;59&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Utilities ---&amp;gt; Filesystem ---&amp;gt; e2fsprogs #Ext2（及Ext3/4）文件系统工具（包含格式化、修复等工具集）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;60&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Utilities ---&amp;gt; Compression ---&amp;gt; unzip #Zip 压缩包解压工具&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;61&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Utilities ---&amp;gt; Compression ---&amp;gt; gzip #Gzip 压缩/解压工具&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;62&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Utilities ---&amp;gt; lsof #列出当前系统打开文件的工具（常用于排查端口占用和文件读写）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;63&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Utilities ---&amp;gt; iftop #实时的网络流量监控工具（终端顶配版流量计）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;64&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;65&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# IPv6（未来运营商可能不再提供 IPv4 公网地址，有远程访问需求的建议加入）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;66&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Extra packages ---&amp;gt; ipv6helper （勾选此项即可，下面几项自动勾选。集成基础的 IPv6 支持环境）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;67&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Network ---&amp;gt; odhcp6c # 轻量级 IPv6 客户端（用于获取运营商分配的 WAN 口 IPv6 地址）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;68&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Network ---&amp;gt; odhcpd-ipv6only # 仅支持 IPv6 的内网 DHCPv6/RA 路由器公告守护进程&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;69&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Protocols ---&amp;gt; luci-proto-ipv6 # Web 界面下的 IPv6 协议配置支持&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;70&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LuCI ---&amp;gt; Protocols ---&amp;gt; luci-proto-ppp # Web 界面下的 PPPoE/PPtP 等点对点拨号协议支持&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 为 OpenWrt 单独编译 ipk 插件&lt;a href=&quot;#3-为-openwrt-单独编译-ipk-插件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;相关文章，请移步 -&amp;gt; &lt;a href=&quot;https://blog.moewah.com/posts/4658/&quot;&gt;《为 OpenWrt 单独编译 ipk 插件》&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. OpenWrt 新手配置使用指南&lt;a href=&quot;#4-openwrt-新手配置使用指南&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;相关文章，请移步 -&amp;gt; &lt;a href=&quot;https://blog.moewah.com/posts/4054/&quot;&gt;《OpenWrt 新手配置使用指南》&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>如何做好研究：没人教过你的 8 项基本功</title><link>https://blog.moewah.com/posts/how-to-be-good-at-research/</link><guid isPermaLink="true">https://blog.moewah.com/posts/how-to-be-good-at-research/</guid><description>Hamming、Feynman、Shannon——没有人真正教过你怎么做研究。这篇文章把多位研究巨匠的方法论浓缩为 8 项可刻意训练的基本功：从自己选题到收紧循环，从盯着输出看到找到你的人。研究能力不是天赋，是技能叠加。</description><pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;你领到一张桌子，一个别人替你选好的问题，还有一条模糊的指示——做出点新东西来。&lt;/p&gt;
&lt;p&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;section&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;Hamming 在贝尔实验室午餐时会问旁边的人： &lt;strong&gt;你们领域的重要问题是什么？那你为什么不去做？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;人们开始换桌子。&lt;/p&gt;&lt;p&gt;大多数人不是在选题，而是在吸收问题——从导师、大实验室、热门论文那里吸收。吸收来的问题，你拥有结论但没有推理过程。你不知道他们为什么在意，不知道什么情况下他们会放弃。等他们转向了，你要过一年才发现。&lt;/p&gt;&lt;p&gt;Schulman 把研究分成两种模式。一种读文献找改进空间。另一种先选定你真心希望它变成现实的结果，反向推导实验。他推崇第二种。一个你真正在意的目标，会把你拽进任何综述论文覆盖不到的疆域。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;品味是肌肉，不是天赋。&lt;/strong&gt; 跑每个实验前先预测结果。遮住论文结果部分，仅凭方法猜数字。预测、修正、重复几百次——所有好模型都这么训练，包括你头脑里的那个。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;共享的阅读清单产出共享的想法。信息食谱如果是 arXiv 热门加群聊过滤，你会和所有人同时得出相同结论——价值约等于零。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;旧材料被严重低估——低得离谱。&lt;/strong&gt; Shannon 在 1952 年的演讲里做了一件事：把问题缩到几乎微不足道，搞定缩小版，再把难度一块块装回去。就这一招，胜过任何现代生产力建议。&lt;/p&gt;&lt;p&gt;广度不亚于深度。懂 GPU 怎么搬运内存，就能在基准测试跑出来之前判断哪些架构论文注定失败。诚实的统计学可能是 ML 最稀缺的技能——很多发表出来的严谨不过是”用误差线包装的直觉”。&lt;/p&gt;&lt;p&gt;读论文本身，不要读总结帖。附录才是真正藏东西的地方。局限性部分通常是整篇文档里最诚实的一段。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;Paul Graham 发现，一个想法在写成文字之前可以一直自我感觉很完整。纸面会暴露你头脑自动抹平的裂缝：那个没检验过的假设，那个不成立的推理步骤，那两句互相矛盾的主张。&lt;/p&gt;&lt;p&gt;Feynman 的准则： &lt;strong&gt;第一个你不能骗的人是你自己。&lt;/strong&gt; 写作是最便宜的防御。Darwin 更进一步——任何相悖的事实当场记下来，因为他发现记忆删除不利证据比删除有利证据更快。你的记忆对你失败的实验做着同样的事。&lt;/p&gt;&lt;p&gt;写日志：假设、设置、预期、结果、更新后的信念。重读上个月的条目，那种谦卑任何审稿人都无法匹敌。&lt;/p&gt;&lt;p&gt;公开发布一部分。&lt;strong&gt;一份清晰的解释是真正的贡献，不是服务性工作。&lt;/strong&gt; 一整套公开发表的写作，是你思维方式最诚实的样本——无法伪造的那种。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;关于 Alec Radford 的故事很少涉及神来之笔。它们关乎的是量：每天更多实验，每周丢弃更多错误想法。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;研究速度，本质上是你发现自己错了的速度。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;工具建设是头等研究活动。启动实验，一条命令。画图，再一条命令。每次运行从配置文件复现。Karpathy 的诀窍：在规模化训练前，先在单个批次上过拟合。三十秒，一半 bug 消失。缩到足够小，先做对，再投算力。&lt;/p&gt;&lt;p&gt;放弃”工程只是配角”的观念。前沿领域两者已融为一体。能自己搭建实验框架的人，假设才真正得到检验。其他人都在排队。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;Karpathy 在写任何训练代码之前，花几个小时亲手处理原始数据。大多数 ML 的 bug 藏在数据里，失败得悄无声息。什么都不会崩溃，你只会得到一个平庸的模型和一个错误的理论。&lt;/p&gt;&lt;p&gt;Andrew Ng 教了十几年同一个方法： &lt;strong&gt;拉出一百个失败案例，全部读一遍，归成几堆，攻击最大的一堆。&lt;/strong&gt; 一段真正怪异的行为记录，比精确率小数点后多一位能教的要多得多。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;p&gt;每个想法先跑一次性版本，让大部分尽早死掉。基线调到痛为止——ML 的坟场里堆满了在调好的基线上蒸发掉的收益。做消融实验直到弄清哪个组件撑起了结果。通常只有一个，通常不是标题里那个。&lt;/p&gt;&lt;p&gt;广度是保险。子领域都会饱和，就在推特上达到顶峰之后。能穿越转换期持续产出的人，早已熟悉邻近领域。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;Hamming 注意到一个模式：关着门的同事每年产出更多，开着门的同事做出了真正重要的工作。&lt;/p&gt;&lt;p&gt;因为每一次打断都在告诉你一件事——世界真正需要什么。你的敞开的门，大概是个收件箱。让它保持敞开。&lt;/p&gt;&lt;p&gt;慷慨的复利效应无与伦比。复现结果并发表。把给自己做的工具发布出去。用通俗语言解释难事。回报从侧面来——几个月后的合作、引用、你本不可能申请的职位。&lt;/p&gt;&lt;p&gt;半成型的想法公开抛出来。在时间线上犯错的代价，远比在出版物上犯错小。那个在陷进去三个月前就告诉你想法不行的合作者，价值胜过算力。这种关系买不到，只能挣来。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;Pasteur：机遇青睐有准备的头脑。&lt;/p&gt;&lt;p&gt;Hamming 搭建了一整套哲学：&lt;strong&gt;知识和生产力像利息一样复利增长。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;日积月累的优势单独看微不足道。你读的东西、记录的东西、循环跑多快、跟谁争辩。给它们几年，它们造就出在外人眼里像是运气的职业生涯。&lt;/p&gt;&lt;p&gt;在觉得必要之前开始复利。现在才是代价最小的时候。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;以上这八件事，没人会替你做。但好消息是，你也不需要任何人批准才能开始。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Goal 是目的地，Loop 是导航：AI 真正变聪明的核心秘密</title><link>https://blog.moewah.com/posts/goal-loop-ai-agent-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/goal-loop-ai-agent-guide/</guid><description>一文讲透 AI Agent 的两大核心概念：Goal（目标）与 Loop（循环）。从基础定义到 8 种主流 Loop 类型详解，再到可直接复用的提示词模板，帮你从被动提问者升级为 AI 指挥官。</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;想象一下，你终于拥有了一个超级聪明的 AI 助手。它不再是简单一问一答的”工具”，而像一个靠谱、聪明、会思考的旅行伙伴：它清楚最终要去哪里（&lt;strong&gt;Goal&lt;/strong&gt;），并且懂得如何灵活、边走边调整地抵达目的地（&lt;strong&gt;Loop&lt;/strong&gt;）。&lt;/p&gt;
&lt;p&gt;今天，我们把 &lt;strong&gt;Goal&lt;/strong&gt; 和 &lt;strong&gt;Loop&lt;/strong&gt; 这两个 AI Agent 核心概念，从基础定义、关系、结合方式、具体类型、实际应用，全方位讲透。无论你是初学者还是已有一定经验，读完这篇文章，你都能真正理解并上手使用它们。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;一、Goal（目标）：AI 的清晰终点和成功标准&lt;a href=&quot;#一goal目标ai-的清晰终点和成功标准&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt; 就是一个确定、具体、可衡量、可验证的期望结果。它回答的核心问题是：“&lt;strong&gt;最终我要达成什么？什么时候算成功？&lt;/strong&gt;”&lt;/p&gt;&lt;p&gt;好的 &lt;strong&gt;Goal&lt;/strong&gt; 就像精确的导航终点，而不是模糊的”随便逛逛”。它为 AI 提供明确的&lt;strong&gt;方向感、停止条件和评判依据&lt;/strong&gt;，让 AI 不会漫无目的地乱跑。&lt;/p&gt;&lt;section&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;让 AI 知道什么时候可以停止工作&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;五个实际 Goal 示例&lt;a href=&quot;#五个实际-goal-示例&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;帮我规划一个 7 天日本自由行，总预算不超过 15000 元，包括机票、酒店、美食和迪士尼，要有每天详细行程和备用方案。&lt;/li&gt;
&lt;li&gt;在不改变原有功能的前提下，把这个 Python 脚本的运行速度提升至少 30%，并保持代码可读性。&lt;/li&gt;
&lt;li&gt;根据我目前 65kg、体脂率 22% 的身体数据，制定 12 周减脂增肌计划，每周更新一次，根据我的反馈调整。&lt;/li&gt;
&lt;li&gt;用最友善且专业的语气，在 3 轮对话内解决用户”iPhone 无法连接 WiFi”的问题，并确认用户真正满意。&lt;/li&gt;
&lt;li&gt;找出过去 30 天内，市值在 500 亿以上、且有明显上涨趋势但估值合理的 3 只 A 股，列出理由和风险。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;二、Loop（循环）：AI 的智能执行引擎&lt;a href=&quot;#二loop循环ai-的智能执行引擎&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Loop&lt;/strong&gt; 是 Agent 围绕 &lt;strong&gt;Goal&lt;/strong&gt; 反复进行的”思考-行动-反馈-调整”的动态迭代机制。它不是死板的步骤清单，而是一套让 AI 能够&lt;strong&gt;试错、学习、观察、自我修正&lt;/strong&gt;的”自动驾驶系统”。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;为什么需要 Loop？&lt;/strong&gt;
现实世界复杂多变、信息不完整、任务往往需要多步操作，一次性完美执行几乎不可能。&lt;strong&gt;Loop&lt;/strong&gt; 让 AI 像人类学骑自行车一样：试 → 错 → 学 → 改 → 再试，直到达成 &lt;strong&gt;Goal&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Loop 的本质&lt;/strong&gt;：迭代 + 反馈 + 自我纠错 + 持续优化。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三、Goal 与 Loop 的关系及结合方式&lt;a href=&quot;#三goal-与-loop-的关系及结合方式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt; 和 &lt;strong&gt;Loop&lt;/strong&gt; 不是两个独立的东西，而是”灵魂伴侣”，必须紧密串联在一起才能发挥最大威力。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Goal&lt;/strong&gt; 是静态的”目的地”和&lt;strong&gt;结果导向&lt;/strong&gt;（告诉 AI 要去哪里、什么算成功）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Loop&lt;/strong&gt; 是动态的”路径规划 + 导航纠错系统”和&lt;strong&gt;过程导向&lt;/strong&gt;（告诉 AI 怎么聪明地、可靠地一步步去那里）。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;单独 Goal&lt;/strong&gt; → AI 可能一次性输出，但容易浅显或出错。
&lt;strong&gt;单独 Loop&lt;/strong&gt; → 没有明确方向，容易跑偏或浪费步骤。
&lt;strong&gt;Goal&lt;/strong&gt; + &lt;strong&gt;Loop&lt;/strong&gt; 紧密结合 → AI 变得有方向、有方法、能自我纠错、结果可靠且高质量。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;最经典的结合方式&lt;/strong&gt;：
&lt;strong&gt;用清晰的 Goal 驱动整个 Loop，让所有思考、行动、反思都紧紧围绕 Goal 进行，直到 Goal 被完全达成或达到最大迭代次数。&lt;/strong&gt;&lt;/p&gt;&lt;section&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;Goal&lt;/strong&gt;：
“帮我写一封高质量的升职申请邮件，发给部门总监。要求语气自信且谦虚，突出我过去一年的核心业绩，并让领导觉得我升职后能为团队带来更大价值。最终邮件长度控制在 250-300 字。”&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Goal 驱动下的 Loop 实际运行过程&lt;/strong&gt;（混合多种 Loop）：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Plan-Execute 阶段&lt;/strong&gt;：先规划邮件结构（开头 + 业绩 + 未来价值 + 结尾）→ 逐段撰写初稿。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ReAct 阶段&lt;/strong&gt;：思考哪些业绩最有说服力 → 行动：快速回顾用户提供的聊天记录或数据 → 观察并提取量化数字（如”业绩提升 42%”）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reflective / Reflexion 阶段&lt;/strong&gt;：读完初稿后深度反思——语气是否自信但不骄傲？成就是否量化？是否体现团队贡献？长度是否合适？→ 大幅修改（增加数据、软化语气、强化未来价值）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memory + Adaptive 阶段&lt;/strong&gt;：参考用户以前的写作偏好（不喜欢过于正式词汇），进行针对性调整。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verify + 最终检查&lt;/strong&gt;：对比最初 &lt;strong&gt;Goal&lt;/strong&gt;，确认 100% 符合 → 输出最终版本。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;整个过程中，&lt;strong&gt;Goal 像指挥官&lt;/strong&gt;，&lt;strong&gt;Loop 像执行部队&lt;/strong&gt;，持续围绕 &lt;strong&gt;Goal&lt;/strong&gt; 迭代、纠偏，直到完美达成。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;四、主流 Loop 类型大全（8 种，附详细例子）&lt;a href=&quot;#四主流-loop-类型大全8-种附详细例子&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. ReAct Loop（思考-行动-观察循环）&lt;a href=&quot;#1-react-loop思考-行动-观察循环&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;：Think（思考）→ Act（行动/调用工具）→ Observe（观察结果）→ 再 Think……&lt;/p&gt;&lt;p&gt;&lt;strong&gt;适合&lt;/strong&gt;：信息检索、工具调用、日常多步任务。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;例子：&lt;/strong&gt;
Goal = “帮我查最新 iPhone 17 的售价和真实用户评价”
Loop 过程：思考 → 先用搜索引擎查找官方价格 → 观察结果 → 发现需要真实评价 → 去小红书和京东查看用户评论 → 观察总结优缺点 → 输出最终答案。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. ReWOO（先推理后执行循环）&lt;a href=&quot;#2-rewoo先推理后执行循环&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;ReAct 的优化变体。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;核心&lt;/strong&gt;：先完整推理出所有步骤和计划，再一次性批量执行，减少中间观察次数。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;适合&lt;/strong&gt;：需要降低延迟、工具调用成本较高的场景。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;例子：&lt;/strong&gt;
Goal = “帮我对比三款热门洗衣机并推荐最适合的”
Loop 过程：先完整思考所有对比维度（价格、容量、能耗、品牌、用户痛点）并列出计划 → 一次性批量调用搜索和网页浏览工具 → 收集所有信息后一次性输出详细对比表。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. Plan-Execute-Verify Loop（规划-执行-验证循环）&lt;a href=&quot;#3-plan-execute-verify-loop规划-执行-验证循环&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;p&gt;&lt;strong&gt;适合&lt;/strong&gt;：写报告、项目计划、结构化复杂任务。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;例子：&lt;/strong&gt;
Goal = “帮我写一份下季度部门销售OKR”
Loop 过程：先整体规划 5 个主要模块和关键指标 → 逐条撰写具体内容 → 执行完成后验证（是否 SMART、可衡量、与公司目标对齐）→ 若有问题则重新规划部分内容。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. Reflective / Reflexion Loop（反思-自我批评循环）&lt;a href=&quot;#4-reflective--reflexion-loop反思-自我批评循环&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;p&gt;&lt;strong&gt;适合&lt;/strong&gt;：写作、方案设计、需要高品质输出的场景（Reflexion 强调从失败中系统性学习）。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;例子：&lt;/strong&gt;
Goal = “帮我写一封升职申请邮件”
Loop 过程：先写一版初稿 → Reflect：语气是否自信但不骄傲？成就数据是否量化？领导最关心什么？→ 根据反思修改（增加具体业绩数据、软化语气）→ 再 Reflect 一次 → 最终定稿。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. Hierarchical Loop（分层 / 树状循环）&lt;a href=&quot;#5-hierarchical-loop分层--树状循环&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;：高层 Loop 负责战略分解和 Review，低层 Loop 负责具体执行细节。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;适合&lt;/strong&gt;：大型复杂项目、长期工程。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;扩展&lt;/strong&gt;：可演变为 Multi-Agent Hierarchical（多个 Agent 协作，一个经理 Agent + 多个执行 Agent）。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;例子：&lt;/strong&gt;
Goal = “帮我做一个个人副业从 0 到 1 的完整方案（目标月入 5000 元）”
Loop 过程：高层 Loop 分解成”选方向→市场验证→产品搭建→获客→变现”五大阶段 → 每个阶段启动低层 Loop 执行细节 → 高层每完成一个阶段就 Review（回顾评估）并决定是否调整方向。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6. Memory + Adaptive Loop（记忆 + 自适应循环）&lt;a href=&quot;#6-memory--adaptive-loop记忆--自适应循环&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;p&gt;&lt;strong&gt;适合&lt;/strong&gt;：长期个人助理、健身教练、持续优化类任务。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;例子：&lt;/strong&gt;
Goal = “当我的长期健身教练，帮我减脂”
Loop 过程：第 1 周推荐跑步计划 → 用户反馈坚持不了 → 记忆记录”讨厌跑步、早起困难” → 第 2 周参考记忆改成晚上 HIIT 训练 → 后续循环持续积累用户偏好和身体反馈，方案越来越精准。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;7. Perceive-Reason-Plan-Act-Observe Loop（完整五阶段循环）&lt;a href=&quot;#7-perceive-reason-plan-act-observe-loop完整五阶段循环&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;更全面的感知版 ReAct。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;流程&lt;/strong&gt;：感知环境 → 推理分析 → 制定计划 → 执行行动 → 观察反馈。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;适合&lt;/strong&gt;：需要强环境感知的复杂动态任务（如机器人、实时决策）。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;例子：&lt;/strong&gt;
Goal = “实时监控我的股票组合并在必要时提醒调整”
Loop 过程：感知（获取最新股价和新闻）→ 推理（分析风险和机会）→ 制定计划（是否卖出或加仓）→ 执行行动（生成提醒或建议）→ 观察用户反馈和市场后续变化。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;8. Self-Improving / Evolutionary Loop（自我进化循环）&lt;a href=&quot;#8-self-improving--evolutionary-loop自我进化循环&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;p&gt;&lt;strong&gt;适合&lt;/strong&gt;：需要长期能力提升的研究型 Agent 或产品。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;例子：&lt;/strong&gt;
Goal = “长期帮我提升英语写作能力”
Loop 过程：批改一篇作文 → 评估错误类型和弱点 → 自我优化（总结本次最有效的教学方法）→ 把新学到的教学技巧注入下次循环 → 随着时间推移，批改和建议质量越来越高。&lt;/p&gt;&lt;/section&gt;&lt;section&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;最强 Agent 通常是多种 Loop 混合：例如 ReAct + Reflective + Memory 的组合，或 Hierarchical + Multi-Agent。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;五、如何在实际交互中高效使用 Goal + Loop&lt;a href=&quot;#五如何在实际交互中高效使用-goal--loop&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;strong&gt;清晰具体的 Goal&lt;/strong&gt;，包含成功标准与可验证的完成信号。&lt;/li&gt;
&lt;li&gt;明确指示要使用的 &lt;strong&gt;Loop 类型或组合&lt;/strong&gt;，必要时指定每个循环的&lt;strong&gt;最大迭代次数&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;在过程中持续提供反馈，帮助 Loop 更好地迭代；遇到不确定时，主动要求 AI 提问确认。&lt;/li&gt;
&lt;li&gt;对于复杂任务，可以要求 AI 在每个阶段结束时暂设”反思点”，由你来判断是否进入下一阶段。&lt;/li&gt;
&lt;li&gt;记得利用对话中的历史偏好（语气、格式、禁忌等），无需每次重复说明。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Goal：【清晰写出目标、成功标准和可验证的完成信号】&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;请严格围绕 Goal，按以下流程完成任务，并在必要时根据复杂度灵活裁剪步骤，但始终以达成 Goal 为最高优先级：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. **顶层规划 (Plan-Execute-Verify)**：先输出一个分阶段计划，每个阶段有明确的产出物和验证方式。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. **逐步执行 (ReAct)**：执行每个阶段时，使用&quot;思考-行动-观察&quot;循环调用必要工具。简单阶段可直接执行，不必强行套用。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. **阶段反思 (Reflective Loop)**：每完成一个主要阶段后，对比当前产出与 Goal 的差距，提炼可改进的点并决定是否调整后续计划。同一阶段反思**最多 2 轮**，若无明显提升则保留最佳结果继续。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4. **偏好记忆 (Memory)**：结合我在本次对话中已明确的偏好（如语气、格式、禁忌）来调整输出。若关键偏好不明确，主动提问确认。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;5. **最终对齐**：所有阶段完成后，对照成功标准逐条自检。如有偏差，说明原因并直接修正；若无偏差，直接输出最终结果。不追求虚假的&quot;完美&quot;，承认必要的权衡。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;全程保持透明，随时告知当前进度和关键思考。遇到不确定的信息或需要我做决策时，立即暂停并提问。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;Goal&lt;/strong&gt;：帮我配一台预算 1000 元的二手游戏笔记本，要求能在中低画质流畅运行《英雄联盟》《CS》等主流网游，必须是国内二手市场容易买到的型号。最终给出 3 个最优推荐，并说明每款的配置、价格区间和优缺点。请使用 ReAct + Reflective Loop，每个阶段反思最多 2 轮。“&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;六、如何借助 AI 设计 Goal + Loop 工作流？&lt;a href=&quot;#六如何借助-ai-设计-goal--loop-工作流&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我们之前优化出的 Goal + Loop 模板，其实已经是一套很成熟的”执行引擎”。但对很多人来说，&lt;strong&gt;难点不在于执行，而在于”我怎么把脑子里那个模糊的目标，转成一个合理的 Loop 组合方案”&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;所以我们需要一个”设计助手”模板：&lt;strong&gt;你只需要描述你的目标，AI 就会帮你设计出一套完整的 Goal + Loop 执行方案，并输出一个可以直接使用的提示词。&lt;/strong&gt; 这样你就省去了自己组装配件、设定迭代次数的心智成本。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;Goal + Loop 工作流设计助手提示词模板&lt;a href=&quot;#goal--loop-工作流设计助手提示词模板&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;直接复制以下内容，把 &lt;code&gt;【这里写你的任务】&lt;/code&gt; 换成你的实际需求，然后发送给 AI 即可。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;我需要你扮演一个&quot;Goal + Loop 工作流设计师&quot;。你的任务是根据我描述的目标，为我设计一套最优的 Loop 组合执行方案，并输出一个我可以直接使用的完整提示词。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;我会先告诉你我的目标，你需要做到：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. 理解我的目标，帮我提炼出一个清晰、可验证的 Goal（包含成功标准与完成信号）。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. 根据任务的性质，为我选择最合适的 Loop 类型（可从 Plan-Execute-Verify、ReAct、Reflective Loop、Memory 等中选择），并合理编排它们的执行顺序。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. 为反思类循环设定安全边界（如同一阶段最多反思 2 轮），避免无限循环。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4. 在最终输出的提示词中，保留&quot;全程保持透明，随时告知进度和思考&quot;以及&quot;遇到不确定时主动提问&quot;的交互原则。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;5. 输出的完整提示词，必须可以直接复制使用，其中 Goal 部分已根据我的任务填充好，Loop 执行流程也书写清楚。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;我当前的偏好（可选）：【如有语气、格式、禁忌等偏好，写在这里，如没有可删除此句】&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;我的任务目标是：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;【这里写你的任务】&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;/p&gt;&lt;p&gt;你工作流的设计任务内容就是：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;我需要你扮演一个&quot;Goal + Loop 工作流设计师&quot;。你的任务是根据我描述的目标，为我设计一套最优的 Loop 组合执行方案，并输出一个我可以直接使用的完整提示词。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;我当前的偏好：分析结果要客观，引用来源要标注，最终用表格对比。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;我的任务目标是：帮我分析三个主流新能源汽车品牌（比亚迪、特斯拉、蔚来）在 30 万元价位车型的核心竞争力，从产品力、品牌力、服务体系三个维度对比，并给出我的品牌选择的建议。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;AI 收到后，会分析任务特性（信息收集、多维对比、主观建议），然后可能设计出这样的执行计划：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Goal：……（明确目标、成功标准）&lt;/li&gt;
&lt;li&gt;使用 Plan-Execute-Verify 划分阶段（资料收集 → 维度分析 → 对比建议）&lt;/li&gt;
&lt;li&gt;资料收集阶段用 ReAct 搜索必要信息&lt;/li&gt;
&lt;li&gt;每个维度分析后，用 Reflective Loop 检查是否客观、是否有数据支撑，最多反思 2 轮&lt;/li&gt;
&lt;li&gt;最终对齐时，对照成功标准逐条检查，并生成对比表格&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;最后，AI 会直接输出一个封装好的、可直接用于新对话的提示词，你复制走就能开始执行任务，完全不用自己纠结”到底该不该加反思”。&lt;/p&gt;&lt;/section&gt;&lt;section&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;：把”选择 Loop”的决策负担交给 AI，你只需说清目标。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;强制安全边界&lt;/strong&gt;：要求设计时就内置最大反思次数，防止后期空转。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保留交互感&lt;/strong&gt;：输出的提示词依然会要求 AI 保持透明、主动提问，不会变成僵化的自动化脚本。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;偏好前置&lt;/strong&gt;：你可以提前注入格式、语气等偏好，让设计出来的执行方案直接贴合你的习惯。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;有了这个”设计助手”，你的 Goal + Loop 工作流才真正形成了从&lt;strong&gt;规划&lt;/strong&gt;到&lt;strong&gt;执行&lt;/strong&gt;的完整闭环：先用设计助手生成方案，再用修正版执行模板驱动任务。下次当你面对一个复杂目标时，不妨先用这个模板让 AI 帮你”把路铺好”。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;Goal 给你方向和终点，Loop 给你翅膀、导航和自我修复能力。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;两者紧密结合，就是现代 AI Agent（AutoGPT、LangChain、CrewAI 等）的核心设计思想。&lt;/p&gt;&lt;p&gt;掌握它们之后，你就从”被动提问者”真正升级成了”AI 指挥官”。你不再是简单问问题，而是能设计任务、指挥执行、迭代优化，让 AI 发挥出远超单次对话的潜力。&lt;/p&gt;&lt;section&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;从 ReAct 和 Reflective 开始练习&lt;/li&gt;
&lt;li&gt;逐渐尝试混合多种 Loop&lt;/li&gt;
&lt;li&gt;在复杂项目中引入 Hierarchical + Memory&lt;/li&gt;
&lt;li&gt;观察不同 Loop 在不同任务上的表现，不断优化你的提示技巧&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;现在，去实践吧！给自己设定一个清晰的 &lt;strong&gt;Goal&lt;/strong&gt;，选择合适的 &lt;strong&gt;Loop&lt;/strong&gt;，然后让 AI 执行。你会惊喜地发现，AI 突然变得聪明、靠谱、有条理了许多。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>史蒂芬·平克《The Sense of Style》：基于脑科学的 10 条写作法则</title><link>https://blog.moewah.com/posts/pinker-sense-of-style-writing-rules/</link><guid isPermaLink="true">https://blog.moewah.com/posts/pinker-sense-of-style-writing-rules/</guid><description>哈佛心理学家史蒂芬·平克从认知科学角度重写写作规则——知识的诅咒、古典风格、元话语、僵尸名词、树而非线……10条方法，每一条都解释了大脑究竟如何阅读。</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;史蒂芬·平克（Steven Pinker）在 TED 现场目睹过一次灾难。&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;strong&gt;the curse of knowledge&lt;/strong&gt;（知识的诅咒）。一旦你对一件事理解得太深，就再也记不起当初一无所知的感觉。你以为读者跟你站在同一条起跑线上。他们没有。&lt;/p&gt;
&lt;p&gt;这是《The Sense of Style》的起点。一本风格指南，根基不是语法教条，而是认知科学——大脑究竟怎么阅读。&lt;/p&gt;
&lt;p&gt;我读这本书的时候反复在想一个问题：为什么很多语法正确、用词精准的文章，读起来就是不对劲？&lt;/p&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;重新理解写作这件事&lt;a href=&quot;#重新理解写作这件事&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;p&gt;念起来自然的句子，看在眼里往往杂乱。读起来清爽的，念出声往往生硬。作者的职责不是取悦耳朵，是构建一个眼睛可以毫无阻力穿行的东西。媒介是纸页，不是房间。&lt;/p&gt;&lt;/section&gt;&lt;section&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;/p&gt;&lt;p&gt;他做过一个实验：让满屋子人想象”范式”（paradigm），然后”框架”（framework），然后”概念”（concept）。没人能做到——这些词不指向任何实在之物。两百年前那些至今读来鲜活的作者，没有抽象语汇可以躲藏。他们必须写鹰隼撕入血肉，而不是”攻击性”。&lt;/p&gt;&lt;p&gt;意象完成了抽象无法完成的工作。&lt;strong&gt;读者想象不出来的东西，就是没真正理解。&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;文章的结构问题&lt;a href=&quot;#文章的结构问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;问题出在连贯性（coherence）。连贯性不在句子质量，在于连接它们的逻辑。每句话都向读者许下一个承诺——下一句会做什么。如果下一句违背了它——跳话题、无桥接扔进新概念、回答一个读者没在问的问题——读者就会丢掉线索。哪怕每句话在技术上都正确。&lt;/p&gt;&lt;p&gt;大多数作者只在句子层面管理这件事。平克说，好的写作要同时在句子、段落、全篇三个层面管理读者预期。&lt;/p&gt;&lt;/section&gt;&lt;section&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;classic style&lt;/strong&gt;（古典风格）的写法。&lt;/p&gt;&lt;p&gt;前提极简：作者看到了某种真实之物，读者尚未看到。作者的职责是精确组织文字，让读者看见的，正是作者所见。&lt;/p&gt;&lt;p&gt;不闪烁其词。不清嗓子铺垫。不表演专业。不设防护性限定语。只有一条直线——从作者之所见，通往读者之所解。&lt;/p&gt;&lt;p&gt;平克说，大多数学术、企业和专业写作之所以失败，正是因为采取了相反的姿态：发送知识的信号，而非传递知识本身；表演复杂性，而非厘清复杂性。古典风格假定读者是有智识的成年人。几乎所有其他风格，都低估了他们。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;大脑怎样处理你的句子&lt;a href=&quot;#大脑怎样处理你的句子&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;/p&gt;&lt;p&gt;&lt;strong&gt;平克的术语：trees, not strings（树，而非线）。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;当一句话被写成”线”的模样——修饰语层层堆叠，没有清晰层级——大脑就得额外做工，去搭建作者本该替它搭好的树形结构。结果：技术上正确，认知上令人疲惫。&lt;/p&gt;&lt;p&gt;写出那棵树：主句先行。修饰语清楚附着于所修饰成分。从句摆在层级中本该在的位置。读者的回馈是——完全意识不到结构的存在。这才是最好的结构。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;写了就删掉的东西&lt;a href=&quot;#写了就删掉的东西&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;metadiscourse&lt;/strong&gt;（元话语）。句句在说”我将要说什么”，而不是直接说出来。&lt;/p&gt;&lt;p&gt;“本文旨在论证……&quot;&quot;值得注意的是……&quot;&quot;确立了 X 后，我们转向 Y。“这些句子看上去无害，甚至是”专业”的标志。但每一句都是作者在谈论写作本身，而非真正去写。&lt;/p&gt;&lt;p&gt;读者不需要被告知接下来有什么。他们需要的是内容直接抵达。元话语在作者本该拉近距离的关头制造了距离。删掉每一句描述写作的句子，代之以它原本要描述的东西。这是最简单、见效最快的一刀。&lt;/p&gt;&lt;/section&gt;&lt;section&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;平克给名词化（nominalization）起的名字精准之极——&lt;strong&gt;zombie nouns&lt;/strong&gt;（僵尸名词）。一个被杀死后又以名词之身复活的动词。&lt;/p&gt;&lt;p&gt;“调查”变成”展开调查”。“决定”变成”做出决定”。“失败”变成”经历失败”。每一次名词化都在增加字数、移除行动者，并榨干句子的生命力。&lt;/p&gt;&lt;p&gt;动词是行动之所在。你把动词变成名词的那一刻，就不得不发明一个新动词来扛起句子——而那个新动词，几乎总比原动词更弱。找到僵尸名词，还原动词，句子当即苏醒。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;大脑替你验证了两条古老法则&lt;a href=&quot;#大脑替你验证了两条古老法则&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;出了愤怒。镜像神经元（mirror neurons）被激活，体验被部分共享。&lt;/p&gt;&lt;p&gt;模拟，就是其机制。大脑不只是在理解场景，它在”运行”场景。告知产出理解，展示产出体验。这就是为什么那些历经数百年不朽的作者，几乎都是信任意象甚于标签的人——他们让读者感受到了那件事，而非仅仅被告知。&lt;/p&gt;&lt;/section&gt;&lt;section&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;斯特伦克和怀特（Strunk and White）最著名的规则。平克的贡献不是发明它，是解释了它为什么对。&lt;/p&gt;&lt;p&gt;读者处理的每个词都携带成本。工作记忆（working memory）必须在句子后半段抵达时，依然保持前半段活跃。句子越长，负荷越高。不承载意义的词增加认知负荷（cognitive load），却不增加理解。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;简洁不是审美偏好，是礼节。&lt;/strong&gt; 每个多余的词，都是对读者注意力征收的小额税。收多了，读者就不再关注——甚至说不清是为什么。平克倾其职业生涯研究大脑如何阅读，结论和斯特伦克与怀特一致：最干净的句子，几乎总是最有力量的那一句。&lt;/p&gt;&lt;hr /&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;p&gt;你无法靠”更努力”进入读者的头脑。你抵达那里的方式，是理解大脑究竟如何运作。那份理解，只隔着一本书的距离。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>创业第一年到底该干什么？YC 合伙人用 15 条生存法则讲透了</title><link>https://blog.moewah.com/posts/yc-startup-first-year-survival-rules/</link><guid isPermaLink="true">https://blog.moewah.com/posts/yc-startup-first-year-survival-rules/</guid><description>Tom Blomfield 在 X 上分享了 YC 沉淀十几年的 15 条创业生存法则。从产品、用户、执行到心态，帮你回答创业第一年到底该干什么、不该干什么。从 0 到 2200 个付费用户，靠的不是某一条法则，是把 15 条都做了。</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;一年，从 0 到 2200 个付费用户。没有融资新闻，没有媒体报道，就是严格遵循了 @ycombinator 的 15 条法则。&lt;/p&gt;
&lt;p&gt;这 15 条出自 Tom Blomfield 在 X 上的分享——YC 合伙人，Monzo 和 GoCardless 的联合创始人。他的履历本身就够硬：一个把公司从 0 做到 1400 万客户的人，回过头来告诉你第一年该怎么存活下去。&lt;/p&gt;
&lt;p&gt;翻看这 15 条，你能闻到两种味道。一种是 Paul Graham （保罗·格雷厄姆）的：法则 「做不规模化的事」和 「默认存活」，直接脱胎于 PG 2013 年和 2015 年的两篇经典文章。另一种是 YC 十几年投了几千家创业公司后沉淀下来的共识——不是某个天才的灵光一现，是一遍遍看到同类死法之后总结出来的生存手册。&lt;/p&gt;
&lt;p&gt;这篇文章写给早期创业者。准确地说，是写给还在找前 100 个付费用户、每天不确定自己在做产品还是在瞎忙的人。15 条法则帮你回答一个问题：第一年，到底该干什么、不该干什么。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&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; 创业初期，前 10 个客户，一个一个亲手去拉。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;现在就上线，别等「准备好了」。&lt;/strong&gt; 但搞清楚「用原型获取反馈」和「发布一个半成品给市场」的区别——前者告诉你该做什么，后者只会烧光你的信誉。一个平庸的产品丢给真实用户，一周学到的东西比闭门打磨半年还多；但在那之前，先弄清楚它是原型还是产品。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;永远找 90/10 方案。&lt;/strong&gt; 几乎每项功能，都有花 10% 的力就能拿到 90% 价值的做法。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;做得更少，做得更好。&lt;/strong&gt; 只盯一两个指标，用它们衡量每一件事。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;/p&gt;&lt;p&gt;&lt;strong&gt;每天都跟用户聊——但相信他们做的，而不是说的。&lt;/strong&gt; 路线图不在用户的答案里，在他们的行为里。嘴上说的和实际做的，永远是两回事。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;你挑客户，客户也挑你。&lt;/strong&gt; 10 个爱死你的用户，胜过 1000 个觉得你还行的。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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; 其他——行业会议、媒体采访、VC 咖啡、企业拓展电话——都是虚假忙碌。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;清楚自己是否「默认存活」。&lt;/strong&gt; 保罗·格雷厄姆的问题：以当前的增速和烧钱速度，你能在钱烧完前实现盈利吗？&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第一年唯一的护城河是 momentum（势头）。&lt;/strong&gt; 每周都发版，哪怕只改了一丁点。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;每一个伟大的公司都曾是一团糟。&lt;/strong&gt; 这游戏比的不是谁不着火，是谁灭火快——以及你多快能堵住着火的源头。一场本可以预防的火灾，不是勋章。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;/p&gt;&lt;p&gt;&lt;strong&gt;痛到受不了再招人。&lt;/strong&gt; 人员编制不是进度条，是正在消耗的血条。每一个伟大的创业公司，都曾小得可怜，而且可怜了很久很久。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;别管竞品——起码在第一年。&lt;/strong&gt; 创业公司死于自杀，不是他杀。但这句话有保质期：等你大到值得被抄袭那天，你赖以为生的平台完全可以杀人灭口，把你的整个业务吸进他们的产品里。知道什么时候该抬头看看。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;创业公司很少死于没钱。&lt;/strong&gt; 它们死于做错了东西、烧钱太快、或者合伙人翻脸——哪种死法都很常见。对联合创始人保持不留情面的坦诚不会解决所有问题，但这是你买过最便宜的保险。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;15 条读下来，你会发现一个有意思的事：没有一条在谈「融资技巧」「增长黑客」「赛道选择」。全在讲最基础的东西——跟用户聊天、别瞎招人、先收钱再谈别的。&lt;/p&gt;&lt;p&gt;这些事不难理解。难的是每天都被各种「更重要的事」挤到角落，然后一年过去了，你什么都没做到。&lt;/p&gt;&lt;p&gt;从 0 到 2200，不是靠某一条法则赢的。是把 15 条都做了，然后做了一整年。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>纳瓦尔的人生智慧：关于财富、幸福与自由的 18 条原则</title><link>https://blog.moewah.com/posts/naval-life-wisdom/</link><guid isPermaLink="true">https://blog.moewah.com/posts/naval-life-wisdom/</guid><description>硅谷投资人纳瓦尔·拉维坎特的人生洞见浓缩：从财富创造、幸福修炼到心智模型，18 条可执行原则帮你在长期主义中找到自由。</description><pubDate>Sun, 07 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;纳瓦尔·拉维坎特是 AngelList 的创始人，也是硅谷最早那批天使投资人之一，投过推特和优步。后来大家发现，他随口聊的那些关于金钱、快乐和怎么活的想法，比他的投资清单传得更广。这几年他的语录被翻成各种语言，在推特上被反复引用。我挑了他被提及最多的 18 条，按四个主题重新整理了一下。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&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;1. 财富不是金钱，而是睡觉时也能增值的资产&lt;/strong&gt; 金钱是转移财富的时间符号，而真正的财富是股权、知识产权、自动化系统等在你休息时依然产生价值的资产。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. 追求特定知识&lt;/strong&gt; 特定知识不是学校能教的东西，它源于你天生的好奇心和独特经历，往往藏在你热爱的“怪癖”中。只有将独到知识与杠杆结合，才能创造可规模化价值。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. 杠杆是关键&lt;/strong&gt; 现代最大的杠杆是代码和媒体——边际成本几乎为零。普通人可以通过创建软件、创作内容放大影响力。其他杠杆还包括资本和劳动力，但前两者门槛最低。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. 产品化你自己&lt;/strong&gt; 把自己变成一个可规模化、可重复销售的产品。将你的独特技能与杠杆结合，打造持续创造价值的系统。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5. 判断力最终获胜&lt;/strong&gt; 比努力更稀缺的是判断力——在长期看来正确的方向上下注。长期来看，判断力会复利，而单纯出卖时间无法积累财富。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6. 与长期主义者玩长期游戏&lt;/strong&gt; 逃避竞争的真正方法是保持真实。当你做自己热爱且擅长的事，竞争自然消失。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;1. 幸福是一种技能，不是目的地&lt;/strong&gt; 幸福源于内心平和，是对现状的深度接受。它可以通过练习获得，而非等待某个外在条件达成。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. 欲望是痛苦的根源&lt;/strong&gt; 纳瓦尔最核心的洞见是：“欲望是你与自己签订的、让自己不快乐的契约。”每一次欲望都意味着“得不到就不快乐”。减少欲望，幸福感自然浮现。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. 真正的幸福接近于平静&lt;/strong&gt; 当你不再持续地想要什么东西时，幸福就出现了。平静比兴奋更持久，是幸福更稳定的形态。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. 活在当下&lt;/strong&gt; 焦虑来自对未来的过度规划，悔恨来自对过去的执着。学会接受现实，切断对过去的执着和对未来的焦虑。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5. 身心健康是基础&lt;/strong&gt; 最好的投资是投资在自己身上——身体和大脑。实践方法包括：冥想（观察念头而非认同）、规律运动、充足睡眠、健康饮食、减少社交媒体和新闻摄入。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;1. 阅读是与伟大思想的对话&lt;/strong&gt; 读经典，读基础学科——数学、物理、哲学、生物学、历史。这些学科提供心智建模的核心素材。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. 建立心智模型网络&lt;/strong&gt; 不要死记硬背，目标是构建一个能将现实映射其中的心智模型体系。理解事物运作的底层逻辑，而非记住孤立的事实。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. 复利适用于一切&lt;/strong&gt; 知识、人际关系、技能、财富——所有重要领域都遵循复利规律。每天进步1%，一年后你会强大37倍。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. 少数关键选择决定一切&lt;/strong&gt; 少做事，但做正确的事。极度专注比努力工作更重要。拒绝大多数事务，才能为关键事务留出空间。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;1. 诚实是最高效的长期策略&lt;/strong&gt; 对别人诚实，更重要的是对自己诚实。诚实降低认知负荷，避免编织谎言网络的代价。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. 用长期视角做所有重要决定&lt;/strong&gt; 问自己：“十年后我会怎么看这个决定？”这个简单的问题能过滤掉绝大多数短期诱惑。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. 健康是1，其余都是0&lt;/strong&gt; 没有健康，财富、成就毫无意义。把身体和心智的维护置于优先于财富追求的位置。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. 关系决定人生质量&lt;/strong&gt; 与积极、聪明、让你变得更好的人共处。果断远离消耗你能量的人。环境塑造认知和行为。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5. 最终目标是自由&lt;/strong&gt; 不是富有，而是时间自由、地点自由、金钱自由，以及最重要的——&lt;strong&gt;心灵自由&lt;/strong&gt;。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;纳瓦尔的智慧并非鸡汤，而是他通过创业、投资、阅读、冥想数十年后提炼出的可执行原则。真正的价值不在于知道，而在于实践——将这套系统性思维嵌入日常生活，在财富创造与内在修炼之间建立正向循环。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>AI搜索吃掉一半流量？2026 你必须调整的内容推广方法</title><link>https://blog.moewah.com/posts/content-promotion-2026-geo/</link><guid isPermaLink="true">https://blog.moewah.com/posts/content-promotion-2026-geo/</guid><description>2026年AI搜索覆盖48%查询，传统社群转发式推广失效。梳理五个按意图优先级排列的分发渠道——GEO优化、Reddit投放、战略合作、员工倡导、直接外联——附带推广时间线和内容再创作框架。</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;上周收到前公司同事私信，长话短说就是：写了半年，SEO 做了，每篇也认真，流量还是几百。&lt;/p&gt;
&lt;p&gt;我问怎么推的。回答只有七个字：发 Twitter、发群、等。&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;strong&gt;大多数人都在用同一套方法，然后困惑为什么没效果。 不是不努力，是方向完全错了。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;2026 年的内容推广，从底层逻辑就该换。以下是我重新整理的一套框架。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&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;/p&gt;&lt;section&gt;&lt;h3&gt;1. AI 搜索与生成式引擎优化（GEO）&lt;a href=&quot;#1-ai-搜索与生成式引擎优化geo&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这是 2026 年最大的变量。&lt;/p&gt;&lt;p&gt;Google 的 AI Overviews 如今覆盖了约 48% 的查询——超过 20 亿月活用户。ChatGPT、Perplexity、Gemini 也在变成独立的内容发现入口。越来越多的搜索直接在 AI 生成的答案里结束，用户根本没进你网站。如果你的内容没有被 AI 引用，就等于从搜索生态里隐了形。&lt;/p&gt;&lt;p&gt;2026 年 5 月，Google 宣布了 AI Overviews 的五项更新：回复中直接标注来源链接、新增「专家建议」板块专门引用 Reddit 和论坛上的一手经验内容、按发布者筛选来源、高亮订阅媒体的链接、底部推荐深度阅读文章。规则比以前清晰太多了。&lt;/p&gt;&lt;p&gt;而这带来了一个关键变化：你不需要排到第一页才能被 AI 引用。Advanced Web Ranking 的研究显示，46.5% 被 AI Overviews 引用的 URL 排名在 Top 50 以外。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;怎么让自己的内容被 AI 引用？几个实际有效的动作：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;内容发布 3 个月内是黄金窗口：这期间发布的内容被引用概率高 3 倍&lt;/li&gt;
&lt;li&gt;使用 Q&amp;amp;A 结构化内容（FAQ 格式）：虽然 Google 在 2026 年 5 月已弃用 FAQ 富媒体搜索结果，但 Q&amp;amp;A 格式的内容本身仍极容易被 AI 提取和引用——LLM 不依赖 Schema 标记，它靠的是干净、可解析的问答结构&lt;/li&gt;
&lt;li&gt;页面加载速度直接影响被引概率：FCP &amp;lt; 0.4 秒的页面平均被引 6.7 次，FCP &amp;gt; 1.13 秒的只有 2.1 次&lt;/li&gt;
&lt;li&gt;用原生 HTML 语义标签（&lt;code&gt;&amp;lt;ol&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt;）标记结构化内容——CSS 模拟的列表样式，AI 识别不了&lt;/li&gt;
&lt;li&gt;在文章里设置 40-60 词的直接回答块，就是那种可以直接被拎出来当答案的段落&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;还有一点容易被忽略：YouTube 如今出现在 16% 的 LLM 回答中，是所有社交平台里被 AI 引用最多的内容格式，引用量约是 Reddit 的 1.6 倍。如果你只在文字内容上使劲，相当于放弃了一个巨大的引用入口。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 社区投放——Reddit 不是「社区渠道」了&lt;a href=&quot;#2-社区投放reddit-不是社区渠道了&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Reddit 现在是所有主流 AI 平台中引用排名第一的域名，也是 Google「专家建议」板块的直接内容来源。你在 Reddit 上的发言，可能同时影响三类可见度：社区曝光、AI 引用、Google 搜索排名。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;策略怎么调：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;9:1 法则没变：9 次真诚参与，1 次内容引用。&lt;strong&gt;先当社区成员，再当内容创作者。&lt;/strong&gt; Reddit 用户识别营销内容的能力比你想象的强。&lt;/li&gt;
&lt;li&gt;先花 2-3 周建立声誉再分享——没有 karma （Reddit 的积分系统）积累的账号发链接，基本等于自爆&lt;/li&gt;
&lt;li&gt;回答问题时先给价值，链接作为补充资源&lt;/li&gt;
&lt;li&gt;不限于 Reddit：Slack 社区、Discord 群组、行业论坛，同样适用&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;值得留意的一点：LinkedIn 上 59% 的 AI 引用来自个人创作者而非公司主页。做 B2B 的话，创始人/员工的个人品牌建设比公司主页运营更值得投入。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;合作的核心不是「求人转发」，而是互惠的利益交换。&lt;/p&gt;&lt;p&gt;三种合作类型：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;内容协作：和互补品牌联合创作，双方各自分发给自己的受众。78% 的营销人员计划增加合作支出&lt;/li&gt;
&lt;li&gt;Newsletter 收录：付费推荐网络（如 beehiiv）和交换推荐，比单纯「争取被收录」更可持续&lt;/li&gt;
&lt;li&gt;Webinar/播客合作：参与对方平台的节目，触达精准受众&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;关键动作：提前准备素材包——社交文案、图片、邮件模板、可引用金句全部提前做好，对方拿到就能直接用。降低协作门槛是合作成功的前提。&lt;/p&gt;&lt;/section&gt;&lt;section&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;一个扎心的对比：员工个人帖子的展示量是公司主页的 8-30 倍。LinkedIn 的算法天然偏好个人创作者——来自真实个人的内容，其传播效率远超品牌官方账号。&lt;/p&gt;&lt;p&gt;特别做 B2B 和外贸独立站的团队：让创始人、核心员工在 LinkedIn 和 X/Twitter 上建立个人品牌，分享行业洞察、项目经验、踩坑记录。这不是「要求员工转发」，而是激活他们作为独立个体的声音。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. 直接外联&lt;a href=&quot;#5-直接外联&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;质量远大于数量。联系三种人：你文章里提到的人（天然的外联理由）、互补内容创作者、行业策展人（Newsletter 编辑、资源页维护者、社区管理员）。&lt;/p&gt;&lt;p&gt;模板逻辑很简单：上下文 + 具体引用 + 无压力。「我读了你的 XXX，启发我做了 YYY，没有别的要求，就是觉得你可能感兴趣」——比「大佬求转发」有效一百倍。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;70% 生命周期参与度发生在发布后 72 小时内&lt;/strong&gt; 。窗口很紧，节奏要对。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;发布前 1 周&lt;/strong&gt; ：通知被提及的专家、准备合作方素材、识别目标社区、准备各平台适配版本。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;发布日&lt;/strong&gt; ：SEO 和 GEO 优化到位、发邮件给订阅者、社交分发与合作方同步、确保页面技术指标正常。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第 1-2 周&lt;/strong&gt; ：参与社区讨论自然引用、联系策展人、监控数据表现。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第 3-4 周&lt;/strong&gt; ：内容再创作分发、长尾推广。每季度回顾一次——内容衰退是缓慢但持续的，优质博客文章如果长期不更新，每月可能损失 10-30% 的流量。旧内容刷新是性价比最高的 SEO 动作之一。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;94% 的营销人员已经在做内容再创作了。问题不在于做不做，而在于做得是否渠道原生——每个平台的输出不是简单格式转换，而是针对该平台体验重新设计：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;LinkedIn Carousel：重新设计为 10 页滑动体验，每页一个论点，不是把博客截成 10 张图&lt;/li&gt;
&lt;li&gt;邮件摘要：300 字以内，提炼一个核心观点&lt;/li&gt;
&lt;li&gt;YouTube 视频：10-12 分钟深度讲解&lt;/li&gt;
&lt;li&gt;Twitter/X Thread：提取关键框架，配合视觉总结&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;一篇文章至少产出 5-7 个不同格式的分发版本。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;AI 引用追踪&lt;/td&gt;&lt;td&gt;你的内容在 ChatGPT、Perplexity、Google AI Overviews 中被引用了几次？&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;综合衡量在传统搜索 + AI 平台 + Discover 中的整体可见度&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;li&gt;把 AI 搜索当成传统 SEO 来做：AI 不关心你的 DA 有多高。它关心你的内容能不能被干净地提取、准确地归因、可信地呈现——这叫「引用价值」，不是排名&lt;/li&gt;
&lt;li&gt;跳过自有渠道：正确的顺序是自有（邮件列表、网站）→ 赚得（外链、社区）→ 付费（放大已验证的内容），跳过前两步直接买量是白烧钱&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;/p&gt;&lt;p&gt;写完一篇文章只完成了 30%。剩下的 70%，是让它被该看到的人看到。&lt;/p&gt;&lt;p&gt;创建一次，策略分发，持续放大。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>有了 tmux 还需要 herdr 吗？一个给 AI Agent 用的「终端管家」</title><link>https://blog.moewah.com/posts/herdr-agent-multiplexer-review/</link><guid isPermaLink="true">https://blog.moewah.com/posts/herdr-agent-multiplexer-review/</guid><description>herdr 是一个终端原生的 Agent 多路复用器，专为同时运行多个 AI Agent 的开发者设计。它解决了 Agent 管理混乱、会话丢失、远程协作等痛点，不替换终端、不依赖 Electron。本文从实际使用体验出发，带你了解它的核心功能和上手方法。</description><pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我同时跑了三个 Claude Code、两个 Codex，外加一个本地构建进程。六个终端 Tab，像六只没拴绳的狗——哪个卡住了？哪个跑完了？哪个在等你回复？&lt;/p&gt;
&lt;p&gt;切来切去，纯靠猜。&lt;/p&gt;
&lt;p&gt;tmux 帮我分了窗格，但它不知道里面跑的是 Agent 还是普通 shell。&lt;strong&gt;它不感知 Agent 状态&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这就是 herdr 存在的理由。&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;写这篇文章时 herdr v0.6.8，GitHub 4200+ Star。项目地址：&lt;a href=&quot;https://github.com/ogulcancelik/herdr&quot; target=&quot;_blank&quot;&gt;https://github.com/ogulcancelik/herdr&lt;/a&gt; 作者 Can Celik 用 AI Agent 辅助从零写完整个 Rust 项目——工具本身就是 Agent 协作的产物。）&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;herdr，它是什么？&lt;a href=&quot;#herdr它是什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://herdr.dev/&quot; target=&quot;_blank&quot;&gt;herdr&lt;/a&gt; 是一个&lt;strong&gt;终端原生的 Agent 多路复用器&lt;/strong&gt;。Rust 写成，单二进制文件，跑在你现有的终端里——不替换终端，不绑架你的工作流。&lt;/p&gt;&lt;p&gt;它做的事说白了就一件：&lt;strong&gt;让你在终端里同时管理多个 AI Agent，一眼看清谁在工作、谁卡住了、谁在等你&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;&lt;img loading=&quot;lazy&quot; width=&quot;1898&quot; height=&quot;1112&quot; src=&quot;/_astro/Herdr.ChX9LS4D_Z1P9Au2.webp&quot; srcset=&quot;/_astro/Herdr.ChX9LS4D_pNfA6.webp 640w, /_astro/Herdr.ChX9LS4D_1a3IrR.webp 750w, /_astro/Herdr.ChX9LS4D_ZptW3q.webp 828w, /_astro/Herdr.ChX9LS4D_2t68Ci.webp 1080w, /_astro/Herdr.ChX9LS4D_Z29uNDE.webp 1280w, /_astro/Herdr.ChX9LS4D_1vtkjo.webp 1668w, /_astro/Herdr.ChX9LS4D_Z1P9Au2.webp 1898w&quot; /&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;/p&gt;&lt;p&gt;AI Agent 的编码会话动辄几十分钟。SSH 断了、终端关了、临时走开——回来状态全丢。&lt;/p&gt;&lt;p&gt;herdr 支持 tmux 式的 detach/reattach。&lt;code&gt;prefix + q&lt;/code&gt; 离开，Agent 在后台继续跑。回来后 &lt;code&gt;herdr --session my-project&lt;/code&gt; 重新连上，状态完整保留。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;痛点二：同时管理多个 Agent 混乱&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;侧边栏（&lt;code&gt;prefix + b&lt;/code&gt; 打开）实时显示每个 Agent 的状态：&lt;/p&gt;&lt;p&gt;🟢 idle 空闲　🟡 working 工作中　🔵 done 完成　🔴 blocked 阻塞&lt;/p&gt;&lt;p&gt;自动检测十几种 Agent 类型，零配置。Workspace 级别还会聚合显示：只要有一个 Agent blocked，整个 Workspace 标红。不用靠脑子记”左边第三个在跑啥”。&lt;/p&gt;&lt;p&gt;&lt;img loading=&quot;lazy&quot; width=&quot;2312&quot; height=&quot;932&quot; src=&quot;/_astro/keep-the-herd-in-sight.DZh1yqzI_1pDLim.webp&quot; srcset=&quot;/_astro/keep-the-herd-in-sight.DZh1yqzI_1JWPYi.webp 640w, /_astro/keep-the-herd-in-sight.DZh1yqzI_ZvJoWN.webp 750w, /_astro/keep-the-herd-in-sight.DZh1yqzI_2cbCfs.webp 828w, /_astro/keep-the-herd-in-sight.DZh1yqzI_kYD8c.webp 1080w, /_astro/keep-the-herd-in-sight.DZh1yqzI_ZgmMuj.webp 1280w, /_astro/keep-the-herd-in-sight.DZh1yqzI_ZYGVi9.webp 1668w, /_astro/keep-the-herd-in-sight.DZh1yqzI_Z1hA1HO.webp 2048w, /_astro/keep-the-herd-in-sight.DZh1yqzI_1pDLim.webp 2312w&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;痛点三：Agent 分散在不同窗口/工具里，来回切换摩擦大&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;很多 Agent 管理器是独立桌面 App（Electron 打包），等于为了管 Agent 离开终端。herdr 跑在现有终端里——iTerm2、Ghostty、Warp 都行——继承你的 shell、字体、快捷键，&lt;strong&gt;只多了多路复用能力&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;痛点四：Agent 之间协作靠手动 copy-paste&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;不同 Agent 的输出要手动搬运。herdr 的 Socket API + CLI 让 Agent 可以编程式协作——读其他 pane 的输出、发文本和按键、等某个 Agent 跑完再触发下一步。多 Agent 编排不再靠人工中转。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;痛点五：远程开发场景缺乏轻量方案&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;本地跑 Agent 吃资源，远程服务器上跑又缺管理工具。herdr 支持 SSH 内运行、远程 attach，单二进制零依赖，不依赖重型 GUI dashboard。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;tmux 用户：操作习惯几乎平移&lt;a href=&quot;#tmux-用户操作习惯几乎平移&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果你用了多年 tmux，herdr 的上手成本极低：&lt;/p&gt;
































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;你 tmux 里常做的事&lt;/th&gt;&lt;th&gt;herdr 里怎么做&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;水平分 pane&lt;/td&gt;&lt;td&gt;&lt;code&gt;prefix + v&lt;/code&gt;（同 tmux）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;垂直分 pane&lt;/td&gt;&lt;td&gt;&lt;code&gt;prefix + -&lt;/code&gt;（同 tmux）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;切 pane&lt;/td&gt;&lt;td&gt;&lt;code&gt;prefix + h/j/k/l&lt;/code&gt;（同 tmux）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;detach&lt;/td&gt;&lt;td&gt;&lt;code&gt;prefix + q&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;copy mode&lt;/td&gt;&lt;td&gt;&lt;code&gt;prefix + [&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;搜索历史&lt;/td&gt;&lt;td&gt;复制模式下按 &lt;code&gt;/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;不是说完全一模一样，但&lt;strong&gt;肌肉记忆能直接迁移&lt;/strong&gt;。它比 tmux 多出来的是：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;鼠标原生支持&lt;/strong&gt;：点击切焦点、拖选即复制、拖拽边框分 pane（macOS 用户会爱死这点）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent 侧边栏&lt;/strong&gt;：tmux 做不到的状态感知&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workspace 层级&lt;/strong&gt;：比 tmux 的 session/window/pane 更直觉——Workspace = 项目，Tab = 分组，Pane = 终端&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;唯一要注意：herdr server 和 tmux server 是两个独立进程，互不感知。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;新手用户：30 秒快速上手&lt;a href=&quot;#新手用户30-秒快速上手&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;安装：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 使用一键脚本安装&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-fsSL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://herdr.dev/install.sh&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 或通过 brew 安装&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;brew&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;herdr&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后 &lt;code&gt;cd&lt;/code&gt; 到项目目录，敲：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;herdr&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;够了。&lt;/p&gt;&lt;p&gt;记好下面这五个快捷键就能正常干活啦：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;code&gt;prefix + b&lt;/code&gt; → 打开 Agent 状态栏（最重要的一个）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prefix + v&lt;/code&gt; → 左右分屏&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prefix + q&lt;/code&gt; → 离开（Agent 继续跑）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prefix + z&lt;/code&gt; → 当前 pane 全屏&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prefix + w&lt;/code&gt; → 切换项目 Workspace&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;默认 prefix 是 &lt;code&gt;Ctrl+b&lt;/code&gt;（和 tmux 一致），觉得不顺手的小伙伴可以在 &lt;code&gt;~/.config/herdr/config.toml&lt;/code&gt; 里改成 &lt;code&gt;Ctrl+a&lt;/code&gt;。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;多 Agent 协作：Socket API&lt;a href=&quot;#多-agent-协作socket-api&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;前面说的都是人用 herdr 管理 Agent。反过来，&lt;strong&gt;Agent 也能用 herdr 管理 Agent&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;herdr 暴露了一套 Socket API + CLI 命令，Agent 可以编程式地：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;创建 workspace、拆分 pane、启动其他 Agent&lt;/li&gt;
&lt;li&gt;读取任意 pane 的输出内容&lt;/li&gt;
&lt;li&gt;向其他 pane 发送文本和按键&lt;/li&gt;
&lt;li&gt;阻塞等待某个 Agent 进入 idle 状态&lt;/li&gt;
&lt;li&gt;订阅实时事件&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;举个例子：一个协调 Agent 先 &lt;code&gt;herdr agent start claude -- &quot;写后端 API&quot;&lt;/code&gt;，再 &lt;code&gt;herdr agent start codex -- &quot;写前端页面&quot;&lt;/code&gt;，然后用 &lt;code&gt;herdr agent wait claude --status idle&lt;/code&gt; 等它跑完，最后 &lt;code&gt;herdr agent read claude&lt;/code&gt; 读输出，把结果传给下一个步骤。&lt;/p&gt;&lt;p&gt;多 Agent 编排不再靠手动复制粘贴了。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;和竞品比，它卡在什么位置&lt;a href=&quot;#和竞品比它卡在什么位置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;







































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;工具&lt;/th&gt;&lt;th&gt;一句话&lt;/th&gt;&lt;th&gt;换终端？&lt;/th&gt;&lt;th&gt;Agent 感知&lt;/th&gt;&lt;th&gt;SSH&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;herdr&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;终端内的 Agent 管家&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;tmux / Zellij&lt;/strong&gt;&lt;/td&gt;&lt;td&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;cmux&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;macOS 原生终端 App&lt;/td&gt;&lt;td&gt;要换&lt;/td&gt;&lt;td&gt;✅ badge 通知&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;muxy&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;终端版 IDE&lt;/td&gt;&lt;td&gt;要换&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;herdr 的独特位置：&lt;strong&gt;唯一一个不让你换终端、又有 Agent 状态感知、又能 SSH detach 的选项&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;它不是要取代 tmux——如果你只用 tmux 做窗口管理，没有多 Agent 需求，tmux 够了。但如果你同时在跑多个 AI Agent，herdr 是 tmux 的天然补充。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;strong&gt;鼠标拖选即复制&lt;/strong&gt;。tmux 的 copy mode 我练了好几年才肌肉记忆，herdr 拖一下完事&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;prefix + q&lt;/code&gt; 走人零负担&lt;/strong&gt;。Agent 后台继续跑，回来 &lt;code&gt;herdr --session&lt;/code&gt; 接上，像没离开过。远程服务器上尤其实用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;侧边栏点一下直达 pane&lt;/strong&gt;。不用记编号，鼠标点 Agent 名直接跳过去——对新手和老手一样友好&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更新后 server 不自动重启&lt;/strong&gt;得手动 &lt;code&gt;herdr server stop&lt;/code&gt; 再开，部分 Agent 的 blocked 状态判断还不够准——v0.6 阶段的小毛病&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;一句话：&lt;strong&gt;tmux 是窗口管理器，herdr 是 Agent 调度中心&lt;/strong&gt;。两个工具解决不同时代的问题。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;同时跑多个 Agent 的开发者（尤其是 tmux 用户）&lt;/li&gt;
&lt;li&gt;远程服务器上跑 Agent、需要 detach 的场景&lt;/li&gt;
&lt;li&gt;不想为 Agent 管理换终端的用户&lt;/li&gt;
&lt;li&gt;需要 Agent 间协作编排的重度用户&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;不适合的人&lt;/strong&gt;：你只开一个终端、偶尔跑跑 &lt;code&gt;claude&lt;/code&gt; 命令——那 herdr 对你来说 overkill 了，终端本身够用。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;终端被 AI Agent 重新定义了一遍。以前终端是你的手脚——敲命令、看日志。现在终端是你的调度中心——管理一群 Agent 同时干活。&lt;/p&gt;&lt;p&gt;herdr 做的事不复杂：&lt;strong&gt;让终端在多 Agent 时代继续好用&lt;/strong&gt;。没有 Electron，没有付费墙，一个 &lt;code&gt;brew install&lt;/code&gt; 就开干。&lt;/p&gt;&lt;p&gt;对我来说，它已经从「试试看」变成了每天打开终端的第一个命令——&lt;code&gt;herdr&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Claude Code 的 CLAUDE.md 怎么写？这 12 条规则，管住 AI Agent 的静默失败</title><link>https://blog.moewah.com/posts/claude-code-claude-md-12-rules/</link><guid isPermaLink="true">https://blog.moewah.com/posts/claude-code-claude-md-12-rules/</guid><description>12 条 CLAUDE.md 规则完整指南，涵盖代码生成和 Agent 模式两个阶段。每条规则附带英文原文、中文解释和真实翻车场景。文末提供完整模板可直接复制。</description><pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;用 Claude Code 写过项目的人，大概率踩过这些坑：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;迭代了三轮，第四轮 Claude 把第二轮修好的 bug 又写回来了——它忘了自己做过什么&lt;/li&gt;
&lt;li&gt;让它加个新功能，它一口气重构了旁边三个文件：“顺手优化了一下”&lt;/li&gt;
&lt;li&gt;六步任务跑到第五步崩了，但它的回复是”完成”——前面第三步就错了，你没注意到&lt;/li&gt;
&lt;li&gt;12 个测试全绿上线挂掉，回头发现测试只验证”函数返回了值”，没验证”返回了正确的值”&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;但最折磨人的不是 bug 本身——是盯着 Claude 的 “Done ✓“，盯 diff 盯了三遍，不知道漏了什么。比报错更无力的，是这种”它说做完了，但我不确定”的焦虑。&lt;/p&gt;&lt;p&gt;这不是 prompt 的问题。Agent 模式下，Claude 替你做的隐性决策远比你想的要多——它做对了不会说，做错了更不会说。&lt;/p&gt;&lt;p&gt;下面的这些规则就是为了堵住这些口子。前 4 条管住最基础的代码生成，后 8 条管住 Agent 模式特有的自主行为——从决策边界到验证质量，每一条都附带它防止的真实翻车场景。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;12 条 CLAUDE.md 规则&lt;a href=&quot;#12-条-claudemd-规则&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Rule 1 — Think Before Coding&lt;a href=&quot;#rule-1--think-before-coding&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;State assumptions, ask if unsure, don’t guess. Point out simpler alternatives. Stop if stuck—say what’s unclear.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;不确定就问，别猜。有更简单的方案就直接指出来。卡住了就说哪里不清楚——别硬往下编。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Rule 2 — Simplicity First&lt;a href=&quot;#rule-2--simplicity-first&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Least code to solve the problem. No speculative code, no features beyond the requirement, no abstraction for single use. Self-test: would a senior engineer call this over-engineered? If yes, simplify.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;最少代码解决问题。不写投机功能，不为单次使用做抽象。写完问自己一句：高级工程师会说这是过度设计吗？是就简化。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Rule 3 — Surgical Changes&lt;a href=&quot;#rule-3--surgical-changes&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Touch only what must change. No drive-by “optimizations” of adjacent code, comments, or formatting. No refactoring things that aren’t broken. Match existing style.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;只碰必须改的。别顺手”优化”旁边的代码、注释、格式。别重构没坏的东西。别在别人的代码里夹带你的风格偏好。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Rule 4 — Goal-Driven Execution&lt;a href=&quot;#rule-4--goal-driven-execution&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Define success criteria, loop until verified. Don’t follow steps—define success and iterate.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;定义什么叫”做完”，循环到真的做完为止。别告诉它步骤，告诉它成功长什么样——它自己找路。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Rule 5 — Model for Judgment Only&lt;a href=&quot;#rule-5--model-for-judgment-only&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Use the model for classification, drafting, summarization, extraction. Don’t use it for routing, retries, deterministic transforms. If code can answer it, let code answer it.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;模型做分类、草拟、总结、提取。路由、重试、确定性转换不要交给模型——状态码能判断的事，让代码判断。一段 503 重试逻辑让 Claude 写 if-else，别让 Claude 替你决策要不要重试。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Rule 6 — Token Awareness&lt;a href=&quot;#rule-6--token-awareness&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Be aware of token budget. Summarize and restart when approaching limits (4k per task, 30k per session). If you exceed limits, report it—don’t silently exceed.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;注意 token 消耗。单任务 4000 token、单 session 3 万是硬上限——快到了就总结重开，别让它在一个越来越长的上下文里兜圈子。长 session 里 Claude 会慢慢忘掉自己试过什么，然后推荐第三轮已经被否决的方案。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Rule 7 — Surface Conflicts&lt;a href=&quot;#rule-7--surface-conflicts&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;When two patterns conflict, pick one (newer / more validated), explain why, flag the other for cleanup. Don’t blend contradictory approaches.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;一个项目里同时存在两种错误处理方式，Claude 的新代码两套都调了——错误被吞两次。两种模式冲突，选一边（更新的 / 更验证过的），说清楚为什么，标记另一边等清理。别折中，折中是最差的方案。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Rule 8 — Read Before Write&lt;a href=&quot;#rule-8--read-before-write&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Before adding code, read exports, callers, shared utilities. “Seems orthogonal” is dangerous. If you don’t know why something is organized this way, ask.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;加代码之前，先读 exports、调用方、共享工具。Claude 会在已有函数旁边加一个功能完全相同的——因为它没读那个文件。“看起来正交”是最危险的错觉。不知道为什么要这样组织，就问。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Rule 9 — Tests Verify Intent&lt;a href=&quot;#rule-9--tests-verify-intent&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Tests encode WHY this behavior matters, not just WHAT it does. If business logic changes but tests don’t fail, the tests are wrong.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;测试要验证的是”为什么这个行为重要”，而不是”代码做了什么”。auth 函数写了 12 个测试全绿，生产挂了——因为测的是返回值有没有，不是返回值对不对。业务逻辑变了但旧测试不报错，等于没有测试。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Rule 10 — Checkpoint Every Step&lt;a href=&quot;#rule-10--checkpoint-every-step&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Summarize what was done, what was verified, what remains. Don’t continue from a state you can’t describe. If you lose track, stop.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;每步做完总结三件事：做了什么、验证了什么、还剩什么。别从描述不出来的状态继续——六步重构到第四步错了，如果没 checkpoint，第五、六步跑完你才发现，解开比重做还费劲。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Rule 11 — Match Conventions&lt;a href=&quot;#rule-11--match-conventions&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Intra-codebase consistency &amp;gt; personal taste. If you genuinely think a convention is harmful, raise it—don’t silently fork.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;代码库内的一致性大于你的个人偏好。Claude 在 class-component 项目里引入 React hooks——hooks 没毛病，但炸了依赖 &lt;code&gt;componentDidMount&lt;/code&gt; 的测试体系。真想改约定，提出来，别默默分叉。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Rule 12 — Fail Loud&lt;a href=&quot;#rule-12--fail-loud&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;If something was skipped, “done” is wrong. If tests were skipped, “passing” is wrong. Default to exposing uncertainty, not hiding it.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;有东西被跳过，“完成”就是错的。有测试被跳过，“通过”就是错的。默认暴露不确定性，别藏。数据库迁移到一半遇到约束冲突，14% 记录被默默丢掉，日志写了但你不知道——因为 Claude 只汇报”迁移完成”。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;完整规则（直接复制进 CLAUDE.md）&lt;a href=&quot;#完整规则直接复制进-claudemd&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;CLAUDE.md&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;##&lt;/span&gt;&lt;span&gt; Coding Rules (12 Rules)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&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;Think Before Coding.&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;/span&gt;&lt;span&gt; State assumptions, ask if unsure, don&apos;t guess. Point out simpler alternatives. Stop if stuck—say what&apos;s unclear.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&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;Simplicity First.&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;/span&gt;&lt;span&gt; Least code to solve the problem. No speculative code, no features beyond the requirement, no abstraction for single use. Self-test: would a senior engineer call this over-engineered? If yes, simplify.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;3.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;**&lt;/span&gt;&lt;span&gt;Surgical Changes.&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;/span&gt;&lt;span&gt; Touch only what must change. No drive-by &quot;optimizations&quot; of adjacent code, comments, or formatting. No refactoring things that aren&apos;t broken. Match existing style.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&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;**&lt;/span&gt;&lt;span&gt;Goal-Driven Execution.&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;/span&gt;&lt;span&gt; Define success criteria, loop until verified. Don&apos;t follow steps—define success and iterate.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;5.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;**&lt;/span&gt;&lt;span&gt;Model for Judgment Only.&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;/span&gt;&lt;span&gt; Use the model for classification, drafting, summarization, extraction.Don&apos;t use it for routing, retries, deterministic transforms. If code can answer it, let code answer it.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&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;Token Awareness.&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;/span&gt;&lt;span&gt; Be aware of token budget. Summarize and restart when approaching limits (4k per task, 30k per session). If you exceed limits, report it—don&apos;t silently exceed.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;7.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;**&lt;/span&gt;&lt;span&gt;Surface Conflicts.&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;/span&gt;&lt;span&gt; When two patterns conflict, pick one (newer / more validated), explain why,flag the other for cleanup. Don&apos;t blend contradictory approaches.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&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;**&lt;/span&gt;&lt;span&gt;Read Before Write.&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;/span&gt;&lt;span&gt; Before adding code, read exports, callers, shared utilities. &quot;Seems orthogonal&quot; is dangerous. If you don&apos;t know why something is organized this way, ask.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;9.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;**&lt;/span&gt;&lt;span&gt;Tests Verify Intent.&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;/span&gt;&lt;span&gt; Tests encode WHY this behavior matters, not just WHAT it does. If business logic changes but tests don&apos;t fail, the tests are wrong.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&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;Checkpoint Every Step.&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;/span&gt;&lt;span&gt; Summarize what was done, what was verified, what remains. Don&apos;t continue from a state you can&apos;t describe. If you lose track, stop.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;11.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;**&lt;/span&gt;&lt;span&gt;Match Conventions.&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;/span&gt;&lt;span&gt; Intra-codebase consistency &amp;gt; personal taste. If you genuinely think a convention is harmful, raise it—don&apos;t silently fork.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;12.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;**&lt;/span&gt;&lt;span&gt;Fail Loud.&lt;/span&gt;&lt;span&gt;**&lt;/span&gt;&lt;/span&gt;&lt;span&gt; If something was skipped, &quot;done&quot; is wrong. If tests were skipped, &quot;passing&quot; is wrong. Default to exposing uncertainty, not hiding it.&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;CLAUDE.md 怎么用？&lt;a href=&quot;#claudemd-怎么用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;放仓库根目录，命名为 &lt;code&gt;CLAUDE.md&lt;/code&gt;（不是 &lt;code&gt;.claude.md&lt;/code&gt;，不是 &lt;code&gt;CLAUDE.txt&lt;/code&gt;）。先复制 12 条规则进去，末尾追加项目特定配置——技术栈、测试命令、已知的坑。总共别超过 200 行。&lt;/p&gt;&lt;p&gt;不用全抄。项目不跑多步 pipeline，规则 10 可以砍。lint 已经管住代码风格，规则 11 可以砍。留你真正踩过坑的那几条，比抄 12 条用不着的强。&lt;/p&gt;&lt;p&gt;每一行规则都应该能回答一个问题： &lt;strong&gt;它防止的是什么错误？&lt;/strong&gt; 答不上来，删掉。&lt;/p&gt;&lt;p&gt;好的 CLAUDE.md 不是给 Claude 的说明书，是给你自己的后悔药清单。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>你的 AI Agent 在替云厂商打工？73% 的 Token 消耗其实与你无关</title><link>https://blog.moewah.com/posts/ai-agent-token-tax-debate/</link><guid isPermaLink="true">https://blog.moewah.com/posts/ai-agent-token-tax-debate/</guid><description>Hermes Agent 社区因 Token 消耗过高爆发争议，73% 的 API 调用开销来自工具定义和系统提示。本文拆解 Token 税的构成与两派立场分歧，揭示 Coding Plan 退场后行业从补贴红利到精细化运营的转折。</description><pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;几条 GitHub Issue 把 Hermes Agent 推上了风口浪尖。&lt;/p&gt;
&lt;p&gt;Issue #4379 有用户贴了一份 Token 消耗监测报告。数据很具体：每次 API 调用固定开销约 13,900 个 Token，占总消耗的 73%。其中工具定义占 46.1%，系统提示占 27.2%，用户实际对话只占 26.7%。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; width=&quot;1640&quot; height=&quot;422&quot; src=&quot;/_astro/hermes-agent-Issue-4379.BTcq7BSz_2bA2Df.webp&quot; srcset=&quot;/_astro/hermes-agent-Issue-4379.BTcq7BSz_Z1KBrXO.webp 640w, /_astro/hermes-agent-Issue-4379.BTcq7BSz_2ikH6O.webp 750w, /_astro/hermes-agent-Issue-4379.BTcq7BSz_Z1khLGV.webp 828w, /_astro/hermes-agent-Issue-4379.BTcq7BSz_ZeKROV.webp 1080w, /_astro/hermes-agent-Issue-4379.BTcq7BSz_13XDn6.webp 1280w, /_astro/hermes-agent-Issue-4379.BTcq7BSz_2bA2Df.webp 1640w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;另一个 Issue #23419 的反馈更扎心。有创业公司的 Cron 任务因为没有预算上限，一天内悄无声息烧掉 20 美元 API 额度。团队直到账单出了才发现。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; width=&quot;1646&quot; height=&quot;438&quot; src=&quot;/_astro/hermes-agent-Issue-23419.BMoq2kOO_TJa3i.webp&quot; srcset=&quot;/_astro/hermes-agent-Issue-23419.BMoq2kOO_1Puy29.webp 640w, /_astro/hermes-agent-Issue-23419.BMoq2kOO_2k4iPE.webp 750w, /_astro/hermes-agent-Issue-23419.BMoq2kOO_1WSUSm.webp 828w, /_astro/hermes-agent-Issue-23419.BMoq2kOO_Z1JAz8c.webp 1080w, /_astro/hermes-agent-Issue-23419.BMoq2kOO_xYYLE.webp 1280w, /_astro/hermes-agent-Issue-23419.BMoq2kOO_TJa3i.webp 1646w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;诸如此类的抱怨声浪不断，社区把这事总结成一个词：&lt;strong&gt;沉默的成本累积&lt;/strong&gt; ——在账单爆炸前，你根本看不到。&lt;/p&gt;
&lt;section&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;Agent 的上下文消耗，大头集中在三个地方：MCP 服务、Skill 指令、Tool 定义。其中最吃 Token 的永远是 Tool schema。&lt;/p&gt;&lt;p&gt;&lt;img loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;714&quot; src=&quot;/_astro/agent-context-consumption.CqzMcoFj_upRvM.webp&quot; srcset=&quot;/_astro/agent-context-consumption.CqzMcoFj_QWcwn.webp 640w, /_astro/agent-context-consumption.CqzMcoFj_Z2sz7A9.webp 750w, /_astro/agent-context-consumption.CqzMcoFj_1Karfd.webp 828w, /_astro/agent-context-consumption.CqzMcoFj_ZrVEGz.webp 1080w, /_astro/agent-context-consumption.CqzMcoFj_upRvM.webp 1280w&quot; /&gt;&lt;/p&gt;&lt;p&gt;所谓 Tool schema，就是以 JSON Schema 格式描述每个工具的调用接口——名称、参数列表、类型约束、详细描述、返回值。这些信息会被直接嵌入 prompt，让模型判断”何时调用哪个工具、如何正确填充参数”。工具越多、描述越详细，token 就越夸张。而且即使只保留几个常用工具，schema 本身的 verbose 程度也十分可观——JSON Schema 的格式天然冗余，跟谁写的关系不大。&lt;/p&gt;&lt;p&gt;所以社区当前的共识是放弃”一股脑全塞”，转向按需动态加载。用到了再加载 schema，用完释放。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;Hermes 团队的态度很明确。他们的设计目标就是开箱即用，不想让用户花几周时间配 Agent，那就预装更多功能。不想要的可以关掉——&lt;code&gt;hermes skills config&lt;/code&gt; 和 &lt;code&gt;hermes tools&lt;/code&gt; 就是干这个的。&lt;/p&gt;&lt;p&gt;但社区一些用户和开发者并不买账。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;有开发者表达担忧：最麻烦的不是总数变大，是你只看到 token 烧了多少，却看不清到底哪段链路最费。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;img loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;340&quot; src=&quot;/_astro/hermes-agent-token-consumption-social-media-discussion-1.B41lbOQw_1pdCk.webp&quot; srcset=&quot;/_astro/hermes-agent-token-consumption-social-media-discussion-1.B41lbOQw_Z2fzfjp.webp 640w, /_astro/hermes-agent-token-consumption-social-media-discussion-1.B41lbOQw_1329M.webp 750w, /_astro/hermes-agent-token-consumption-social-media-discussion-1.B41lbOQw_disGu.webp 828w, /_astro/hermes-agent-token-consumption-social-media-discussion-1.B41lbOQw_Z1AXjln.webp 1080w, /_astro/hermes-agent-token-consumption-social-media-discussion-1.B41lbOQw_1pdCk.webp 1200w&quot; /&gt;&lt;/p&gt;&lt;p&gt;LobeHub 开发负责人自述踩坑经历——早期也给 Agent 塞了一堆工具和技能，结果用户大量抱怨 Token 占用太多。最后不得不把老的 Chat 模式搬回来，重新迭代技能配比。&lt;/p&gt;&lt;p&gt;他们的结论是：好的平衡不是”预装一切”，而是技能自发现、按需启用。即使内置精选做得再好，对前端工程师和产品经理来说仍然不能一刀切—— &lt;strong&gt;他们需要的不是「哪 10 个技能最好」，而是「根据我是谁、我做什么」来个性化配置&lt;/strong&gt; 。&lt;/p&gt;&lt;p&gt;&lt;img loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;810&quot; src=&quot;/_astro/hermes-agent-token-consumption-social-media-discussion-2.Bz3p4x3y_rIhT.webp&quot; srcset=&quot;/_astro/hermes-agent-token-consumption-social-media-discussion-2.Bz3p4x3y_2nrXn0.webp 640w, /_astro/hermes-agent-token-consumption-social-media-discussion-2.Bz3p4x3y_Z1VsoAC.webp 750w, /_astro/hermes-agent-token-consumption-social-media-discussion-2.Bz3p4x3y_ZSbThj.webp 828w, /_astro/hermes-agent-token-consumption-social-media-discussion-2.Bz3p4x3y_Cmkmj.webp 1080w, /_astro/hermes-agent-token-consumption-social-media-discussion-2.Bz3p4x3y_rIhT.webp 1170w&quot; /&gt;&lt;/p&gt;&lt;p&gt;当然也有站在中间的人。有人打了个比方：macOS 预装了 Pages 和 Numbers，我从来不用，但有人需要——你用不到不代表别人用不到。&lt;/p&gt;&lt;p&gt;两派都有道理。本质上仍是不同用户需求的角度罢了。不管怎么争，有一点无法回避：&lt;strong&gt;为什么是现在爆发？&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&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;过去一年，Hermes 和 OpenClaw 爆发式增长。很多人以为是产品做得好。但有一个被忽略的前提——云服务商的 Coding Plan。极致的低成本和免费额度，直接卸掉了复杂智能体的研发成本枷锁。用户每月有几百万免费 Token，浪费几千个根本无感。&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;img loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;698&quot; src=&quot;/_astro/user-consumption-awakening.BiSDGZqq_27MiNr.webp&quot; srcset=&quot;/_astro/user-consumption-awakening.BiSDGZqq_ZfBj2E.webp 640w, /_astro/user-consumption-awakening.BiSDGZqq_1cOF3r.webp 750w, /_astro/user-consumption-awakening.BiSDGZqq_1SBUq8.webp 828w, /_astro/user-consumption-awakening.BiSDGZqq_2dk7oU.webp 1080w, /_astro/user-consumption-awakening.BiSDGZqq_27MiNr.webp 1280w&quot; /&gt;&lt;/p&gt;&lt;p&gt;但 Coding Plan 正在全面退场。云厂商转向按量计费的 Token Plan。潮水退去后，每一笔 Token 消耗都变成了账单上的数字。&lt;/p&gt;&lt;p&gt;不是 Hermes 变差了。是之前有人替你买单。&lt;/p&gt;&lt;p&gt;这大概能解释 Hermes 团队在 v0.15.0 “Velocity” 版本里为什么下了狠手——76% 的代码重构，&lt;code&gt;run_agent.py&lt;/code&gt; 从 16,083 行压缩到 3,821 行，47% 的单轮函数调用削减，基于 BM25 的 Tool Search 实现 85% Token 削减。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;Coding Plan 时代，用户和开发者不需要关心效率——云厂商的补贴扛着一切。每一行代码、每一次调用，背后都有免费额度在兜底。大家的精力全放在功能堆叠上：技能越多越好，工具越全越好，Agent 越”智能”越好。&lt;/p&gt;&lt;p&gt;Token Plan 时代来了，规则变了。每一笔消耗都是真金白银。冗余不再是”有总比没有好”，而是”你要为它付钱”。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;所以，这场争论的意义在哪？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;它不只是两个技术哲学的对撞。是一个行业在告别补贴时代后，被迫重新审视每一笔开销。 &lt;strong&gt;「开箱即用」和「少即是多」之间没有根本对错&lt;/strong&gt; ——但在成本显性化的今天，“我不知道这些 Token 花在哪”才是真正的风险。&lt;/p&gt;&lt;p&gt;有几个方向已经是共识。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. 工具搜索按需加载&lt;/strong&gt; ：不一股脑把所有 Tool schema 塞进上下文，用的时候再加载，用完就释放。BM25 搜索不是花活，是刚需。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. 多 Agent 场景分离&lt;/strong&gt; ：Coding 用 Pi 或 Claude Code，日常助理用 Hermes 或 OpenClaw，各配各的技能密度。不在一个 Agent 里堆所有事。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. 可见性优先&lt;/strong&gt; ：不管是裁剪技能还是配置工具，先能看到 Token 花在哪。看不见就管不了。&lt;/p&gt;&lt;p&gt;Coding Plan 时期，效率是云厂商替你操心的事。Token Plan 时期，效率是你自己的事。&lt;/p&gt;&lt;p&gt;争论还会继续。但这不是坏事。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>SEO 域名迁移前期准备有哪些？「少输便是赢」的完整攻略</title><link>https://blog.moewah.com/posts/seo-domain-migration-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/seo-domain-migration-guide/</guid><description>域名迁移是不对称赌注，上行有限下行无限。本文从决策判断、准备清单、URL映射、重定向配置到迁移后监控，给出完整框架。准备阶段占90%工作量，迁移当天应该无聊才对。</description><pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;域名迁移最坑的不是技术。&lt;/p&gt;
&lt;p&gt;是那些你以为”做完了”但其实没做的环节。&lt;/p&gt;
&lt;p&gt;301 重定向配了，sitemap 提交了，Change of Address 也点了。看起来一切正常。&lt;/p&gt;
&lt;p&gt;然后流量开始跌。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;域名迁移的本质&lt;/strong&gt; ：不是一个技术操作，是一个持续一年的项目管理工程。准备阶段占 90% 工作量，迁移当天只占 5%。如果你觉得迁移当天是手忙脚乱的，说明准备不足—— &lt;strong&gt;迁移当天应该是无聊的才对&lt;/strong&gt; 。&lt;/p&gt;
&lt;p&gt;这篇文章给出完整框架。读完后你会知道：什么情况该迁移、怎么判断是否正常恢复、哪里容易踩坑。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&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;/p&gt;&lt;p&gt;上行空间有限（最好的情况是流量不变），下行空间无限（流量永久丢失，品牌认知断裂）。在没有明确收益的前提下，完全不建议执行迁移操作。&lt;/p&gt;&lt;section&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;品牌重塑已确定&lt;/td&gt;&lt;td&gt;该迁移&lt;/td&gt;&lt;td&gt;新品牌名搜索排名第 1，AI 正确识别&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ccTLD 限制国际可见度&lt;/td&gt;&lt;td&gt;该迁移&lt;/td&gt;&lt;td&gt;&lt;code&gt;.co.uk&lt;/code&gt; 对全球搜索不友好&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;合并竞争域名&lt;/td&gt;&lt;td&gt;该迁移&lt;/td&gt;&lt;td&gt;多域名互相蚕食流量&lt;/td&gt;&lt;/tr&gt;&lt;tr&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;/td&gt;&lt;td&gt;不迁移&lt;/td&gt;&lt;td&gt;盲目跟风&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;”品牌升级”但搜索不认&lt;/td&gt;&lt;td&gt;不迁移&lt;/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; ：搜索新品牌名，排名第 1 是否是你？如果不是，迁移后用户搜品牌名会找到竞争对手。&lt;/p&gt;&lt;/section&gt;&lt;section&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;ChatGPT、Claude、Perplexity 已经是重要流量来源。迁移前必须测试：在 AI 搜索中问”XX品牌是什么”，看回答是否正确描述你的品牌。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;为什么重要&lt;/strong&gt; ：AI 模型的训练数据有”记忆”。如果你的旧域名在训练数据中出现多次，模型会记住旧域名。迁移后，AI 推荐流量可能持续丢失。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt; （提前 3-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;Wikipedia 页面更新&lt;/td&gt;&lt;td&gt;AI 训练数据主要来源&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Organization schema 绑定新域名&lt;/td&gt;&lt;td&gt;结构化数据识别品牌-域名关系&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;新闻报道绑定新名称 + 新域名&lt;/td&gt;&lt;td&gt;外部引用强化关联&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;/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;判断是否迁移、指定负责人&lt;/td&gt;&lt;td&gt;5%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;准备&lt;/td&gt;&lt;td&gt;审计、清理、映射、测试&lt;/td&gt;&lt;td&gt;90%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;迁移&lt;/td&gt;&lt;td&gt;执行重定向和 DNS 切换&lt;/td&gt;&lt;td&gt;5%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;后迁移&lt;/td&gt;&lt;td&gt;12 个月监控&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;strong&gt;繁琐到惩罚每一个跳过的步骤&lt;/strong&gt; 。失败通常不是因为技术问题，是因为准备阶段的某个环节被跳过了。&lt;/p&gt;&lt;section&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;迁移涉及项目管理、技术 SEO、工程三个领域。没有单一负责人的迁移，不会在当天失败——会在 6 个月后发现某个子域名从未重定向。&lt;/p&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;/td&gt;&lt;td&gt;时间表、回滚决策、DNS 切换时机&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;技术 SEO&lt;/td&gt;&lt;td&gt;canonical、sitemap、Change of Address&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;工程/开发&lt;/td&gt;&lt;td&gt;重定向配置、第三方集成&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三、准备阶段：90% 工作量&lt;a href=&quot;#三准备阶段90-工作量&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这是决定成败的阶段。按照清单执行，不要跳过任何步骤。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;3.1 审计当前状态&lt;a href=&quot;#31-审计当前状态&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;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;Screaming Frog&lt;/td&gt;&lt;td&gt;所有 URL、状态码、标题、canonical&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Search Console 数据&lt;/td&gt;&lt;td&gt;GSC 导出&lt;/td&gt;&lt;td&gt;16 个月点击/展示、排名查询词&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;服务器爬取日志&lt;/td&gt;&lt;td&gt;日志分析工具&lt;/td&gt;&lt;td&gt;真实被爬取的 URL&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;子域名检查&lt;/td&gt;&lt;td&gt;DNS 配置检查&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; ：爬取日志 URL 数 &amp;gt; 站点地图 URL 数 = 正常。如果只映射站点地图，其余 URL 会 404。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.2 审计新域名历史&lt;a href=&quot;#32-审计新域名历史&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;检查方法&lt;/th&gt;&lt;th&gt;处理方式&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Search Console 人工处罚&lt;/td&gt;&lt;td&gt;查看”人工处罚”报告&lt;/td&gt;&lt;td&gt;提交复议或放弃&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;历史 disavow 文件&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;/td&gt;&lt;td&gt;Ahrefs/SEMrush&lt;/td&gt;&lt;td&gt;加入 disavow&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.3 构建 URL 映射表&lt;a href=&quot;#33-构建-url-映射表&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;错误做法&lt;/strong&gt; ：通配符重定向所有旧 URL 到首页。&lt;/p&gt;&lt;p&gt;为什么错误？Google 判断为”软 404”——用户点击链接期待具体内容，落地却是首页。权重不传递，流量永久丢失。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;正确做法&lt;/strong&gt; ：逐页映射。多语言站点需同步更新 hreflang 配置——旧域名的 hreflang 标签指向新域名对应语言版本，否则多语言索引混乱。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;AI 辅助 URL 映射&lt;/strong&gt; （大规模站点的实用技巧）：&lt;/p&gt;&lt;p&gt;对于数千 URL 的站点，手动映射不现实。用 LLM 处理模糊匹配：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Prompt 示例：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;旧 URL: /blog/2021/03/15/how-to-improve-seo&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;新 URL 候选:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;/articles/seo-guide&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;/blog/seo-tips-2024&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;/guides/search-optimization&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;任务：根据语义相似度选择最匹配的新 URL&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;LLM 擅长处理标题相似、路径结构变化的模糊匹配。人工审核 LLM 输出，效率提升 5-10 倍。&lt;/p&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;旧 URL&lt;/td&gt;&lt;td&gt;从爬取日志导出&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;新 URL&lt;/td&gt;&lt;td&gt;对应的新域名页面&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;重定向类型&lt;/td&gt;&lt;td&gt;301（永久）或 302（临时）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;状态&lt;/td&gt;&lt;td&gt;待映射/已映射/已验证&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.4 Redirect-By Header：调试利器&lt;a href=&quot;#34-redirect-by-header调试利器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;迁移后排查重定向问题时，这个技术技巧能节省大量时间：&lt;/p&gt;&lt;p&gt;在重定向响应中添加自定义 header：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;HTTP&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;1.1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;301&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Moved Permanently&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Location&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://newdomain.com/page&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Redirect-By&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;migration-2024-05&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&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;排查 CDN/Nginx/Apache 多层重定向链&lt;/li&gt;
&lt;li&gt;区分历史重定向和迁移重定向&lt;/li&gt;
&lt;/ul&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;Nginx&lt;/td&gt;&lt;td&gt;&lt;code&gt;add_header Redirect-By &quot;migration-2024-05&quot;;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Apache&lt;/td&gt;&lt;td&gt;&lt;code&gt;Header always set Redirect-By &quot;migration-2024-05&quot;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare&lt;/td&gt;&lt;td&gt;Page Rules → Add Header&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.5 非 Web 部分的迁移清单&lt;a href=&quot;#35-非-web-部分的迁移清单&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;检查项&lt;/th&gt;&lt;th&gt;遗漏后果&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;API 端点&lt;/td&gt;&lt;td&gt;回调地址、webhook 配置&lt;/td&gt;&lt;td&gt;第三方集成失效&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OAuth 回调&lt;/td&gt;&lt;td&gt;Google/Facebook/GitHub 登录&lt;/td&gt;&lt;td&gt;用户无法登录&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CORS 配置&lt;/td&gt;&lt;td&gt;允许域名列表&lt;/td&gt;&lt;td&gt;前端请求被阻止&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cookies&lt;/td&gt;&lt;td&gt;domain 属性&lt;/td&gt;&lt;td&gt;登录态丢失&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Package registries&lt;/td&gt;&lt;td&gt;npm/GitHub Packages 配置&lt;/td&gt;&lt;td&gt;CI/CD 失败&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;移动 App SDK&lt;/td&gt;&lt;td&gt;API 域名配置&lt;/td&gt;&lt;td&gt;App 功能失效&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;/section&gt;&lt;section&gt;&lt;h3&gt;3.6 站点速度优化&lt;a href=&quot;#36-站点速度优化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;迁移期间爬取压力会激增。Googlebot 和 Bingbot 会高强度爬取新域名。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;为什么要优化&lt;/strong&gt; ：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;爬取预算有限，响应慢 = 爬取少 = 索引慢&lt;/li&gt;
&lt;li&gt;用户访问变慢 = 跳出率升高 = 排名下降&lt;/li&gt;
&lt;/ul&gt;&lt;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;/td&gt;&lt;td&gt;迁移前扩容或优化后端&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CDN 配置&lt;/td&gt;&lt;td&gt;确保新域名 CDN 生效&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;数据库查询&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; ：迁移前用 PageSpeed Insights 测试新域名，Core Web Vitals 通过。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.7 测试所有环节&lt;a href=&quot;#37-测试所有环节&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;工具&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;Screaming Frog&lt;/td&gt;&lt;td&gt;成功率 ≥ 95%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;canonical 正确性&lt;/td&gt;&lt;td&gt;Screaming Frog&lt;/td&gt;&lt;td&gt;不指向旧域名&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;内链无断裂&lt;/td&gt;&lt;td&gt;Screaming Frog&lt;/td&gt;&lt;td&gt;无 404&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OAuth/第三方回调&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;判断标准&lt;/strong&gt; ：重定向成功率低于 95% = 不要迁移。CDN 边缘节点（Cloudflare/CloudFront）缓存可能残留旧域名规则，需清理后再测试。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.8 团队协作时间线&lt;a href=&quot;#38-团队协作时间线&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;沟通对象&lt;/th&gt;&lt;th&gt;沟通内容&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;T-6 周&lt;/td&gt;&lt;td&gt;技术团队&lt;/td&gt;&lt;td&gt;迁移计划、重定向配置工作量&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;T-4 周&lt;/td&gt;&lt;td&gt;市场/运营&lt;/td&gt;&lt;td&gt;品牌物料更新时间表&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;T-2 周&lt;/td&gt;&lt;td&gt;客服/销售&lt;/td&gt;&lt;td&gt;FAQ、客户通知模板&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;T-1 周&lt;/td&gt;&lt;td&gt;全员&lt;/td&gt;&lt;td&gt;迁移窗口确认、紧急联系人&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;T+1 天&lt;/td&gt;&lt;td&gt;客户/用户&lt;/td&gt;&lt;td&gt;正式通知（邮件、公告）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;T+1 月&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;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;四、迁移当天：操作顺序很重要&lt;a href=&quot;#四迁移当天操作顺序很重要&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;4.1 DNS TTL 降低&lt;a href=&quot;#41-dns-ttl-降低&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;迁移前 48 小时，将旧域名 DNS TTL 降低到 300-600 秒。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;为什么&lt;/strong&gt; ：DNS 缓存最长可达 TTL 值。TTL 过长 = 切换后部分用户仍访问旧服务器 = 流量丢失。&lt;/p&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;T-48h&lt;/td&gt;&lt;td&gt;TTL 从默认值（通常 3600-86400）降到 300&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;T-0&lt;/td&gt;&lt;td&gt;DNS 切换到新服务器&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;T+48h&lt;/td&gt;&lt;td&gt;TTL 恢复正常值&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.2 robots.txt 特别规则&lt;a href=&quot;#42-robotstxt-特别规则&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;新域名 robots.txt：允许爬取（不要先禁止再开放，容易被误判）。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;旧域名 robots.txt&lt;/strong&gt; ：迁移后必须 &lt;strong&gt;清空或返回 404&lt;/strong&gt; 。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;为什么&lt;/strong&gt; ：如果旧域名 robots.txt 仍存在且包含 &lt;code&gt;Disallow: /&lt;/code&gt;，Google 会停止爬取旧域名，重定向链断裂。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;正确做法&lt;/strong&gt; ：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;旧域名迁移后 robots.txt：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 选项 1：返回 404&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 选项 2：空文件（无任何内容）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 错误：Disallow: /  ← 这会阻止爬取&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.3 操作顺序&lt;a href=&quot;#43-操作顺序&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;顺序错误会导致索引混乱：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;新域名服务器部署完成&lt;/li&gt;
&lt;li&gt;robots.txt 设为允许爬取&lt;/li&gt;
&lt;li&gt;DNS 切换（TTL 已提前降低）&lt;/li&gt;
&lt;li&gt;Search Console 提交 Change of Address&lt;/li&gt;
&lt;li&gt;提交新 sitemap&lt;/li&gt;
&lt;li&gt;实时监控日志&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;加速索引技巧&lt;/strong&gt; ：sitemap 添加 lastmod 标记迁移日期，搜索引擎会优先爬取标记更新的页面。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.4 实时监控&lt;a href=&quot;#44-实时监控&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;重定向成功率&lt;/td&gt;&lt;td&gt;服务器日志&lt;/td&gt;&lt;td&gt;≥ 95%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;404 错误数量&lt;/td&gt;&lt;td&gt;GSC 实时报告&lt;/td&gt;&lt;td&gt;不激增&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;爬取日志&lt;/td&gt;&lt;td&gt;GSC 爬取统计&lt;/td&gt;&lt;td&gt;正常爬取&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;用户访问异常&lt;/td&gt;&lt;td&gt;GA&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; ：重定向成功率 &amp;lt; 95%，立即排查或回滚。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.5 不要放弃旧域名&lt;a href=&quot;#45-不要放弃旧域名&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;旧域名至少保留 1-2 年（Google 官方建议），理想情况更长：&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;DNS 记录&lt;/td&gt;&lt;td&gt;重定向链起点&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SSL 证书&lt;/td&gt;&lt;td&gt;HTTPS 重定向需要&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;重定向服务&lt;/td&gt;&lt;td&gt;inbound links 持续生效&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;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;五、迁移后监控：持续 12 个月&lt;a href=&quot;#五迁移后监控持续-12-个月&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;5.1 正常恢复周期&lt;a href=&quot;#51-正常恢复周期&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Google 官方数据&lt;/strong&gt; ：迁移后流量损失 30-40%，恢复周期 6-12 个月。&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;第 1 周&lt;/td&gt;&lt;td&gt;流量跌 30-40%&lt;/td&gt;&lt;td&gt;跌幅 &amp;gt; 50%，重定向成功率 &amp;lt; 95%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;第 2-4 周&lt;/td&gt;&lt;td&gt;新域名索引数接近旧域名&lt;/td&gt;&lt;td&gt;索引停滞，大量 404&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;第 2-6 个月&lt;/td&gt;&lt;td&gt;核心词排名逐步恢复&lt;/td&gt;&lt;td&gt;核心词消失，流量持续下跌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;第 6-12 个月&lt;/td&gt;&lt;td&gt;流量回到基准线&lt;/td&gt;&lt;td&gt;流量仍 &amp;lt; 迁移前 50%&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;超过 6 个月未恢复 = 有问题&lt;/strong&gt; 。排查重定向链、canonical 配置、新域名历史。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5.2 异常处理&lt;a href=&quot;#52-异常处理&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;索引数停滞&lt;/td&gt;&lt;td&gt;robots.txt 阻止、sitemap 未提交&lt;/td&gt;&lt;td&gt;检查配置&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;核心词排名消失&lt;/td&gt;&lt;td&gt;canonical 冲突、内容差异&lt;/td&gt;&lt;td&gt;对比新旧内容&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;流量持续下跌&lt;/td&gt;&lt;td&gt;重定向链断裂、外链丢失&lt;/td&gt;&lt;td&gt;检查重定向&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;404 激增&lt;/td&gt;&lt;td&gt;URL 映射遗漏&lt;/td&gt;&lt;td&gt;补充映射&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;Google 官方建议&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;/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;域名迁移 + URL 结构重组&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;hr /&gt;&lt;/section&gt;
&lt;section&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;strong&gt;决策阶段&lt;/strong&gt; ：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt; 迁移收益明确（品牌重塑/国际化/合并域名）&lt;/li&gt;
&lt;li&gt; 新品牌搜索排名第 1&lt;/li&gt;
&lt;li&gt; AI 搜索正确识别新品牌&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; 全站爬取完成（Screaming Frog/Sitebulb）&lt;/li&gt;
&lt;li&gt; Search Console 数据导出（16 个月）&lt;/li&gt;
&lt;li&gt; 新域名历史审计（无处罚）&lt;/li&gt;
&lt;li&gt; URL 映射表完成（逐页映射）&lt;/li&gt;
&lt;li&gt; AI 辅助映射已人工审核&lt;/li&gt;
&lt;li&gt; 重定向配置测试通过（成功率 ≥ 95%）&lt;/li&gt;
&lt;li&gt; Redirect-By Header 已配置&lt;/li&gt;
&lt;li&gt; 非 Web 组件清单已检查（API/OAuth/CORS）&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;ul&gt;
&lt;li&gt; DNS TTL 已提前降低&lt;/li&gt;
&lt;li&gt; 新域名 robots.txt 允许爬取&lt;/li&gt;
&lt;li&gt; DNS 切换完成&lt;/li&gt;
&lt;li&gt; Change of Address 已提交&lt;/li&gt;
&lt;li&gt; 新 sitemap 已提交&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; 旧域名 robots.txt 已清空或 404&lt;/li&gt;
&lt;li&gt; 第 1 周监控报告&lt;/li&gt;
&lt;li&gt; 第 1 月恢复进度报告&lt;/li&gt;
&lt;li&gt; 6-12 个月持续监控&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;/tr&gt;&lt;/thead&gt;&lt;tbody&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;准备优先&lt;/td&gt;&lt;td&gt;90% 工作量在准备，迁移当天应该无聊&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;检查 AI 搜索对品牌的认知&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;不打包&lt;/td&gt;&lt;td&gt;一次改一个变量&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;记住两句话：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;AI 模型没有 Change of Address 工具。&lt;/strong&gt; 训练数据有记忆，迁移前必须预先影响训练数据。&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;域名迁移不难，但繁琐到惩罚每一个跳过的步骤。&lt;/strong&gt; 失败不是因为技术问题，是因为准备阶段的某个环节被跳过了。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;Q：什么情况下应该做域名迁移？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A：三种情况建议迁移：品牌重塑已确定（新品牌搜索排名第1）、ccTLD 限制国际可见度（如 &lt;code&gt;.co.uk&lt;/code&gt; 对全球不友好）、合并竞争域名。主观判断如”域名看起来更好”、“竞争对手换了”不建议迁移——域名迁移是不对称赌注，上行有限下行无限。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：迁移当天的正确操作顺序是什么？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A：新域名服务器部署完成 → robots.txt 设为允许爬取 → DNS 切换（TTL 已提前降低）→ Search Console 提交 Change of Address → 提交新 sitemap → 实时监控日志。顺序错误会导致索引混乱。DNS TTL 需提前 48 小时降到 300 秒，切换后 48 小时恢复正常。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：域名迁移后流量恢复要多久？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A：根据 Google 官方数据，迁移后流量损失 30-40%，恢复周期 &lt;strong&gt;6-12 个月&lt;/strong&gt; 。第1周流量跌 30-40% 正常，第2-4周新域名索引数接近旧域名，第2-6个月核心词排名逐步恢复。超过 6 个月流量仍 &amp;lt; 迁移前 50% = 有问题。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：旧域名迁移后还要保留吗？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A：Google 官方建议 &lt;strong&gt;至少保留 1-2 年&lt;/strong&gt; ，理想情况更长。放弃旧域名 = 所有外链断裂 = 流量永久丢失。旧域名是重定向链的起点，没有它，所有 inbound links 失效。DNS 记录、SSL 证书、重定向服务必须持续维持。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：域名迁移对 AI 搜索有什么影响？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A：AI 模型训练数据有”记忆”，旧域名在训练数据中出现多次会被记住。迁移后 AI 推荐流量可能持续丢失——AI 模型没有 Change of Address 工具。提前 3-6 个月准备：更新 Wikipedia 页面、Organization schema 绑定新域名、新闻报道绑定新名称+新域名。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;参考来源&lt;/strong&gt; ：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/search/docs/crawling-indexing/site-move-with-url-changes&quot; target=&quot;_blank&quot;&gt;Google 网站迁移指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://search.google.com/search-console/settings/change-address&quot; target=&quot;_blank&quot;&gt;Google Change of Address 工具&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.google.com/webmasters/thread/7151106/redirecting-url-from-retired-site-to-existing-site?hl=en&quot; target=&quot;_blank&quot;&gt;Google 论坛：旧域名重定向保留时长&lt;/a&gt; &lt;em&gt;Product Expert 建议至少 1-2 年&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.screamingfrog.com/&quot; target=&quot;_blank&quot;&gt;Screaming Frog SEO Spider&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.google.com/webmasters/answer/55295&quot; target=&quot;_blank&quot;&gt;Google 爬取统计报告&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>Google 即将彻底弃用 FAQ Schema，你的FAQ内容怎么处理？</title><link>https://blog.moewah.com/posts/faq-schema-deprecated-solution/</link><guid isPermaLink="true">https://blog.moewah.com/posts/faq-schema-deprecated-solution/</guid><description>FAQ Schema 两次被 Google 弃用，根源是 schema.org 类型不够精准。社区提案 FAQSection 和 answer 属性能否解决问题？现有 FAQ 内容该怎么处理？</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;2023年8月，Google 把 FAQ rich results 收窄到政府和健康类网站。理由是垃圾内容泛滥，实在管不过来了。&lt;/p&gt;&lt;p&gt;2026年5月7日，彻底斩立决。下面是引用的 Google 2026 年弃用说明：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Upcoming deprecation:&lt;/strong&gt; As of May 7, 2026, FAQ rich results are no longer appearing in Google Search. We will be dropping the FAQ search appearance, rich result report, and support in the Rich results test in June 2026. To allow time for adjusting your API calls, support for the FAQ rich result in the Search Console API will be removed in August 2026.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;有意思的是，Google 的弃用通知压根没让你删掉标记代码。“没必要主动移除”——这跟他们 2023 年的口径一模一样。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;FAQ Schema 怎么就死了两次？&lt;a href=&quot;#faq-schema-怎么就死了两次&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;第一次（2023年）&lt;a href=&quot;#第一次2023年&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;FAQPage&lt;/code&gt; 这个类型设计之初，是用来标记”整页都是FAQ”的页面——比如支持中心、专门的问答页。&lt;/p&gt;&lt;p&gt;但实际用起来呢？产品页底部塞个FAQ，文章结尾挂几个问答，着陆页硬嵌一套FAQ…全都声明成 &lt;code&gt;FAQPage&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;这就导致一个问题：搜索引擎看到 &lt;code&gt;FAQPage&lt;/code&gt;，以为是”这个页面的主要内容是FAQ”，但其实FAQ只是页面的一小部分。语义错位，Google 无法准确判断页面主实体。&lt;/p&gt;&lt;p&gt;2023年收窄到政府/健康网站，本质是 &lt;strong&gt;一刀切止损&lt;/strong&gt;——既然没法区分”真FAQ页”和”伪FAQ页”，那就只给可信度高、滥用少的网站保留。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第二次（2026年）&lt;a href=&quot;#第二次2026年&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;em&gt;SEO 里任何能被滥用的东西，最终都会被滥用。&lt;/em&gt;&lt;/p&gt;&lt;p&gt;2023年之后，只有政府健康网站能显示FAQ rich results。但滥用问题并没有真正解决，GEO 行业正在重蹈覆辙，很多网站照旧把FAQ塞进产品页、文章页，继续声明 &lt;code&gt;FAQPage&lt;/code&gt;，期望能侥幸触发。&lt;/p&gt;&lt;p&gt;Google 评估后发现，就算只保留政府健康网站，FAQ rich results 的整体价值也不够高。不如干脆砍掉，连这些网站的资格也一并收回。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Schema 的漏洞与社区解决方案&lt;a href=&quot;#schema-的漏洞与社区解决方案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;Google 弃用 FAQ rich results，很大程度上是因为 &lt;code&gt;FAQPage&lt;/code&gt; 长期被滥用。问题的根源是  &lt;strong&gt;schema.org 本身没有给出正确的类型&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;现有 schema 只有 &lt;strong&gt;页面级别&lt;/strong&gt; 的 &lt;code&gt;FAQPage&lt;/code&gt; 和 &lt;strong&gt;实体级别&lt;/strong&gt; 的 &lt;code&gt;Question&lt;/code&gt; + &lt;code&gt;acceptedAnswer&lt;/code&gt;，缺的是 &lt;strong&gt;区块级别&lt;/strong&gt; 的 &lt;code&gt;FAQSection&lt;/code&gt; 和 &lt;strong&gt;属性级别&lt;/strong&gt; 的 &lt;code&gt;answer&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;社区提案一：FAQSection&lt;a href=&quot;#社区提案一faqsection&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/schemaorg/schemaorg/issues/4816&quot; target=&quot;_blank&quot;&gt;FAQSection 提案 (GitHub Issue #4816)&lt;/a&gt; 提出，引入 &lt;code&gt;FAQSection&lt;/code&gt; 作为 &lt;code&gt;WebPageElement&lt;/code&gt; 的子类型。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;核心逻辑&lt;/strong&gt;： &lt;strong&gt;FAQPage&lt;/strong&gt; 是页面类型，整页都是 FAQ，主实体是问答内容； &lt;strong&gt;FAQSection&lt;/strong&gt; 是页面区块类型，FAQ 只是页面的一部分，比如产品页底部的 FAQ 区块。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;示例&lt;/strong&gt;：产品页的FAQ区块&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@type&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;WebPage&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mainEntity&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;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@type&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Product&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;name&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;xxx&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hasPart&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;[&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@type&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;FAQSection&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;hasPart&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;[&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@type&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Question&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;name&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;这个产品支持退货吗？&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;acceptedAnswer&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;{&lt;/span&gt;&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这样，搜索引擎可以准确识别：  &lt;strong&gt;这个页面是产品页，主实体是Product，底部有个FAQ区块&lt;/strong&gt;。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;社区提案二：answer 属性&lt;a href=&quot;#社区提案二answer-属性&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/schemaorg/schemaorg/issues/4817&quot; target=&quot;_blank&quot;&gt;answer 属性提案 (GitHub Issue #4817)&lt;/a&gt; 提出，给 &lt;code&gt;Question&lt;/code&gt; 类型添加 &lt;code&gt;answer&lt;/code&gt; 属性。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;核心逻辑&lt;/strong&gt;：区分”发布者答案”和”社区答案”。&lt;/p&gt;&lt;p&gt;当前 &lt;code&gt;Question&lt;/code&gt; 类型有 &lt;strong&gt;acceptedAnswer&lt;/strong&gt; （社区接受的答案，语义是”投票选出”）和 &lt;strong&gt;suggestedAnswer&lt;/strong&gt; （社区建议的答案，语义是”待投票”），这两个属性都适配 &lt;code&gt;QAPage&lt;/code&gt; 风格的社区问答，但 &lt;strong&gt;不适配发布者自己写的 FAQ&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;2019年引入 &lt;code&gt;FAQPage&lt;/code&gt; 时，&lt;code&gt;acceptedAnswer&lt;/code&gt; 被硬塞过来用。但语义上很awkward——发布者写的FAQ，怎么叫”accepted”？&lt;/p&gt;&lt;p&gt;提案提出新增 &lt;code&gt;answer&lt;/code&gt; 属性，语义是   &lt;strong&gt;“发布者撰写的答案”&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@type&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Question&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;name&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;如何退货？&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;answer&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;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@type&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Answer&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;text&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;登录账户，进入订单详情...&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这样，搜索引擎可以区分：用 &lt;strong&gt;acceptedAnswer&lt;/strong&gt; 的是社区 Q&amp;amp;A（Stack Overflow 风格），用 &lt;strong&gt;answer&lt;/strong&gt; 的是发布者 FAQ（官方文档风格）。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;FAQPage 滥用的根源是 &lt;strong&gt;类型不够精准&lt;/strong&gt;——前面提到的 &lt;strong&gt;区块级别&lt;/strong&gt; 和 &lt;strong&gt;属性级别&lt;/strong&gt; 类型缺失，导致语义错位和语义债务。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;FAQSection 解决语义错位&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;产品页、文章页&lt;/strong&gt; 可以用 &lt;code&gt;FAQSection&lt;/code&gt; 标记 FAQ 区块&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;不需要声明&lt;/strong&gt; &lt;code&gt;FAQPage&lt;/code&gt;，不再误导搜索引擎&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;搜索引擎/AI&lt;/strong&gt; 能准确识别页面主实体和 FAQ 区块的关系&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;answer 属性解决语义债务&lt;/strong&gt;：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;发布者 FAQ&lt;/strong&gt; 用 &lt;code&gt;answer&lt;/code&gt;， &lt;strong&gt;社区 Q&amp;amp;A&lt;/strong&gt; 用 &lt;code&gt;acceptedAnswer&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;终端用户&lt;/strong&gt; 能区分两种不同来源的问答内容&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AI 搜索时代&lt;/strong&gt; 准备——AI 需要知道”这个答案是谁写的”&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;截止本文发稿前，两个提案还在讨论中，schema.org 尚未正式采纳。但提案的思路已经很清晰。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;对于现有 FAQ 内容&lt;/strong&gt;：Google 说”没必要主动移除标记”——FAQ schema 本身不会被惩罚；但 FAQ rich results 已经彻底消失，传统 SEO 价值归零。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;对于新 FAQ 内容&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;整页都是 FAQ&lt;/strong&gt; → 继续用 &lt;code&gt;FAQPage&lt;/code&gt; + &lt;code&gt;acceptedAnswer&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FAQ 是页面的一部分&lt;/strong&gt; → 等待 &lt;code&gt;FAQSection&lt;/code&gt; 正式发布&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;发布者自己写的 FAQ&lt;/strong&gt; → 等待 &lt;code&gt;answer&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;strong&gt;FAQ 内容本身的价值&lt;/strong&gt; 没有消失——尽管 Google 即将弃用 FAQ Schema，但砍掉标记，不等于砍掉内容。AI 搜索、语音搜索、GEO 优化仍然需要 FAQ 结构化内容&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;schema.org 的提案方向&lt;/strong&gt; 是让结构化数据更精准，为 AI 时代做准备&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;随时关注&lt;/strong&gt; 提案进展，提前准备迁移方案&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;Google 2023年公告：&lt;a href=&quot;https://developers.google.com/search/blog/2023/08/howto-faq-changes&quot; target=&quot;_blank&quot;&gt;Changes to HowTo and FAQ rich results&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Google 2026年弃用说明：&lt;a href=&quot;https://developers.google.com/search/docs/appearance/structured-data/faqpage?hl=en&quot; target=&quot;_blank&quot;&gt;FAQPage structured data（弃用公告）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Search Engine Journal 报道：&lt;a href=&quot;https://www.searchenginejournal.com/google-drops-faq-rich-results-from-search/574429/&quot; target=&quot;_blank&quot;&gt;Google Drops FAQ Rich Results From Search&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;FAQSection 提案：&lt;a href=&quot;https://github.com/schemaorg/schemaorg/issues/4816&quot; target=&quot;_blank&quot;&gt;GitHub Issue #4816&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;answer 属性提案：&lt;a href=&quot;https://github.com/schemaorg/schemaorg/issues/4817&quot; target=&quot;_blank&quot;&gt;GitHub Issue #4817&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>品牌词被灰黑产冒用怎么办？15种SEO攻击与防护指南</title><link>https://blog.moewah.com/posts/seo-attack-protection-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/seo-attack-protection-guide/</guid><description>记录品牌词被灰黑产冒用的真实经历，分析垃圾外链、网站入侵、品牌冒用、AI投毒等15种SEO攻击类型，提供外链监控、Disavow工具、品牌词保护、网站安全加固、AI时代防护等6步可操作防护策略。帮助独立博客和外贸SEO从业者建立系统化防护机制。</description><pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近，我搜索自己的品牌词「喵斯基部落」时，发现了一件令人毛骨悚然的事——搜索结果中出现了不属于本站的推广信息，而更严重的是，Google AI 概览（Google AI Overviews）直接在结果页面显示了警告标注：「注意：在搜索结果中，部分带有“喵斯基部落”内容的链接疑似存在SEO推广行为。」&lt;/p&gt;
&lt;p&gt;这不是普通的垃圾外链，这是品牌词被灰黑产冒用的明确信号。我第一时间问自己：「为什么这比垃圾外链更严重？」「Google AI 概览的警告意味着什么？」&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;我的判断很明确：这条冒用品牌词的推广信息  &lt;strong&gt;涉嫌欺诈&lt;/strong&gt; 。对于本站而言，这等同于一次严重的SEO攻击——灰黑产冒用品牌词，会直接牵连本站的搜索可见性和品牌信誉，轻则流量下滑，重则被用户标记为「不可信」。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;根据 &lt;a href=&quot;https://searchengineland.com/guide/negative-seo&quot; target=&quot;_blank&quot;&gt;Search Engine Land&lt;/a&gt; 的数据，2024 年有超过 &lt;strong&gt;422,000 个网站&lt;/strong&gt; 遭受 Negative SEO 攻击，其中品牌词被竞品冒用投放广告后，受害者流量损失最高可达  &lt;strong&gt;30%&lt;/strong&gt; 。这不是小概率事件，而是一个正在蔓延的灰色产业链。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;你面对的 15 种常见的 SEO 攻击类型&lt;a href=&quot;#你面对的-15-种常见的-seo-攻击类型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在我深入防护方案之前，先帮你识别攻击类型。基于 &lt;a href=&quot;https://searchengineland.com/guide/negative-seo&quot; target=&quot;_blank&quot;&gt;Search Engine Land&lt;/a&gt;、&lt;a href=&quot;https://ahrefs.com/blog/negative-seo/&quot; target=&quot;_blank&quot;&gt;Ahrefs&lt;/a&gt;、Reddit 社区以及2025-2026年最新的AI安全研究，我整理出最常见的 15 种 SEO 攻击：&lt;/p&gt;&lt;section&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; ：竞争对手在短时间内从大量低质量域名构建链接，使用统一锚文本（如「porn movie」）。真实案例：WP Bacon 网站被注入数千条此类外链，10天内排名暴跌 &lt;strong&gt;50+ 位&lt;/strong&gt; （&lt;a href=&quot;https://www.jacobking.com/negative-seo-truth&quot; target=&quot;_blank&quot;&gt;Jacob King&lt;/a&gt;）。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;虚假链接删除请求&lt;/strong&gt; ：攻击者伪装成你的身份，联系你的外链来源要求删除链接。这不是段子，Ahrefs 官方指南明确提到了这种攻击方式。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;内容抓取/抄袭&lt;/strong&gt; ：AI工具让「伪原创」变得极其容易，竞争对手复制你的内容到多个站点，稀释原创性权重。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;强力爬取攻击&lt;/strong&gt; ：通过恶意爬虫拖垮服务器，导致 Googlebot 无法访问。一个&lt;a href=&quot;https://www.hakukonemarkkinointia.fi/articles/case-study-dealing-with-negative-seo.php&quot; target=&quot;_blank&quot;&gt;真实案例&lt;/a&gt;显示：攻击后网站 &lt;strong&gt;84% 的爬取预算被浪费在垃圾内容上&lt;/strong&gt; 。&lt;/p&gt;&lt;/section&gt;&lt;section&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; ：黑客入侵后植入隐藏链接、恶意重定向。网站被恶意注入不良信息后被百度K站。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;robots.txt 篡改&lt;/strong&gt; ：修改为 &lt;code&gt;Disallow: /*&lt;/code&gt;，使整站被搜索引擎忽略。这是最恶毒的「隐形杀手」，因为它不会触发任何警报。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;XML Sitemap 劫持&lt;/strong&gt; ：研究者 Tom Anthony 发现这个漏洞后获得了 Google  &lt;strong&gt;$1,337 漏洞赏金&lt;/strong&gt; （&lt;a href=&quot;https://www.tomanthony.co.uk/blog/google-xml-sitemap-auth-bypass-black-hat-seo-bug-bounty/&quot; target=&quot;_blank&quot;&gt;Tom Anthony 博客&lt;/a&gt;）。攻击者利用开放重定向漏洞，将权重转移到自己的域名，零外链的测试站点在 3 周内获得了 &lt;strong&gt;100万+ 搜索曝光&lt;/strong&gt; 。&lt;/p&gt;&lt;/section&gt;&lt;section&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; ：Affiliates、竞争对手、优惠券网站竞价你的品牌词，抢夺高意向客户。真实案例：暂停品牌广告后收入下降  &lt;strong&gt;54%&lt;/strong&gt; ，而 Twilio 通过品牌保护节省了 &lt;strong&gt;$150,000/年&lt;/strong&gt; 的 CPC 成本（&lt;a href=&quot;https://searchengineland.com/brand-protection-the-complete-guide-444344&quot; target=&quot;_blank&quot;&gt;Search Engine Land&lt;/a&gt;）。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;虚假评论攻击&lt;/strong&gt; ：在 Yelp、Google 商家、Trustpilot 等平台批量发布负面评论。这是「声誉谋杀」，比排名下降更难恢复。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;站群霸屏攻击&lt;/strong&gt; ：黑帽SEO站群每天变换域名抢注品牌词，搜索结果页出现多个假冒官网。中国法院已认定「万词霸屏」为违法行为（&lt;a href=&quot;http://www.legaldaily.com.cn/zt/content/2022-04/25/content_8709071.htm&quot; target=&quot;_blank&quot;&gt;法治网&lt;/a&gt;），但攻击成本仅 &lt;strong&gt;$5&lt;/strong&gt; （Fiverr 上即可购买）。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Google Business Profile 攻击&lt;/strong&gt; ：利用「Suggest an Edit」漏洞，将地图pin移到偏远岛屿或修改商户名称。真实案例： &lt;strong&gt;39 个商家信息被摧毁&lt;/strong&gt; （&lt;a href=&quot;https://localsearchforum.com/threads/victim-of-negative-seo-attack-on-our-listings-anyone-else-seen-it.61473/&quot; target=&quot;_blank&quot;&gt;Local Search Forum&lt;/a&gt;）。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;SEO Poisoning 攻击&lt;/strong&gt; ：攻击者利用合法网站的站内搜索功能，构造包含恶意关键词的URL。根据 &lt;a href=&quot;https://blog.darklab.hk/2025/07/10/the-dark-side-of-seo-negative-seo-attacks-targeting-businesses-in-asia/&quot; target=&quot;_blank&quot;&gt;DarkLab&lt;/a&gt; 的研究，2025年针对亚洲企业的攻击中，约 &lt;strong&gt;50% 涉及成人内容&lt;/strong&gt; 、 &lt;strong&gt;10% 涉及赌博&lt;/strong&gt; ，甚至入侵政府域名注入恶意内容。这是最难察觉的攻击之一，因为它寄生在合法网站上。&lt;/p&gt;&lt;/section&gt;&lt;section&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;strong&gt;LLM 训练数据投毒&lt;/strong&gt; ：2025年 &lt;a href=&quot;https://www.anthropic.com/research/small-samples-poison&quot; target=&quot;_blank&quot;&gt;Anthropic&lt;/a&gt; 联合英国AI安全研究所的研究发现：仅需 &lt;strong&gt;250个恶意文档&lt;/strong&gt; （约0.00016%训练数据）就能在任何规模的LLM中植入后门。攻击者在公开网络发布特定内容，等待被AI模型爬取纳入训练集。一旦成功，用户触发特定关键词时，模型会输出攻击者预设的内容。这对品牌词搜索意味着：未来用户在 ChatGPT/Gemini 询问「X品牌怎么样」时，可能收到攻击者植入的负面信息。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;AI 搜索结果投毒&lt;/strong&gt; ：&lt;a href=&quot;https://www.zerofox.com/blog/seo-poisoning-llms/&quot; target=&quot;_blank&quot;&gt;ZeroFox&lt;/a&gt; 研究发现，攻击者正在操纵AI工具的输出。他们将虚假客服信息制成PDF上传到 &lt;strong&gt;.edu/.gov等可信域名&lt;/strong&gt; ，然后在Goodreads 等论坛大量转发。LLM将这些「可信来源」整合后，当用户询问「如何联系X品牌客服」时，Gemini/ChatGPT 会返回诈骗电话号码。真实案例：一个虚假号码出现在多个「权威」来源后被 Google AI 作为可信信息推荐。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;AI 内容农场劫持&lt;/strong&gt; ：&lt;a href=&quot;https://www.newsguardtech.com/special-reports/ai-tracking-center/&quot; target=&quot;_blank&quot;&gt;NewsGuard&lt;/a&gt; 与 Pangram Labs 追踪发现： &lt;strong&gt;3000+ 个AI内容农场&lt;/strong&gt; 已被标记，每月新增 300-500 个。这些站点用 AI 批量生成假新闻，模仿正规媒体名称（如「News 24」「CitizenWatchReport」），推送至 Google Discover/News 收割广告收入。真实案例：2025年10月，「News 24」发布 Coca-Cola 威胁撤出 Super Bowl 赞助的假新闻， Coca-Cola 根本不是赞助商，但 Expedia、AT&amp;amp;T 等品牌却在该站点投放了广告。根据 &lt;a href=&quot;https://the-decoder.com/ai-spam-websites-flood-the-web-with-false-information-and-the-number-is-growing-fast/&quot; target=&quot;_blank&quot;&gt;The Decoder&lt;/a&gt; 的报道，俄罗斯 Storm-1516 运营 &lt;strong&gt;358个&lt;/strong&gt; 假冒本地新闻站，假新闻被正规媒体引用后形成「二次传播」。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;AI 虚假评论攻击&lt;/strong&gt; ：根据 &lt;a href=&quot;https://www.reviewdriver.com/article/what-percentage-of-online-reviews-are-fake-in-2025&quot; target=&quot;_blank&quot;&gt;ReviewDriver&lt;/a&gt; 的2025年数据： &lt;strong&gt;30%在线评论是虚假的&lt;/strong&gt; ，46%消费者怀疑AI生成评论是假的。Amazon 删除了超过 &lt;strong&gt;1500万条&lt;/strong&gt; 虚假评论，但攻击者仍在用AI批量生成「逼真」好评/差评。这种攻击比传统虚假评论更难识别——AI生成的评论语法完美、情感真实、甚至能针对产品细节「个性化」吐槽。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;section&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;strong&gt;工具组合&lt;/strong&gt;：Google Search Console + Ahrefs Alerts&lt;/p&gt;&lt;p&gt;&lt;strong&gt;操作流程&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;每周检查 GSC 的人工惩罚通知、安全问题&lt;/li&gt;
&lt;li&gt;每月运行完整外链审计，导出外链档案&lt;/li&gt;
&lt;li&gt;设置 Ahrefs Alerts 实时监控新链接峰值（异常激增 = 红色警报）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;实操细节&lt;/strong&gt;：不要只依赖毒性评分。Reddit 真实案例显示，SEMrush 没有标记攻击链接为有毒，6 周后网站流量急剧下降。 &lt;strong&gt;手动审查&lt;/strong&gt; 永远是第一防线 。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. Disavow 工具使用（谨慎操作）&lt;a href=&quot;#2-disavow-工具使用谨慎操作&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Google 官方立场&lt;/strong&gt;（&lt;a href=&quot;https://support.google.com/webmasters/answer/66356&quot; target=&quot;_blank&quot;&gt;Search Console Help&lt;/a&gt;）：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;「大多数网站不需要担心’toxic links’。当系统发现可疑链接时，主要做法是忽略它们。」— John Mueller（&lt;a href=&quot;https://searchengineland.com/toxic-links-disavows-seo-383324&quot; target=&quot;_blank&quot;&gt;来源&lt;/a&gt;）&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;什么时候提交 Disavow&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;：Penguin 4.0 后，Google 降值垃圾链接而非降权网站，但拒绝错误链接可能造成更大伤害。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;&lt;strong&gt;监控清单&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;每月搜索品牌名称和核心产品，检查负面情绪&lt;/li&gt;
&lt;li&gt;监控 Google 广告透明中心，查看谁在竞价你的品牌词&lt;/li&gt;
&lt;li&gt;使用 Ahrefs Alerts 追踪品牌提及&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;反制措施&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;提交 Google 商标投诉&lt;/li&gt;
&lt;li&gt;建立清晰的 Affiliate 规则，禁止竞价品牌词&lt;/li&gt;
&lt;li&gt;追踪 UTM 参数和流量来源，识别劫持流量&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;strong&gt;基础防护&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Disallow: /search/&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;meta&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;&quot;&lt;/span&gt;&lt;span&gt;robots&lt;/span&gt;&lt;span&gt;&quot;&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;&quot;&lt;/span&gt;&lt;span&gt;noindex, nofollow&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&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;CDN 防护（阿里云盾/腾讯云安全）&lt;/li&gt;
&lt;li&gt;审核用户输入，防止站内搜索被注入攻击&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;真实案例&lt;/strong&gt;：攻击者利用站内搜索功能注入 tens of thousands 垃圾 backlinks，导致 23,000+ 页面被爬取但未索引（&lt;a href=&quot;https://www.hakukonemarkkinointia.fi/articles/case-study-dealing-with-negative-seo.php&quot; target=&quot;_blank&quot;&gt;案例来源&lt;/a&gt;）。防护措施是在 robots.txt 中阻止 feed URL patterns，服务器返回 HTTP-410/Gone。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. 恢复流程（最坏情况）&lt;a href=&quot;#5-恢复流程最坏情况&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果已经遭受攻击，这是我验证过的 7 步恢复流程：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;从 Ahrefs/SEMrush 导出完整 backlink 报告&lt;/li&gt;
&lt;li&gt;从 GSC 下载现有 disavow 列表&lt;/li&gt;
&lt;li&gt;手动审查识别有毒域名&lt;/li&gt;
&lt;li&gt;添加格式：&lt;code&gt;domain:spammydomain.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;上传到 Google disavow 工具&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;：Reddit 真实案例显示，从攻击到恢复需要 &lt;strong&gt;6-10 个月&lt;/strong&gt; 。越早发现，损失越小。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6. AI 时代防护（新增必修）&lt;a href=&quot;#6-ai-时代防护新增必修&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;LLM输出监控&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;定期在 ChatGPT/Gemini/Copilot 测试品牌相关查询&lt;/li&gt;
&lt;li&gt;记录AI返回的联系方式、评价、推荐&lt;/li&gt;
&lt;li&gt;发现异常立即向平台反馈（OpenAI feedback、Google AI feedback）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;AI内容农场识别&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;使用 NewsGuard 检查引用来源可信度&lt;/li&gt;
&lt;li&gt;监控品牌提及的站点是否为「AI内容农场」特征：批量生产、无编辑部、域名模仿正规媒体&lt;/li&gt;
&lt;li&gt;发现品牌被AI农场引用后，通过 &lt;a href=&quot;https://publishercenter.google.com/&quot; target=&quot;_blank&quot;&gt;Google News Publisher Center&lt;/a&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;如果你的站点允许用户上传PDF/文档，严格审核内容&lt;/li&gt;
&lt;li&gt;定期检查 .edu/.gov 等可信域名是否有冒用品牌的文件&lt;/li&gt;
&lt;li&gt;发现后联系站点管理员删除，并向搜索引擎提交移除请求&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;AI评论识别&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;监控电商平台评论异常增长&lt;/li&gt;
&lt;li&gt;关注「语法完美但内容空洞」的评论模式&lt;/li&gt;
&lt;li&gt;向平台举报可疑评论（Amazon 已有AI检测工具）&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;结构化数据（Schema.org）标记官方联系方式&lt;/li&gt;
&lt;li&gt;避免在公开页面留下可被篡改的「客服电话」等内容&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;很多人问我：「Negative SEO 真的有效吗？Google 不是说会忽略垃圾链接吗？」&lt;/p&gt;&lt;p&gt;我的回答是：Google 的算法确实在进步，但攻击者也在进化。 &lt;strong&gt;恐惧比现实更糟糕&lt;/strong&gt; ——这是 WebmasterWorld 社区的共识。但当我看到 &lt;a href=&quot;https://www.jacobking.com/negative-seo-truth&quot; target=&quot;_blank&quot;&gt;Jacob King&lt;/a&gt; 记录的 WP Bacon 案例中一个仅1年9个月的新站被攻击后排名暴跌 50+ 位，当我看到 &lt;a href=&quot;https://www.webmasterworld.com/google/5032668.htm&quot; target=&quot;_blank&quot;&gt;WebmasterWorld&lt;/a&gt; 论坛中站长报告遭受持续攻击后的绝望，我意识到这不是杞人忧天。&lt;/p&gt;&lt;p&gt;虽然 &lt;strong&gt;喵斯基部落&lt;/strong&gt; 的案例不是个例，只是 SEO 生态的缩影：灰黑产正在利用品牌词这个薄弱环节，进行低成本、高回报的攻击。&lt;/p&gt;&lt;p&gt;我们需要的不是恐慌，而是系统化的防护机制。从今天开始：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;设置 Ahrefs Alerts 监控新链接&lt;/li&gt;
&lt;li&gt;每周检查 GSC 的人工惩罚和安全问题&lt;/li&gt;
&lt;li&gt;每月搜索品牌词，检查负面情绪&lt;/li&gt;
&lt;li&gt;建立网站安全加固流程&lt;/li&gt;
&lt;li&gt;准备好 Disavow 文件模板&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;防护 SEO 攻击不是一次性任务，而是持续运营的一部分。&lt;/strong&gt; 品牌词关乎整个网站的信誉，而信任是一切的基础，值得被保护。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;核心要点总结&lt;a href=&quot;#核心要点总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;












































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;攻击类型&lt;/th&gt;&lt;th&gt;检测工具&lt;/th&gt;&lt;th&gt;防护频率&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;垃圾外链轰炸&lt;/td&gt;&lt;td&gt;Ahrefs Alerts, GSC&lt;/td&gt;&lt;td&gt;每周监控&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;内容篡改&lt;/td&gt;&lt;td&gt;网站变更监控&lt;/td&gt;&lt;td&gt;每月审核&lt;/td&gt;&lt;/tr&gt;&lt;tr&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;/td&gt;&lt;td&gt;平台手动搜索&lt;/td&gt;&lt;td&gt;每月检查&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;LLM 数据投毒&lt;/td&gt;&lt;td&gt;ChatGPT/Gemini 测试&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;AI工具输出监控&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;NewsGuard, 品牌提及监控&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;422,000：2024年遭受 Negative SEO 攻击的网站数量&lt;/li&gt;
&lt;li&gt;30%：品牌词被冒用后的最大流量损失&lt;/li&gt;
&lt;li&gt;250：LLM训练数据投毒所需的最小恶意文档数&lt;/li&gt;
&lt;li&gt;3000+：已被标记的AI内容农场数量&lt;/li&gt;
&lt;li&gt;6-10个月：从攻击到恢复的平均时间&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这不是危言耸听，这是数据和案例支撑的现实。当我再次搜索「喵斯基部落」时，我希望看到的是本站的内容，而不是灰黑产的冒牌货。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>小站怎么跟大平台竞争SEO？2026年的一些反直觉发现</title><link>https://blog.moewah.com/posts/small-site-vs-big-platform-seo-2026/</link><guid isPermaLink="true">https://blog.moewah.com/posts/small-site-vs-big-platform-seo-2026/</guid><description>独立博客面对大平台搬运和流量分流，并非只能被动挨打。从爬虫预算红利、关键词内部竞争、E-E-A-T经验信号三个维度，小站反而拥有大平台无法复制的优势。本文拆解底层逻辑并提供四条实操建议。</description><pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近遇到一件事，让我开始认真思考这个问题。&lt;/p&gt;
&lt;p&gt;我写的博客文章，页面底部明确标注了授权许可协议：非商用转载需注明作者和原文链接。这算是比较宽松的要求了，只要尊重来源，我可以接受转载。&lt;/p&gt;
&lt;p&gt;结果呢？多个大平台直接 1:1 搬运了过去——全文复制、配图照搬、连排版都没改。最气的是，他们压根没按协议要求注明作者和原文链接，仿佛这篇文章就是他们自己写的。&lt;/p&gt;
&lt;p&gt;更讽刺的是，用户搜索相关关键词时，搜索结果里出现了多个一模一样的版本。他们点进去的是哪个？大概率不是我的博客。我的原创内容，反而成了搜索引擎眼里的”众多来源之一”。&lt;/p&gt;
&lt;p&gt;我当时的反应是：这公平吗？我花时间踩坑、验证、写出来的东西，凭什么被人家一键复制就分流了流量？连最基本的署名都不给？&lt;/p&gt;
&lt;p&gt;但冷静下来后，我开始想另一个问题：独立博客在大平台面前，真的只能被动挨打吗？还是说，我们在某些维度上，反而有着大平台无法复制的优势？&lt;/p&gt;
&lt;p&gt;带着这个困惑，我开始翻各种 SEO 资料。然后看到一组数据，让我愣了一下：&lt;/p&gt;
&lt;p&gt;Google 官方说，平均有 &lt;strong&gt;16-25%&lt;/strong&gt; 的网站页面从未被索引。&lt;/p&gt;
&lt;p&gt;这意味着什么？每 4-5 个页面里，就有一个 Google 压根没收录。更狠的是，“抓取但不索引”——你看着 GSC 里那一排排 “Crawled – currently not indexed”，根本没法强制让它收录。&lt;/p&gt;
&lt;p&gt;大站为此焦头烂额，疯狂优化爬虫预算。但有意思的是，这个局面下，独立博客反而悄悄占了便宜。&lt;/p&gt;
&lt;section&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;Google 分配爬虫预算，不是按”谁更牛”来分的，而是按主机名分的。&lt;code&gt;example.com&lt;/code&gt; 和 &lt;code&gt;blog.example.com&lt;/code&gt; 是 &lt;strong&gt;两个独立的预算池&lt;/strong&gt; 。&lt;/p&gt;&lt;p&gt;这意味着什么？&lt;/p&gt;&lt;p&gt;一个百万页的大站，每天可能只有 1 万的爬取额度。新发的文章？可能几周才被发现。大站 SEO 团队的噩梦，就是重要页面被低价值页面”挤掉”——分面导航生成的几十万过滤 URL、重复内容、空分类页……都在抢那点可怜的爬取资源。&lt;/p&gt;&lt;p&gt;而你的独立博客呢？&lt;/p&gt;&lt;p&gt;假设你写了 200 篇文章。Google 官方原话是：“如果你的站点没有大量快速变化的页面，或者页面在发布当天就能被爬取，你不需要阅读这份指南。”&lt;/p&gt;&lt;p&gt;&lt;strong&gt;小站的”劣势”（页面少），反而是 SEO 优势。&lt;/strong&gt; 每个新页面都能获得相对充分的爬取机会，不存在页面间竞争有限的爬虫资源。&lt;/p&gt;&lt;p&gt;HubSpot 删掉 3000 个页面后，索引速度从”数天”变成了”数分钟”。Belkins 删掉 2/3 内容后，月流量从 3000 涨到 10000。&lt;/p&gt;&lt;p&gt;你看，少即是多。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;“关键词蚕食”这个词，大站 SEO 才懂有多痛。&lt;/p&gt;&lt;p&gt;同一个网站，5 篇文章都在优化同一个关键词。结果呢？搜索引擎懵了：我到底该排哪篇？最后所有文章的排名都被稀释。&lt;/p&gt;&lt;p&gt;我见过一个企业级站点，一个关键词在 GSC 里触发了  &lt;strong&gt;15+ 个页面&lt;/strong&gt; 。每个页面的点击率都不到 1%。&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;Ahrefs 的研究说：小型站点如果有高质量链接，很可能被完全爬取。大型站点？链接质量低的话，可能只能被部分爬取。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;“单一决策点”带来的效率，是大站用多少钱都买不来的。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;E-E-A-T 里的 “E”，AI 写不出来&lt;a href=&quot;#e-e-a-t-里的-eai-写不出来&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;2022 年 12 月，Google 把 E-A-T 升级成了 E-E-A-T。多出来的那个 E，是  &lt;strong&gt;Experience（经验）&lt;/strong&gt; 。&lt;/p&gt;&lt;p&gt;官方定义是：内容创作者是否有一手的、亲身实践的经验。&lt;/p&gt;&lt;p&gt;这事儿有意思了。&lt;/p&gt;&lt;p&gt;AI 可以秒生成一篇”如何做 SEO”的文章。它可以综合 100 篇教程，写得头头是道。但它没法告诉你：凌晨两点盯着 GSC 数据焦虑是什么感觉。第一次被抄袭网站反超排名时的心情。踩了某个坑后怎么爬出来的。&lt;/p&gt;&lt;p&gt;Search Engine Land 的研究说得很直白：“AI 可以快速创建信息性内容，但它无法像人类作者那样体验事物。这是 AI 生成内容的根本缺陷。”&lt;/p&gt;&lt;p&gt;独立博客天然带着 Experience 信号：&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;大平台呢？多少内容是”内容团队”批量生产的？署名可能是笔名、可能是”编辑团队”。Google 怎么判断这是不是一个真实的人，是否有真实经验？&lt;/p&gt;&lt;p&gt;&lt;strong&gt;独立博客的”个人视角”，本身就是 Experience 的最佳证明。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;AI 生成内容的成本趋近于零，内容农场每天可以产出上万篇文章。但悖论在于：搜索引擎越升级算法，越需要找到”值得信任”的来源。真实经历反而成了稀缺资源。&lt;/p&gt;&lt;p&gt;我写博客这几年，最常收到的一类留言是：“你的文章帮我省了很多时间。“背后的原因很简单——我写的是我真正遇到的问题，和我真正找到的解决方案。不是某个关键词布局出来的 SEO 文章。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;strong&gt;第一，精简内容，删除冗余。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Google Helpful Content 系统的原话：“删除无帮助内容可能有助于其他页面表现更好。“每篇低质量文章都在消耗你的爬虫预算，稀释你的整体权重。&lt;/p&gt;&lt;p&gt;我自己的做法：每半年做一次内容审计。访问量为 0、无内链、无外链的文章，要么合并，要么删除。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第二，建立清晰的 Hub-Spoke 架构。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;不要让多篇文章竞争同一个关键词。支柱页（Hub）覆盖大主题，卫星页（Spoke）解答细分问题，所有卫星页链接指向支柱页。&lt;/p&gt;&lt;p&gt;小站的优势在于：你不用跨部门沟通，全局内容架构就装在脑子里。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第三，强化作者信号。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;详细的文章署名页。真实的职业背景。社交媒体链接。完整的 Person Schema 结构化数据。如果有第三方媒体报道、播客访谈、客座文章——这些都是验证”你是真实存在的、有经验的作者”的证据。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第四，继续写真实的、有个人经验的内容。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这是 AI 时代最大的护城河。技术可以复制，但真实经历无法批量生产。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;strong&gt;拿你的”小”去竞争。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;小意味着决策快、调整灵活。小意味着没有内部竞争、没有爬虫预算焦虑。小意味着每篇文章都是真实的署名、真实的经验。&lt;/p&gt;&lt;p&gt;AI 时代，稀缺的不是内容，是真实。&lt;/p&gt;&lt;p&gt;你的博客，恰恰是真实的。&lt;/p&gt;&lt;/section&gt;
&lt;section&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://developers.google.com/crawling/docs/crawl-budget&quot; target=&quot;_blank&quot;&gt;Google Crawl Budget 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ahrefs.com/seo/glossary/crawl-budget&quot; target=&quot;_blank&quot;&gt;Ahrefs 爬虫预算研究&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://searchengineland.com/e-e-a-t-making-experience-and-expertise-your-content-advantage-446263/&quot; target=&quot;_blank&quot;&gt;Search Engine Land E-E-A-T 研究&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://static.googleusercontent.com/media/search.google.com/en//searchqualityraterguidelines.pdf&quot; target=&quot;_blank&quot;&gt;Google Search Quality Rater Guidelines&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>关键词蚕食问题怎么修复？外贸独立站产品页实战诊断</title><link>https://blog.moewah.com/posts/keyword-cannibalization-fix-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/keyword-cannibalization-fix-guide/</guid><description>产品页SKU多了，多个页面抢同一个大词，Google不知该推哪个？本文用GSC诊断是否蚕食，建立关键词映射表，从Title、H1、内链锚文本、URL四个维度拉开信号区隔。</description><pubDate>Sun, 26 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;好几款产品页都优化了同一个大词，结果 Google 里一个都没排上去，或者排名今天这个页面上来明天换另一个。&lt;/p&gt;
&lt;p&gt;这不是运气不好，是 &lt;strong&gt;关键词蚕食&lt;/strong&gt; 。多个页面竞争同一个搜索词，Google 不知道该推哪个，干脆谁都不给好排名。SKU 页面多了，每个都想吃大词流量，最后互相打架。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&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; ——Title、H1、内链锚文本都在强化这个词。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;判断蚕食要看两个条件&lt;/strong&gt; ：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;关键词相同&lt;/li&gt;
&lt;li&gt;搜索意图相同&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;如果两个页面目标词不同（比如「降噪耳机」和「运动耳机」），哪怕正文都提到「无线耳机」，不算蚕食。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;strong&gt;排名页面频繁切换&lt;/strong&gt; ：搜某个词，今天排第 12 位的是产品 A，明天变产品 B，后天又换回来。这种「排名跳舞」是最典型的信号&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多个页面都卡在低位&lt;/strong&gt; ：3 个产品页都排在第 20 到 40 位之间，没有一个能冲进前 10。权重分散了，集中到一个页面很可能直接进前十&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高价值页面被截胡&lt;/strong&gt; ：精心优化的主打产品页没排上来，反而是内容单薄的变体页面拿到了展示——但它的转化率远不如主打页面&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;用 GSC 诊断&lt;a href=&quot;#用-gsc-诊断&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;操作步骤&lt;/strong&gt; ：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;打开 GSC 效果报告&lt;/li&gt;
&lt;li&gt;点击页面标签&lt;/li&gt;
&lt;li&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;ul&gt;
&lt;li&gt;只有一个 URL 稳定获得展示和点击：Google 已经做了选择，暂时不需要干预&lt;/li&gt;
&lt;li&gt;两个甚至更多 URL 交替出现：典型蚕食，需要处理&lt;/li&gt;
&lt;/ul&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;URL1&lt;/th&gt;&lt;th&gt;排名&lt;/th&gt;&lt;th&gt;展示量&lt;/th&gt;&lt;th&gt;URL2&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;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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; 。多个页面的 Title、H1、内链锚文本都在强化同一个词。解决方法是重新分配——每个 SKU 页面锚定一个带修饰语的中长尾词，大词交给品类页去打。&lt;/p&gt;&lt;section&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;把所有产品页当前定位或想要定位的关键词列出来。每个词标注：月搜索量、当前排名 URL、搜索意图、建议承接页面。&lt;/p&gt;&lt;p&gt;这张表是整个操作的基石，以后新增产品页之前先查这张表确认不冲突。&lt;/p&gt;&lt;/section&gt;&lt;section&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;最可靠的方法是看 SERP 排在前面的页面类型&lt;/strong&gt; 。&lt;/p&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;SERP 前列页面类型&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;wireless earbuds&lt;/td&gt;&lt;td&gt;亚马逊品类页、Best Buy 合集页、测评对比文章&lt;/td&gt;&lt;td&gt;浏览和比较&lt;/td&gt;&lt;td&gt;不应该用 SKU 页硬打&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AirPods Pro 2 price&lt;/td&gt;&lt;td&gt;单品页、价格比较页&lt;/td&gt;&lt;td&gt;交易型&lt;/td&gt;&lt;td&gt;适合产品页承接&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&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;/td&gt;&lt;td&gt;品牌词&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;品类页&lt;/td&gt;&lt;td&gt;搜索量大、意图偏浏览比较的大词&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;产品页&lt;/td&gt;&lt;td&gt;每个锚定一个带修饰语的中长尾词&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;博客页&lt;/td&gt;&lt;td&gt;信息型长尾词&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;页面层面拉开信号区隔&lt;a href=&quot;#页面层面拉开信号区隔&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. Title 必须独一无二&lt;a href=&quot;#1-title-必须独一无二&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Title 是 Google 判断页面主题最重要的信号&lt;/strong&gt; 。每个 SKU 页的 Title 必须包含各自不同的主词。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;错误：三个产品页 Title 都写着「某某品牌 无线耳机」
正确：X1 写「降噪无线耳机」，X2 写「运动防水耳机」，X3 写「超长续航耳机」&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. H1 和正文围绕各自主词&lt;a href=&quot;#2-h1-和正文围绕各自主词&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;H1 只放当前页面的主词&lt;/strong&gt; 。每个产品页正文至少要有 200 字以上的差异化内容——功能描述、适用人群、使用场景、独有参数。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;从博客或品类页链接到产品页时， &lt;strong&gt;锚文本应该用该产品页的主词&lt;/strong&gt; ，不是所有内链都用同一个大词。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;错误：三篇博客链接到三个产品页，锚文本都是「无线耳机」
正确：链接到 X1 用「降噪耳机」，链接到 X2 用「运动防水耳机」&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. URL 结构携带区分信号&lt;a href=&quot;#4-url-结构携带区分信号&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;URL 也是 Google 解读页面主题的参考信号&lt;/strong&gt; 。产品页 URL 包含各自的主词：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;正确：&lt;code&gt;/products/noise-cancelling-earbuds-x1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;错误：三个页面都用 &lt;code&gt;/products/wireless-earbuds-001&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;品类页承接大词：Topic Cluster 架构&lt;a href=&quot;#品类页承接大词topic-cluster-架构&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;品类页（中心节点）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├── 锚定大词&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├── 展示所有产品的概览、对比表格、选购指南&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;产品页（卫星节点）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├── 各自锚定长尾主词&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├── 页面底部有指向品类页的内链&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;博客内容（外围支撑）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└── 内链指向品类页和相关产品页&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这样形成一个以品类页为核心的主题集群。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;已经蚕食了怎么补救&lt;a href=&quot;#已经蚕食了怎么补救&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;调整 Title 去掉重复关键词&lt;/li&gt;
&lt;li&gt;修改正文聚焦自己的差异化卖点&lt;/li&gt;
&lt;li&gt;更新内链锚文本&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;策略二：Canonical 标签合并权重&lt;a href=&quot;#策略二canonical-标签合并权重&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;两个产品页内容高度相似（同一款产品不同颜色）， &lt;strong&gt;次要页面用 canonical 指向主力页面&lt;/strong&gt; 。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;注意：canonical 只是建议，Google 不一定百分百遵循。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;策略三：301 重定向收拢权重&lt;a href=&quot;#策略三301-重定向收拢权重&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;某些 SKU 页面内容重复、长期没有流量转化， &lt;strong&gt;直接 301 重定向到主力页面或品类页&lt;/strong&gt; 。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;301 是最强力的信号，原页面权重会传递到目标页面。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&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;两个页面互相打架不如把内容合并到一个页面。比如两个产品页介绍同一系列的两款耳机，合并成「某某系列耳机完全对比」页面。合并后用 301 重定向旧页面。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Shopify 筛选 URL 的蚕食隐患&lt;a href=&quot;#shopify-筛选-url-的蚕食隐患&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt; ：Shopify Collection 页面启用筛选功能，每种筛选条件组合都可能生成新 URL，内容跟原始 Collection 页面高度相似。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方法&lt;/strong&gt; ：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;确保筛选 URL 有正确的 canonical 指向原始页面&lt;/li&gt;
&lt;li&gt;或在 robots.txt 里屏蔽筛选参数路径&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;执行后的监控&lt;a href=&quot;#执行后的监控&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;频率&lt;/th&gt;&lt;th&gt;操作&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;每月&lt;/td&gt;&lt;td&gt;检查 GSC 中核心关键词的 URL 展示分布&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;排名大幅波动时&lt;/td&gt;&lt;td&gt;第一时间检查是否有新蚕食&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;每季度&lt;/td&gt;&lt;td&gt;做一次全站内链审计&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;补充说明&lt;/strong&gt; ：品类页和产品页都排在结果里不一定算蚕食。如果品类页排在第 3 位、产品页排在第 7 位，两者稳定共存，通常是好事——占了两个坑位。 &lt;strong&gt;只有排名互相拉扯此消彼长才需要干预&lt;/strong&gt; 。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;一句话总结&lt;/strong&gt; ：大词归品类页，SKU 页各自锚定一个带修饰语的长尾词，通过 Title、H1、正文、内链锚文本和 URL 把信号拉开。关键词蚕食不可怕，可怕的是不知道它正在发生。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>旧文章怎么改造？独立博客存量内容翻新实战</title><link>https://blog.moewah.com/posts/old-content-refresh-aeo-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/old-content-refresh-aeo-guide/</guid><description>存量内容已积累域名权重和外链，稍改结构就能让AI搜索主动引用。本文用Hub-Spoke模型组织主题，让片段可独立提取，答案前置解释后置，标题描述改成问题导向。</description><pubDate>Sun, 26 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;博客里那些两三年前写的文章，稍微改一改就能让 ChatGPT、Perplexity 主动引用。&lt;/p&gt;
&lt;p&gt;很多人盯着新内容——追热点、研究提示词。但如果你博客运营了一段时间， &lt;strong&gt;存量素材本身就是现成的金矿&lt;/strong&gt; 。这些页面已经积累了域名权重、外链、内部引用关系，不需要从零建立信任，只需要调整结构让 AI 能读懂、能提取。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;AI 搜索和传统搜索读取内容的方式不一样&lt;a href=&quot;#ai-搜索和传统搜索读取内容的方式不一样&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;对比维度&lt;/th&gt;&lt;th&gt;传统搜索（Google）&lt;/th&gt;&lt;th&gt;AI 搜索（ChatGPT/Gemini/Perplexity）&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;/td&gt;&lt;td&gt;把页面拆成小块&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;判断依据&lt;/td&gt;&lt;td&gt;内容质量、外链、E-E-A-T 信号&lt;/td&gt;&lt;td&gt;匹配用户问题&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;容错性&lt;/td&gt;&lt;td&gt;结构不完美也能靠其他信号拿排名&lt;/td&gt;&lt;td&gt;关键信息埋在长段落里就不被提取&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;这就带来一个现象：你某篇文章在 Google 排名挺好，但问 ChatGPT 同样的问题，它压根不引用你。 &lt;strong&gt;不是内容不好，是组织方式不对&lt;/strong&gt; ——关键信息埋在长段落里、标题不够明确、整篇文章得读完才能理解某个段落的意思。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三条改造原则&lt;a href=&quot;#三条改造原则&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 用 Hub-Spoke 结构组织主题&lt;a href=&quot;#1-用-hub-spoke-结构组织主题&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;/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; ：你博客有篇「如何选择 WordPress 主机」的老文章，流量还行。改造思路是把这篇长文章拆分成两部分—— &lt;strong&gt;汇总页&lt;/strong&gt; 概述选主机的几个维度（性能、价格、支持、扩展性），每个维度再拆成 &lt;strong&gt;细分页&lt;/strong&gt; 独立文章。&lt;/p&gt;&lt;p&gt;AI 需要回答「WordPress 主机怎么选」时，能从汇总页拿到框架，从细分页拿到具体建议。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;落地步骤&lt;/strong&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;li&gt;页面之间互相链接&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&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;strong&gt;AI 只提取单个片段&lt;/strong&gt; 。&lt;/p&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;/li&gt;
&lt;li&gt;&lt;strong&gt;标题直接写清楚这节回答什么&lt;/strong&gt; ：「主机选择技巧」→「WordPress 主机性能指标有哪些」&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;核心结论别埋在后面&lt;/strong&gt; ：段落开头直接给答案再展开解释&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;参考标准&lt;/strong&gt; ：每个片段大概 150-350 词。太短没上下文，太长会混进多个话题。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&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;p&gt;AI 搜索本质上是从多篇文章里抓片段拼成回答。如果你的内容天然适合抓取和拼装，被引用的概率就高。&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;文章开头可以加个要点速览或核心结论，把主旨压缩成几条，AI 很容易原样提取&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;元数据也得改&lt;a href=&quot;#元数据也得改&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;传统 SEO 思路是标题塞关键词吸引点击。AI 搜索思路是 &lt;strong&gt;标题告诉机器这个页面回答什么问题&lt;/strong&gt; 。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;改写公式&lt;/strong&gt; ：核心话题 + 具体覆盖的问题范围&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;改造前：「数据安全最佳实践」
改造后：「企业数据安全：常见风险类型和防护策略」&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&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;AI 会通过它理解页面定位&lt;/strong&gt; 。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;写法模板&lt;/strong&gt; ：谁在什么场景下 + 这篇文章提供什么帮助 + 覆盖几个要点&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;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;p&gt;&lt;strong&gt;不用改&lt;/strong&gt; ：纯新闻、活动报道、促销内容。AI 喜欢有长期参考价值的，这些时效性太强。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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; ：查流量、外链、内部引用情况；去 ChatGPT 或 Perplexity 试几个相关问题看有没有被引用&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; ：FAQ 内容加 FAQPage Schema，教程加 HowTo Schema&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保留深度&lt;/strong&gt; ：别为了清晰把内容简化成问答条目&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;观察效果&lt;/strong&gt; ：发布后观察流量变化和 AI 是否开始引用&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;/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;li&gt;&lt;strong&gt;第四层：多片段能拼在一起吗&lt;/strong&gt; ：如果 AI 从你不同文章抓三个片段拼答案，会打架还是互补&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第五层：能追溯到来源吗&lt;/strong&gt; ：AI 能明确说这段来自某篇文章吗，有清晰的署名日期吗&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;最容易出问题的是第三层&lt;/strong&gt; 。我们写文章习惯前后呼应，但 AI 只抓片段。检查时把每个章节单独看一遍，意思完整就没问题。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;/p&gt;&lt;p&gt;&lt;strong&gt;AI 相关指标新增&lt;/strong&gt; ：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;定期去 ChatGPT、Perplexity、Google AI Overview 试相关问题，记录有没有被引用、引用频率&lt;/li&gt;
&lt;li&gt;分析工具里关注来自 AI 平台的流量&lt;/li&gt;
&lt;li&gt;品牌搜索量变化——AI 先介绍你，用户再去搜验证，这是个间接信号&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;每月回顾一次，把效果好的改法总结成模板，效果不明显的分析原因调整。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;传统 SEO 和 AEO 不是对立的&lt;a href=&quot;#传统-seo-和-aeo-不是对立的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;SEO 和 AEO 的基础原则是一样的&lt;/strong&gt; ：高质量内容、清晰结构、良好体验、权威性建设。对 SEO 好的，大多数对 AEO 也好。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;差异在内容组织方式&lt;/strong&gt; ：传统 SEO 偏好全面深入的长文章，AEO 偏好清晰自洽、能独立提取的片段。&lt;/p&gt;&lt;p&gt;不是要放弃 SEO。两头都要顾。 &lt;strong&gt;存量内容改造就是最高效的协同路径&lt;/strong&gt; ——既保留排名基础，又适配 AI 提取方式。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;一句话总结&lt;/strong&gt; ：让内容以 AI 能提取的方式说出它一直在说的话。用 Hub-Spoke 结构组织主题，让每个片段意思完整，答案放前面解释放后面，标题描述改成问题导向——整个过程别丢掉内容的深度和独特性。&lt;/p&gt;&lt;p&gt;博客里那些沉睡的老文章，改一改就能在 AI 搜索时代重新派上用场。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>独立站 Google SEO：2026 爬虫预算与渲染优化实战</title><link>https://blog.moewah.com/posts/tech-seo-2026-crawl-budget-rendering/</link><guid isPermaLink="true">https://blog.moewah.com/posts/tech-seo-2026-crawl-budget-rendering/</guid><description>收录率从85%跌到42%，问题在哪？40%爬虫预算浪费在参数URL和死链上，CSR渲染让内容晚到3-10秒错过AI引用窗口。本文详解 Google 爬虫预算四大杀手、渲染预算新门槛、僵尸页面清理、内链网络建设、Canonical陷阱、EEAT信号——完整实操检查清单，帮助独立站和博客运营者在AI搜索时代被发现、被索引、被信任。</description><pubDate>Sat, 25 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;人人都知道修那些显眼的技术问题：死链、缺 meta 标签、页面速度慢。但技术 SEO 的真正难点不在那些地方。&lt;/p&gt;
&lt;p&gt;最近帮一个电商站做 SEO 诊断，收录率从 85% 掉到 42%。排查发现两个问题：爬虫预算浪费，40% 抓取额度丢在参数 URL 和死链；核心产品页用纯 CSR 渲染，内容比静态页晚到 3-5 秒。&lt;/p&gt;
&lt;p&gt;这两个问题在 2026 年更紧迫。爬虫预算不再是”大站专利”，渲染门槛也从”能不能跑 JS”变成了”跑得够不够快”。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&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;blockquote&gt;&lt;p&gt;&lt;strong&gt;爬虫预算 = 爬取速率限制 × 爬取需求&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Google 给你多少抓取额度，取决于服务器响应速度和网站质量。你有多少页面值得抓取，取决于内容的独特性和网站结构。&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;≤ 1,000 页&lt;/td&gt;&lt;td&gt;基本不需要优化&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;10,000+ 页&lt;/td&gt;&lt;td&gt;爬虫预算是生命线&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;但这个数字不是绝对的。如果有大量参数化 URL、无限滚动页面、历史版本页面，几千个页面也可能耗尽预算。&lt;/p&gt;&lt;p&gt;最典型的浪费场景：博客站点标签页比文章还多。每篇文章打 5 个标签，标签页数量是文章页的 5 倍。搜索引擎每天爬标签页，真正内容反而没被重视。&lt;/p&gt;&lt;section&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; 产品页的打印版本、带 session ID 的 URL、分页参数，这些都能让一个页面变出十几个「分身」。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第二，参数 URL。&lt;/strong&gt; &lt;code&gt;?sort=price&lt;/code&gt;、&lt;code&gt;?color=red&lt;/code&gt;、&lt;code&gt;?ref=homepage&lt;/code&gt;，这些参数不阻止爬虫，但会让爬虫在同一个内容上打转。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第三，重定向链。&lt;/strong&gt; A → B → C，每多一层重定向，爬虫就多一次「浪费」。Google 建议：直接链接到最终页面。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第四，死链和软 404。&lt;/strong&gt; 返回 200 状态码但内容为「找不到结果」的页面，是最隐蔽的爬虫预算黑洞。&lt;/p&gt;&lt;p&gt;2026 年的一个关键变化： &lt;strong&gt;Google 不再提供 URL 参数工具。&lt;/strong&gt; 之前你还能在 Search Console 里告诉 Google「忽略这个参数」，现在这个功能下线了。你得通过服务器端逻辑、robots.txt 或 canonical 标签来管理参数 URL。&lt;/p&gt;&lt;/section&gt;&lt;section&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;大多数人只看 Search Console 的爬取统计，但那只是 Google 想让你看到的。&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;（参数化URL、分页、搜索结果页）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Search Console 没报告的爬取错误&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;爬虫的真实访问频率&lt;/strong&gt;（产品页可能90天才爬一次）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我见过一个电商站，日志分析发现 40% 爬取预算花在筛选参数 URL 上，核心产品页反而被冷落。调整 robots.txt 后，产品页爬取频率翻了 4 倍，新产品从 3 周变成 2 天就能被索引。&lt;/p&gt;&lt;p&gt;日志分析工具可以用 &lt;a href=&quot;https://www.elastic.co/elastic-stack&quot; target=&quot;_blank&quot;&gt;Elastic Stack&lt;/a&gt;、&lt;a href=&quot;https://graylog.org&quot; target=&quot;_blank&quot;&gt;Graylog&lt;/a&gt;，或者 Semrush 的 &lt;a href=&quot;https://www.semrush.com/logfile-analyzer&quot; target=&quot;_blank&quot;&gt;Log File Analyzer&lt;/a&gt;。小站没有日志访问权限的话，至少用 &lt;a href=&quot;https://search.google.com/search-console&quot; target=&quot;_blank&quot;&gt;Search Console&lt;/a&gt; 的「爬取统计」看个大概。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;渲染预算：AI 时代的隐形门槛&lt;a href=&quot;#渲染预算ai-时代的隐形门槛&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;2026 年，「渲染预算」正在成为新的技术 SEO 概念。&lt;/p&gt;&lt;p&gt;搜索引擎和 AI 都需要「理解」页面内容。JavaScript 渲染的页面，搜索引擎要额外执行 JS，AI 更需要解析完整内容才能引用。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;这就是为什么静态输出越来越重要。&lt;/strong&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;SSR（服务端渲染）&lt;/th&gt;&lt;th&gt;CSR（客户端渲染）&lt;/th&gt;&lt;th&gt;SSG（静态生成）&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;/td&gt;&lt;td&gt;延迟 3-10 秒&lt;/td&gt;&lt;td&gt;立即&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SEO 可靠性&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;/td&gt;&lt;td&gt;中&lt;/td&gt;&lt;td&gt;低&lt;/td&gt;&lt;td&gt;低&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;SSR 仍是 SEO 最可靠的选择。&lt;/strong&gt; 原因很简单：爬虫拿到的 HTML 就是完整内容，不用等 JS 执行、不用等 API 请求、不用担心渲染延迟。&lt;/p&gt;&lt;p&gt;CSR 不是不能用，但你得接受一个现实： &lt;strong&gt;内容可能晚 3-10 秒才被索引。&lt;/strong&gt; 在 AI 搜索时代，这个延迟可能意味着你的内容错过「时效性窗口」。&lt;/p&gt;&lt;section&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;平均页面速度 2.5 秒看起来没问题，但分开看：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;首页 1.8 秒 ✓&lt;/li&gt;
&lt;li&gt;分类页 2.2 秒 ✓&lt;/li&gt;
&lt;li&gt;产品页 7.4 秒 ✗（问题）&lt;/li&gt;
&lt;li&gt;结账页 5.9 秒 ✗（转化杀手）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;平均值掩盖了关键页面的性能问题。&lt;/p&gt;&lt;p&gt;常见阻塞源：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;CSS 文件太多（12 个文件，每个都在阻塞渲染）&lt;/li&gt;
&lt;li&gt;JS 库冗余（8 个库，一半根本没用）&lt;/li&gt;
&lt;li&gt;字体加载阻塞内容显示&lt;/li&gt;
&lt;li&gt;分析脚本同步加载&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;诊断工具用 &lt;a href=&quot;https://www.webpagetest.org/&quot; target=&quot;_blank&quot;&gt;WebPageTest&lt;/a&gt;，比 Chrome DevTools 更详细。找出阻塞资源后，异步加载非关键的 JS/CSS，字体用 &lt;code&gt;font-display: swap&lt;/code&gt; 先显示备用字体。&lt;/p&gt;&lt;p&gt;AI 搜索还有一个特点：&lt;strong&gt;排名靠前的内容才有被引用的机会。&lt;/strong&gt; Kevin Indig 的研究发现，ChatGPT 检索结果中第 1 位页面引用率 58%，第 10 位只有 14%。差距 4 倍。&lt;/p&gt;&lt;p&gt;渲染慢、排名靠后，在 AI 搜索中等于不存在。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;ul&gt;
&lt;li&gt;&lt;strong&gt;GSC&lt;/strong&gt; ：16 个月无搜索曝光&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GA4&lt;/strong&gt; ：16 个月无访问&lt;/li&gt;
&lt;/ul&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;/tr&gt;&lt;/thead&gt;&lt;tbody&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;低价值 + 有入链&lt;/td&gt;&lt;td&gt;301 重定向到相关页面&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;无价值 + 无入链&lt;/td&gt;&lt;td&gt;410 状态码删除&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;很多人舍不得删页面，觉得「留着总比删了好」。这是个误区。僵尸页面占用爬虫预算、稀释网站权重、影响整体质量评分。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;410 比 404 更果断。&lt;/strong&gt; 404 是「暂时找不到」，410 是「已永久删除」。Google 处理 410 的速度更快，爬虫预算回收更彻底。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;每篇新内容至少 5 条内链。&lt;/strong&gt; 但很多人机械地「添加链接」，锚文本全是「点击这里」「了解更多」。这种内链没有权重传递价值。&lt;/p&gt;&lt;section&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;「爬虫预算优化的要点」（关键词锚文本）&lt;/li&gt;
&lt;li&gt;「之前的文章详细讲过这个」（自然语言锚文本）&lt;/li&gt;
&lt;li&gt;「这里」（功能性锚文本）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;比例大概 4:4:2。刻意堆砌精确关键词锚文本，反而可能触发过度优化惩罚。&lt;/p&gt;&lt;/section&gt;&lt;section&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;分页 URL（ &lt;code&gt;/page/2&lt;/code&gt; 、 &lt;code&gt;/page/3&lt;/code&gt; ）&lt;/li&gt;
&lt;li&gt;排序/筛选组合（ &lt;code&gt;?sort=price&lt;/code&gt; 、 &lt;code&gt;?color=red&lt;/code&gt; ）&lt;/li&gt;
&lt;li&gt;标签/归档页&lt;/li&gt;
&lt;li&gt;作者简介页&lt;/li&gt;
&lt;li&gt;日历页（ &lt;code&gt;/2024/01/&lt;/code&gt; 、 &lt;code&gt;/2024/02/&lt;/code&gt; ）&lt;/li&gt;
&lt;li&gt;站内搜索结果页&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这些页面能爬但价值低，内链指向它们等于把权重分散到不该去的地方。&lt;/p&gt;&lt;p&gt;审计方法：导出所有内链（Screaming Frog 或 Ahrefs），看哪些页面收到的内链最多。问自己一个问题： &lt;strong&gt;这些页面该有这么高权重吗？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;不该有的，用 noindex 或 301 重定向处理。该有高权重的核心内容页，补充内链。&lt;/p&gt;&lt;/section&gt;&lt;section&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;/p&gt;&lt;ul&gt;
&lt;li&gt;用 &lt;a href=&quot;https://search.google.com/search-console&quot; target=&quot;_blank&quot;&gt;GSC&lt;/a&gt;、&lt;a href=&quot;https://ahrefs.com/webmaster-tools&quot; target=&quot;_blank&quot;&gt;Ahrefs Webmaster Tools&lt;/a&gt;、&lt;a href=&quot;https://jetoctopus.com&quot; target=&quot;_blank&quot;&gt;Jet Octopus&lt;/a&gt;、&lt;a href=&quot;https://www.screamingfrog.co.uk/seo-spider&quot; target=&quot;_blank&quot;&gt;Screaming Frog&lt;/a&gt; 等工具导出所有 URL&lt;/li&gt;
&lt;li&gt;用爬虫日志对比，看哪些 URL 从未被爬取&lt;/li&gt;
&lt;li&gt;用内链分析工具找出入链为 0 的页面&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;处理方法：要么加内链，要么删除。留着不处理，就是浪费资源。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Hub 页面策略&lt;a href=&quot;#hub-页面策略&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Hub 页面是内链网络的主要节点，聚集话题、分发权重。&lt;/p&gt;&lt;p&gt;博客有 20 篇 SEO 文章，就创建「SEO 完全指南」的 Hub 页面，链接到这 20 篇，同时 20 篇也反向链接到 Hub。&lt;/p&gt;&lt;p&gt;Hub 页面特征：&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;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Canonical 陷阱：别踩坑&lt;a href=&quot;#canonical-陷阱别踩坑&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Canonical 是个容易被滥用的工具。我见过三种常见陷阱：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;陷阱一：链条 canonical&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A → B → C，每页都指向下一页的 canonical。正确做法是： &lt;strong&gt;所有页面直接指向最终 canonical。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;陷阱二：与 hreflang 冲突&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;页面 A 指向页面 B 的 canonical，但 hreflang 又声明页面 A 是英文版本。Google 会困惑。正确做法是： &lt;strong&gt;hreflang 指向 canonical 版本。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;陷阱三：与 noindex 冲突&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;一个页面同时有 &lt;code&gt;canonical&lt;/code&gt; 和 &lt;code&gt;noindex&lt;/code&gt;。这是自相矛盾的指令：canonical 说「内容在别处」，noindex 说「不要索引」。 &lt;strong&gt;二选一，不要同时使用。&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;移动端 viewport：桌面好看不等于手机好用&lt;a href=&quot;#移动端-viewport桌面好看不等于手机好用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Google 用移动端优先索引，但很多站点只在桌面调试。&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;li&gt;弹窗遮挡内容&lt;/li&gt;
&lt;li&gt;固定元素覆盖页面内容&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这些问题直接影响移动端用户体验，也影响排名。&lt;/p&gt;&lt;p&gt;用 Chrome DevTools 的移动端模拟器检查，或者真机测试。Google 的 &lt;a href=&quot;https://search.google.com/test/mobile-friendly&quot; target=&quot;_blank&quot;&gt;Mobile-Friendly Test&lt;/a&gt; 能快速诊断基础问题。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Schema markup：结构化数据的缺口&lt;a href=&quot;#schema-markup结构化数据的缺口&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;很多站点有基础 schema（Organization、WebSite），但漏掉了能赚富媒体摘要的机会：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;FAQ schema（问答内容，容易拿摘要）&lt;/li&gt;
&lt;li&gt;How-to schema（步骤类内容）&lt;/li&gt;
&lt;li&gt;Video schema（视频嵌入）&lt;/li&gt;
&lt;li&gt;Review schema（评价内容）&lt;/li&gt;
&lt;li&gt;BreadcrumbList（导航结构）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;富媒体摘要直接提升点击率。同样的排名位置，有摘要的点击率可能高 20-30%。&lt;/p&gt;&lt;p&gt;检查竞争对手用了什么 schema，用与不用两者间存在本质的差距。用 &lt;a href=&quot;https://search.google.com/test/rich-results&quot; target=&quot;_blank&quot;&gt;Google Schema Markup Tester&lt;/a&gt; 验证现有 schema 是否正确渲染。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;索引控制：noindex 和 robots.txt 不是一回事&lt;a href=&quot;#索引控制noindex-和-robotstxt-不是一回事&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;很多人分不清 noindex 和 robots.txt 的区别：&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;noindex&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;robots.txt&lt;/td&gt;&lt;td&gt;✗ 阻止爬取&lt;/td&gt;&lt;td&gt;可能保留&lt;/td&gt;&lt;td&gt;✗ 丢失&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;noindex 是「请勿索引」&lt;/strong&gt; ，爬虫仍然会访问页面、跟踪链接。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;robots.txt 是「请勿进入」&lt;/strong&gt; ，爬虫根本不访问页面。&lt;/p&gt;&lt;p&gt;什么时候用 &lt;code&gt;noindex, follow&lt;/code&gt;？感谢页、站内搜索结果、登录页、参数 URL 重复页。这些页面不需要出现在搜索结果里，但它们的链接价值要保留。&lt;/p&gt;&lt;p&gt;正确流程：先用 noindex 标记不需要索引的页面类型，等从索引消失后，再用 robots.txt 阻止爬取，彻底节省预算。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;sitemap 别塞垃圾&lt;a href=&quot;#sitemap-别塞垃圾&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;很多站点的 sitemap.xml 里塞了一堆不该放的东西：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;重定向后的 URL（最终地址才该放）&lt;/li&gt;
&lt;li&gt;noindex 的页面（自相矛盾）&lt;/li&gt;
&lt;li&gt;分页页面（价值低）&lt;/li&gt;
&lt;li&gt;canonical 指向别处的重复页&lt;/li&gt;
&lt;li&gt;低质量内容页&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;sitemap 应该只放： &lt;strong&gt;唯一、可索引、高价值的页面。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;清理 sitemap 不是小事。干净准确的 sitemap 让爬虫更快发现核心内容，浪费的 sitemap 让爬虫在你的垃圾页面里打转。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Disavow 工具：最后手段，不是日常任务&lt;a href=&quot;#disavow-工具最后手段不是日常任务&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Google 的 Disavow 工具是用来告诉 Google「忽略这些垃圾外链」的。很多人把它当日常维护工具，这是错的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;核心原则：Disavow 是最后手段，不是日常管理任务。&lt;/strong&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;/tr&gt;&lt;/thead&gt;&lt;tbody&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;负面 SEO 攻击&lt;/td&gt;&lt;td&gt;必须使用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;预防性使用&lt;/td&gt;&lt;td&gt;不推荐&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;日常维护&lt;/td&gt;&lt;td&gt;禁止&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;正常网站季度检查一次就够了。如果网站有过惩罚历史，可以月度检查。&lt;/p&gt;&lt;p&gt;不要一发现低质量外链就 disavow。Google 的算法已经能识别大部分垃圾外链，过度干预反而可能适得其反。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;EEAT：信任是核心&lt;a href=&quot;#eeat信任是核心&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Google 2025 年 9 月更新了 EEAT 定义，顺序变了：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Experience → Expertise → Authoritativeness → Trustworthiness&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;而且明确说： &lt;strong&gt;Trust 是其中最重要的。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;技术 SEO 只是基础。真正决定排名和 AI 引用的，是内容是否值得信任。&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;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;技术 SEO 2026 实操检查清单&lt;a href=&quot;#技术-seo-2026-实操检查清单&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;爬虫预算优化&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;统计网站总页面数，超过 10,000 需要优化&lt;/li&gt;
&lt;li&gt;识别并处理标签页、搜索结果页、参数化 URL&lt;/li&gt;
&lt;li&gt;用 noindex 标记不需要索引的页面类型&lt;/li&gt;
&lt;li&gt;等索引清除后，用 robots.txt 阻止爬取&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;渲染预算优化&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;检查核心内容是否在静态 HTML 中&lt;/li&gt;
&lt;li&gt;用「查看源代码」确认标题、正文可直接读取&lt;/li&gt;
&lt;li&gt;JS 渲染的内容，考虑静态输出或 SSR&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;内链网络优化&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;每篇新内容至少 5 条内链&lt;/li&gt;
&lt;li&gt;锚文本自然多样化，比例 4:4:2&lt;/li&gt;
&lt;li&gt;识别孤儿页面，添加内链或删除&lt;/li&gt;
&lt;li&gt;创建话题 Hub 页面，聚合相关内容&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;EEAT 信号建设&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;hr /&gt;&lt;/section&gt;
&lt;section&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;技术 SEO 在 2026 年的原则：让 Google 抓该抓的、看能看到的、信值得信的。&lt;/p&gt;&lt;p&gt;新手按这个顺序做：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;爬虫预算&lt;/strong&gt; ：Search Console 找浪费点，清理标签页、参数化 URL&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;页面渲染&lt;/strong&gt; ：核心页面用 SSR/SSG，确保源代码直接可读&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;僵尸页面&lt;/strong&gt; ：16 个月无数据用 410 删除，有外链用 301 保权重&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内链网络&lt;/strong&gt; ：核心内容至少 5 条内链，锚文本自然多样化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Canonical&lt;/strong&gt; ：一页只认一个正版，动态参数用 robots.txt 禁止&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;索引控制&lt;/strong&gt; ：noindex 和 robots.txt 别对同一页面发矛盾指令&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disavow&lt;/strong&gt; ：每季度检查一次，误判的好域名及时放出来&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EEAT&lt;/strong&gt; ：署名 + 作者简介 + 引用来源 + 更新记录&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;做完这些，至少保证「被发现的可能」。&lt;/p&gt;&lt;p&gt;还有几个容易被忽略的业务层面问题：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;页面排名词不匹配&lt;/strong&gt; （想排「CRM 软件」，实际排的是「CRM是什么」）&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; （staging 站点泄露）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;软 404&lt;/strong&gt; （返回 200 状态但内容是「找不到结果」）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这些直接影响业务结果，不只是技术分数。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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://developers.google.com/search/docs/crawling-indexing/large-site-managing-crawl-budget&quot; target=&quot;_blank&quot;&gt;Google 官方爬虫预算指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics&quot; target=&quot;_blank&quot;&gt;Google 渲染能力说明&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls&quot; target=&quot;_blank&quot;&gt;Canonical 标签最佳实践&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.google.com/webmasters/answer/2648487&quot; target=&quot;_blank&quot;&gt;Disavow 工具使用指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://guidelines.raterhub.com/searchqualityevaluatorguidelines.pdf&quot; target=&quot;_blank&quot;&gt;Google Search Quality Evaluator Guidelines&lt;/a&gt; - EEAT 官方定义（2025 年 9 月版）&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.airops.com/report/the-fan-out-effect-what-happens-between-a-query-and-a-citation&quot; target=&quot;_blank&quot;&gt;AirOps: The Fan-Out Effect&lt;/a&gt; - Kevin Indig 关于 AI 引用行为的研究&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.linkgraph.com/blog/crawl-budget-optimization-2/&quot; target=&quot;_blank&quot;&gt;LinkGraph: Crawl Budget Optimization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://linkstorm.io/resources/internal-linking-best-practices&quot; target=&quot;_blank&quot;&gt;Linkstorm: Internal Linking Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>Google Search Central Live 2026：AI 时代 SEO 的五个认知更新</title><link>https://blog.moewah.com/posts/google-search-central-live-2026-seo-insights/</link><guid isPermaLink="true">https://blog.moewah.com/posts/google-search-central-live-2026-seo-insights/</guid><description>2026 年 4 月 Google 多伦多 Search Central Live 透露的 SEO 认知修正：索引门槛提高而非降低、AIO 阻止机制真相、Trends API 一致缩放、Markdown 转换无 SEO 价值等关键更新</description><pubDate>Thu, 23 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;2026 年 4 月，Google 在多伦多举办首次加拿大 Search Central Live。官方展示的大量的幻灯片透露的并不是「新概念」，而是对现有认知的修正。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Google-Search-Central-Live-2026-1&quot; loading=&quot;lazy&quot; width=&quot;1276&quot; height=&quot;668&quot; src=&quot;/_astro/Google-Search-Central-Live-2026-1.BxKdk8CC_ADTSF.webp&quot; srcset=&quot;/_astro/Google-Search-Central-Live-2026-1.BxKdk8CC_Z9VXS9.webp 640w, /_astro/Google-Search-Central-Live-2026-1.BxKdk8CC_1G3tzC.webp 750w, /_astro/Google-Search-Central-Live-2026-1.BxKdk8CC_Z2oXND8.webp 828w, /_astro/Google-Search-Central-Live-2026-1.BxKdk8CC_h32K0.webp 1080w, /_astro/Google-Search-Central-Live-2026-1.BxKdk8CC_ADTSF.webp 1276w&quot; /&gt;&lt;figcaption&gt;Google-Search-Central-Live-2026-1&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&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;AI 降低创作门槛，反向推高索引门槛。&lt;/p&gt;&lt;p&gt;Google 不再「来者不拒」，而是通过 &lt;strong&gt;Selective Indexing&lt;/strong&gt; 主动选择哪些页面值得索引。内容容易生产 ≠ 内容容易被索引。这也意味着：内容工厂模式正在失效。规模化生产如果没有规模化价值，就会触发算法惩罚。AI 加速了内容生产，也加速了垃圾识别。&lt;/p&gt;&lt;section&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;已抓取——目前尚未被编入索引「Crawled – Currently not indexed」状态出现时，质量问题占大头（内容「不够好」、重复内容、canonical 冲突），技术问题只占少数（404、重定向、robots.txt）。&lt;/p&gt;&lt;p&gt;诊断优先级：先查质量，再查技术。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Google-Search-Central-Live-2026-2&quot; loading=&quot;lazy&quot; width=&quot;1112&quot; height=&quot;510&quot; src=&quot;/_astro/Google-Search-Central-Live-2026-2.B9ozN2At_S82xY.webp&quot; srcset=&quot;/_astro/Google-Search-Central-Live-2026-2.B9ozN2At_ZzlpYS.webp 640w, /_astro/Google-Search-Central-Live-2026-2.B9ozN2At_kcIzk.webp 750w, /_astro/Google-Search-Central-Live-2026-2.B9ozN2At_ZDakEg.webp 828w, /_astro/Google-Search-Central-Live-2026-2.B9ozN2At_SzNS7.webp 1080w, /_astro/Google-Search-Central-Live-2026-2.B9ozN2At_S82xY.webp 1112w&quot; /&gt;&lt;figcaption&gt;Google-Search-Central-Live-2026-2&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&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 内容流量下降，常被归因于「用了 AI」。但 Google 的算法逻辑是：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Scaled Content Abuse 算法&lt;/strong&gt; 针对的是「规模化产出」，不是「AI 产出」。内容复用不添加分析或上下文，构成 Scaled Content Abuse，若多个域名展现相似垃圾模式时，Google 可能将其视为单一网络施加惩罚。&lt;/p&gt;&lt;/blockquote&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;与是否使用 AI 无直接关联&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;诊断方法：检查内容生产模式是否规模化，而非是否使用 AI。若确认存在 Scaled Content Abuse 问题，恢复需要内容整合，而非逐页优化。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;二、AI Overview：fanouts 绕过了 bot 阻止&lt;a href=&quot;#二ai-overviewfanouts-绕过了-bot-阻止&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;很多人以为阻止 Google-Extended bot 就能阻止内容进入 AI Overview，这是误解。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Google-Search-Central-Live-2026-3&quot; loading=&quot;lazy&quot; width=&quot;1274&quot; height=&quot;705&quot; src=&quot;/_astro/Google-Search-Central-Live-2026-3.JzrlWoou_2j2a95.webp&quot; srcset=&quot;/_astro/Google-Search-Central-Live-2026-3.JzrlWoou_Kgh6k.webp 640w, /_astro/Google-Search-Central-Live-2026-3.JzrlWoou_t390O.webp 750w, /_astro/Google-Search-Central-Live-2026-3.JzrlWoou_Z2lbbn2.webp 828w, /_astro/Google-Search-Central-Live-2026-3.JzrlWoou_1q8uGJ.webp 1080w, /_astro/Google-Search-Central-Live-2026-3.JzrlWoou_2j2a95.webp 1274w&quot; /&gt;&lt;figcaption&gt;Google-Search-Central-Live-2026-3&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;section&gt;&lt;h3&gt;fanouts 与 grounding 的技术逻辑&lt;a href=&quot;#fanouts-与-grounding-的技术逻辑&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;一个提问触发 8-12 个并行子查询——即 fanouts。AI 通过它多角度交叉验证，综合输出答案。grounding 是 fanouts 的锚点——将生成内容「锚定」到可验证网页。没有它，AI「凭空说话」；有了它，每句回答有据可查。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;可以理解为 fanouts 是「尽职调查」，grounding 是「来源锚点」。两者共同决定了谁能出现在 AI 回答中。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;Google 的运作逻辑：&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;内容进入搜索索引 → 你已同意这个基础&lt;/li&gt;
&lt;li&gt;AIO 生成时，Google 通过 &lt;strong&gt;fanouts&lt;/strong&gt; 调用索引数据&lt;/li&gt;
&lt;li&gt;Google-Extended 只影响「grounding 和链接」，不影响「数据使用」&lt;/li&gt;
&lt;/ol&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;阻止 Google-Extended 的结果&lt;/strong&gt; ：失去引用/链接，但信息本身仍被使用。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&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;95% 的 fanout 查询在传统关键词工具中搜索量为零&lt;/li&gt;
&lt;li&gt;AI Overviews 覆盖约 47% 的 Google 搜索&lt;/li&gt;
&lt;li&gt;96% 的 AIO 引用携带 E-E-A-T 信号&lt;/li&gt;
&lt;li&gt;AI 偏好 40-60 字的「原子化答案块」&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;data nosnippet 的唯一有效性&lt;a href=&quot;#data-nosnippet-的唯一有效性&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;目前真正阻止特定内容被 AI 使用的方式只有一种：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;data nosnippet 是唯一有效阻止方式。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;代价：这是一把双刃剑。阻止内容被 AI 使用的同时，可能减少传统 SEO 效益（如 snippet 展示）。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Agentic Search 的适用范围&lt;a href=&quot;#agentic-search-的适用范围&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Agentic Search 的高级功能目前主要适用于电商领域。其他领域的 &lt;strong&gt;User Centric Productivity (UCP)&lt;/strong&gt; 之外，暂无高级 agentic 功能机会。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Google-Search-Central-Live-2026-5&quot; loading=&quot;lazy&quot; width=&quot;1204&quot; height=&quot;774&quot; src=&quot;/_astro/Google-Search-Central-Live-2026-5.BsmFdE9S_Z4UVqN.webp&quot; srcset=&quot;/_astro/Google-Search-Central-Live-2026-5.BsmFdE9S_1TfqnN.webp 640w, /_astro/Google-Search-Central-Live-2026-5.BsmFdE9S_zBll5.webp 750w, /_astro/Google-Search-Central-Live-2026-5.BsmFdE9S_1mqwGq.webp 828w, /_astro/Google-Search-Central-Live-2026-5.BsmFdE9S_1VDM1L.webp 1080w, /_astro/Google-Search-Central-Live-2026-5.BsmFdE9S_Z4UVqN.webp 1204w&quot; /&gt;&lt;figcaption&gt;Google-Search-Central-Live-2026-5&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三、Trends API：一致缩放解决了痛点&lt;a href=&quot;#三trends-api一致缩放解决了痛点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;API 更新让跨时间维度数据可比较。即将到来的 Trends API 更新解决了一个长期痛点：不同时间维度的数据无法统一比较。&lt;/p&gt;&lt;section&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;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;多搜索词查询&lt;/td&gt;&lt;td&gt;API 支持不同搜索词批量查询&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;一致缩放&lt;/td&gt;&lt;td&gt;结果按统一比例缩放，可跨维度比较&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Trends vs Keyword Planner 的区别&lt;a href=&quot;#trends-vs-keyword-planner-的区别&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;Trends&lt;/strong&gt; ：跨平台兴趣（YouTube + Search）、「Breakout」查询识别&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keyword Planner&lt;/strong&gt; ：搜索量预测、广告规划&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Trends 数据滞后 48 小时，目的是防止垃圾邮件发送者利用实时数据。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;四、SEO 误区：两件事被官方证伪&lt;a href=&quot;#四seo-误区两件事被官方证伪&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Markdown 转换和 llms.txt 对 SEO 无价值。&lt;/p&gt;&lt;p&gt;两个流行的「LLM 优化」做法，被 Google 直接回应：&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&lt;/td&gt;&lt;td&gt;对 LLM 或 SEO 没有好处&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;创建 llms.txt 文件&lt;/td&gt;&lt;td&gt;对 SEO 没有好处&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;blockquote&gt;&lt;p&gt;Google 的索引和处理机制不依赖这些格式。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;这意味着：内容优化应回归 SEO 本质（质量、结构、用户体验），而非追逐「LLM 专用格式」。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;Danny Sullivan 的论断&lt;a href=&quot;#danny-sullivan-的论断&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Google 搜索联络官 Danny Sullivan 重申：「 &lt;strong&gt;SEO for AI is still SEO&lt;/strong&gt; 」。&lt;/p&gt;&lt;p&gt;AI 搜索使用的排名信号与传统搜索一致。GEO (Generative Engine Optimization) 不是新学科，而是 SEO 的子集。那些宣称「AI 改变一切」的说法，要么是误解，要么是营销。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Google-Search-Central-Live-2026-4&quot; loading=&quot;lazy&quot; width=&quot;963&quot; height=&quot;559&quot; src=&quot;/_astro/Google-Search-Central-Live-2026-4.BO61CUyi_5jmm.webp&quot; srcset=&quot;/_astro/Google-Search-Central-Live-2026-4.BO61CUyi_Z1LY4gl.webp 640w, /_astro/Google-Search-Central-Live-2026-4.BO61CUyi_Z18pBaE.webp 750w, /_astro/Google-Search-Central-Live-2026-4.BO61CUyi_Z1edQrR.webp 828w, /_astro/Google-Search-Central-Live-2026-4.BO61CUyi_5jmm.webp 963w&quot; /&gt;&lt;figcaption&gt;Google-Search-Central-Live-2026-4&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;在 AI 搜索时代，SEO 从业者无需学习新框架。原有技能组合——关键词研究、意图对齐、技术优化、内容质量——仍然是成功的基础。AI 工具可用于内容起草，但人工审核不可省略，E-E-A-T 信号在 AI 搜索中权重更高，同时长尾查询将成为 AI 引用的主战场。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;五、待填补空白：AIO 追踪无时间表&lt;a href=&quot;#五待填补空白aio-追踪无时间表&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;AI Overview 追踪报告正在开发，但无发布时间。AI Overview 和 AI Mode 的追踪数据是目前 SEO 的空白区域。&lt;/p&gt;&lt;p&gt;Google 团队确认：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;正在开发 AIO 追踪功能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;未提供时间表&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这意味着：目前无法量化 AIO 对流量的影响，只能通过其他方式推测。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;Structured Data 的新机会点&lt;a href=&quot;#structured-data-的新机会点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Google-Search-Central-Live-2026-6&quot; loading=&quot;lazy&quot; width=&quot;1149&quot; height=&quot;644&quot; src=&quot;/_astro/Google-Search-Central-Live-2026-6.ZfRsuUro_11GTW7.webp&quot; srcset=&quot;/_astro/Google-Search-Central-Live-2026-6.ZfRsuUro_EFg1Y.webp 640w, /_astro/Google-Search-Central-Live-2026-6.ZfRsuUro_Z4TvGn.webp 750w, /_astro/Google-Search-Central-Live-2026-6.ZfRsuUro_1bBEiO.webp 828w, /_astro/Google-Search-Central-Live-2026-6.ZfRsuUro_Zr3Mkd.webp 1080w, /_astro/Google-Search-Central-Live-2026-6.ZfRsuUro_11GTW7.webp 1149w&quot; /&gt;&lt;figcaption&gt;Google-Search-Central-Live-2026-6&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Rich Results Testing Tool 与通用 Schema Testing App 的区别：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Rich Results Testing Tool&lt;/strong&gt; 接入 Google 内部索引栈，通用工具不具备。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;测试可信度差异：前者更接近 Google 实际处理逻辑。&lt;/p&gt;&lt;p&gt;新用例探索方向：电商领域的 Structured Data 应用（活动明确提到值得探索）。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;六、Gemini 的「塑造」差异&lt;a href=&quot;#六gemini-的塑造差异&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;AI Overview、AI Mode、Gemini App 使用同一模型，但输出不同。Google Search 对 Gemini 的「塑造」方式不同于独立应用，不要用 Gemini App 的表现来判断 AI Overview 的表现。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;总结：五个认知更新&lt;a href=&quot;#总结五个认知更新&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;




























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;认知维度&lt;/th&gt;&lt;th&gt;更新内容&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;索引门槛&lt;/td&gt;&lt;td&gt;AI 降低创作门槛 → Google 反向提高索引门槛&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;流量归因&lt;/td&gt;&lt;td&gt;流量下降源于「规模化」而非「AI」&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AIO 阻止&lt;/td&gt;&lt;td&gt;Google-Extended 无效 → data nosnippet 是唯一方式&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;API 能力&lt;/td&gt;&lt;td&gt;Trends API 支持一致缩放，跨维度可比较&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SEO 误区&lt;/td&gt;&lt;td&gt;Markdown 转换和 llms.txt 无 SEO 价值&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;这些更新并没有颠覆现有 SEO 逻辑，但修正了几个流行误解。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;基于本次 Search Central Live Toronto 活动的公开内容，得出如下结论：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;话题集群优于单页关键词优化。FAQ Schema 使页面被 AI 引用的概率提升 60%。AI 模型会「学会」信任早期信源，先发优势明显。被 AI 引用的品牌往往在多个平台同时出现。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;这里有一套可执行的行动框架：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;诊断优先&lt;/strong&gt;。检查 Search Console 中的索引错误，识别零流量页面，审查 E-E-A-T 信号完整性。问题通常在质量层而非技术层。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;内容升级&lt;/strong&gt;。关键词思维升级为话题集群思维。使用 Q&amp;amp;A 格式标题，在段落开头放置 40-60 字的原子化答案块——这是 AI 引用的「入口」。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;技术与信号&lt;/strong&gt;。实施 FAQ Schema（可使页面被 AI 引用的概率提升约 60%），确保移动端加载速度，配置 data-nosnippet 保护敏感信息。建立作者档案页、添加专家审核标记、引用一手来源、展示信任徽章，这些是 AI 引用的「入场券」。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;AI 搜索时代的优化是系统性工程。诊断、内容、技术、信号协同，才能建立可持续的可见性。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>AI内容会被Google惩罚吗？SEO争议背后的真相与策略</title><link>https://blog.moewah.com/posts/google-ai-content-seo-truth/</link><guid isPermaLink="true">https://blog.moewah.com/posts/google-ai-content-seo-truth/</guid><description>Google 不歧视 AI 内容本身，问题在于价值密度。本文揭示三个事实：Google 能识别但不一定惩罚，同质化内容不会被索引。如何破局？做 AI 做不了的事。</description><pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近在 LinkedIn 上看到一段讨论，关于 AI 内容当前在 Google 搜索引擎中的处境。&lt;/p&gt;
&lt;p&gt;观点不少，争议挺多。有人说 Google 会惩罚 AI 内容，有人说不一定。吵来吵去，核心问题反而被模糊了——Google 到底怎么看这件事？&lt;/p&gt;
&lt;p&gt;有些观点值得说清楚。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; width=&quot;2014&quot; height=&quot;1326&quot; src=&quot;/_astro/Google-SEO.Cy5OdRjN_ZUjYWP.webp&quot; srcset=&quot;/_astro/Google-SEO.Cy5OdRjN_2qdE5.webp 640w, /_astro/Google-SEO.Cy5OdRjN_vBbpy.webp 750w, /_astro/Google-SEO.Cy5OdRjN_Z1qV4gj.webp 828w, /_astro/Google-SEO.Cy5OdRjN_Z6vd5Y.webp 1080w, /_astro/Google-SEO.Cy5OdRjN_Z1LzwWQ.webp 1280w, /_astro/Google-SEO.Cy5OdRjN_ZX8K6b.webp 1668w, /_astro/Google-SEO.Cy5OdRjN_ZUjYWP.webp 2014w&quot; /&gt;&lt;/p&gt;
&lt;section&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;事实一：Google 不歧视 AI 内容本身。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;没有证据表明 Google 会因为是 AI 生成的就降权。问题从来不是”谁写的”，而是”写得好不好”。输出质量、价值密度、内容结构、发布策略——这些才是决定因素。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;事实二：Google 能识别 AI 内容。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;词频分布、句式模式，这些特征藏不住。但”能识别”和”会惩罚”是两回事。能看出来，不代表会动手。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;事实三：AI 内容容易被判定为”低努力”。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;什么情况下会被打上这个标签？三种：突然大规模发布，域名历史上从没这么干过；域名缺乏基础信任度；背后没有品牌背书。这三种情况叠加，AI 内容就成了可疑信号。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;/p&gt;&lt;p&gt;那图片呢？视频呢？多媒体内容呢？这些东西能支撑文章、提升体验，但 AI 内容往往只有大段文本。光这一点，就输了半截。&lt;/p&gt;&lt;p&gt;还有一个问题： &lt;strong&gt;AI 内容是在创造新价值，还是在重复已有内容？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这才是要害。Google 不需要在搜索结果里放 10 篇说同样话的文章。如果全网已经有 10000 个站点在讲同一件事，你的内容又没有增量价值，那 Google 根本不需要索引——更别提排名了。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Performance-on-Search-results&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;1309&quot; src=&quot;/_astro/Performance-on-Search-results.paBIupjD_1w3Bd4.webp&quot; srcset=&quot;/_astro/Performance-on-Search-results.paBIupjD_ZoReTu.webp 640w, /_astro/Performance-on-Search-results.paBIupjD_X0xoW.webp 750w, /_astro/Performance-on-Search-results.paBIupjD_Z2nPrK8.webp 828w, /_astro/Performance-on-Search-results.paBIupjD_2KVHR.webp 1080w, /_astro/Performance-on-Search-results.paBIupjD_1w3Bd4.webp 1280w&quot; /&gt;&lt;figcaption&gt;Performance-on-Search-results&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&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;当所有人都用 AI 生成内容，而 AI 又倾向于输出”最可能的回答”，结果就是大规模的内容雷同。Google 面对的是：同样的观点、同样的结构、同样的论据、同样的结论。&lt;/p&gt;&lt;p&gt;这种情况下，索引谁不索引谁？排名谁不排名谁？&lt;/p&gt;&lt;p&gt;Google 的选择很明确： &lt;strong&gt;不需要索引重复内容&lt;/strong&gt; 。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;一条路：做 AI 做不了的事。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;原创数据、一手采访、独特视角、个人经验——这些是 AI 难以生成的。用 AI 做”骨架”，用人填”血肉”，才是正解。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;另一条路：承认 AI 的边界。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;AI 擅长的是整理、归纳、表达清晰。不擅长的是突破、原创、带来新东西。把 AI 当工具，不是当替代。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;Google 不讨厌 AI 内容，Google 讨厌的是没有价值的内容。&lt;/p&gt;&lt;p&gt;AI 时代，这个判断标准反而更清晰了： &lt;strong&gt;你是在创造，还是在制造噪音？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;答案决定了你的页面是被索引，还是被自动忽略。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>网站排名没掉，流量没了：零点击搜索与 AI Overviews 的生存策略</title><link>https://blog.moewah.com/posts/zero-click-search-ai-overviews-strategy/</link><guid isPermaLink="true">https://blog.moewah.com/posts/zero-click-search-ai-overviews-strategy/</guid><description>排名正常但流量下滑？58.5%的搜索以零点击结束，AI Overviews 让点击率下降58%。本文教你诊断零点击问题、被 AI 引用的 CITABLE 框架，以及从流量导向转向品牌曝光的新 SEO 策略。</description><pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;最近在几个SEO群里，经常看到类似的困惑。&lt;/p&gt;&lt;p&gt;「我的关键词排名没变，但点击率一直在掉，是不是被降权了？」&lt;/p&gt;&lt;p&gt;有个做外贸独立站的朋友更直接：「半年前排名第一能拿300点击，现在同样的位置，只有100出头。」&lt;/p&gt;&lt;p&gt;不是算法更新，不是竞争对手抢位。&lt;/p&gt;&lt;p&gt;是用户根本不需要点进来了。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;section&gt;&lt;h3&gt;第一步：GSC 筛查&lt;a href=&quot;#第一步gsc-筛查&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;打开 Google Search Console → Performance → Queries。&lt;/p&gt;&lt;p&gt;筛选条件：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Position ≤ 10（前十名）&lt;/li&gt;
&lt;li&gt;CTR：低于 2%&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;结果列表里的关键词，就是典型的「零点击候选」——排名很好，但用户不点。&lt;/p&gt;&lt;/section&gt;&lt;section&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;看同一关键词的 Impressions（展示次数）和 Clicks（点击次数）曲线。&lt;/p&gt;&lt;p&gt;如果  &lt;strong&gt;展示上升或持平、点击持续下滑&lt;/strong&gt; ，大概率是 SERP 特征变化导致的——Featured Snippet、AI Overview、Knowledge Panel 都可能「截走」点击。&lt;/p&gt;&lt;p&gt;如果展示和点击同时下滑，那可能是排名掉了，不是零点击。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第三步：确认 SERP 特征&lt;a href=&quot;#第三步确认-serp-特征&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;手动搜索几个典型关键词，看 SERP 上有什么。&lt;/p&gt;&lt;p&gt;或者用 Ahrefs Site Explorer → Organic Keywords → SERP Features filter，筛选 “AI Overview”。&lt;/p&gt;&lt;p&gt;如果这些关键词确实触发 AI Overview，诊断就确认了。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;60%的搜索，零点击&lt;a href=&quot;#60的搜索零点击&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;SparkToro 创始人 Rand Fishkin 在 2024 年发布了一份基于 Semrush Datos 点击流数据的研究，结果很直接：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;美国 58.5% 的 Google 搜索、欧盟 59.7% 的搜索，以零点击结束。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;换句话说，每 10 次搜索里，只有不到 4 次会产生点击。而且这 4 次点击里，还有近 30% 流向 Google 自己的产品——YouTube、Google Maps、Google Images。&lt;/p&gt;&lt;p&gt;真正到达「开放网络」的点击，每 1000 次搜索里只有 360 次。&lt;/p&gt;&lt;p&gt;这不是 Google 的锅，也不是 SEO 已死的信号。&lt;/p&gt;&lt;p&gt;这是一种新的搜索行为模式。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;AI Overviews，加速器&lt;a href=&quot;#ai-overviews加速器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Ahrefs 在 2025 年 12 月更新了一组数据，更具体：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;当 AI Overview 出现在搜索结果中时，排名第一的页面点击率下降了约 58%。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;AI Overview 查询的零点击率达到 83%，远高于传统查询的 60%。&lt;/p&gt;&lt;p&gt;为什么？&lt;/p&gt;&lt;p&gt;因为 AI 已经把答案「合成」好了。&lt;/p&gt;&lt;p&gt;不同于 Featured Snippet 直接摘录网页内容，AI Overviews 会从多个来源提取信息，重新组织语言，给用户一个「完整」的回答。&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;hr /&gt;&lt;/section&gt;
&lt;section&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;看着 GSC 里的点击曲线一路向下，关键词排名稳如泰山，却只能眼睁睁看着流量蒸发。&lt;/p&gt;&lt;p&gt;很多 SEO 从业者还在用旧框架思考：排名上去 → 点击进来 → 转化落地。&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;p&gt;这意味着你的 KPI 需要变：从「点击量」变成「品牌曝光次数」。从「访问量」变成「被引用频率」。&lt;/p&gt;&lt;p&gt;听起来很虚对吧？&lt;/p&gt;&lt;p&gt;但仔细想想，当用户在 AI Overview 里看到你的品牌名称、你的观点被引用，那个印象是有真实价值的。&lt;/p&gt;&lt;p&gt;即使没有点击。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;具体怎么做：被 AI Overviews 引用&lt;a href=&quot;#具体怎么做被-ai-overviews-引用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;既然点击回不来了，那就换个思路：让 AI 引用你。&lt;/p&gt;&lt;p&gt;根据 xseek 的研究，使用 Article 和 FAQPage 结构化数据的页面，出现在 Featured Snippets 和 AI Overview 引用中的概率是普通页面的 2.3 倍。&lt;/p&gt;&lt;p&gt;这是最直接的技术优化入口。&lt;/p&gt;&lt;section&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;Schema Markup（JSON-LD 格式）&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;关键字段不能错：&lt;code&gt;datePublished&lt;/code&gt;、&lt;code&gt;@type&lt;/code&gt;、价格信息必须与页面可见内容一致。一个字段对不上，Google 的结构化数据处理管道就会触发「信任惩罚」。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;HTML 结构清晰&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;AI 需要知道你是谁。如果它无法确定你的品牌与竞争对手的区别，就算内容再好，也不会优先引用你。&lt;/p&gt;&lt;/section&gt;&lt;section&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;Discovered Labs 提出了一个 CITABLE 框架，核心是七件事：&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;strong&gt;C - Clear entity&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;开头明确告诉 AI 你是谁&lt;/td&gt;&lt;td&gt;「Ahrefs 是一款 SEO 工具，提供反向链接分析和关键词研究功能」&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;I - Inverted pyramid&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;结论前置 40-60 字，让 AI 能直接提取&lt;/td&gt;&lt;td&gt;「结构化数据可提升 AI 引用概率 2.3 倍」放在段落第一句&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;T - Trust signals&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;作者资质、引用来源、数据出处&lt;/td&gt;&lt;td&gt;「根据 SparkToro 2024 年研究……」而非「研究表明……」&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;A - Attribution pattern&lt;/strong&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;B - Blocks&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;用 200-400 字结构化段落，而非长段落&lt;/td&gt;&lt;td&gt;一个段落只讲一个观点，方便 AI 切片提取&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;L - Labeled data&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;关键数据用显式标签&lt;/td&gt;&lt;td&gt;「&lt;strong&gt;58.5%&lt;/strong&gt; 的搜索为零点击」而非「大多数搜索」&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;E - Entity-first&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;围绕实体写作，而非关键词堆砌&lt;/td&gt;&lt;td&gt;文章讲「Ahrefs 如何做关键词研究」，而非「关键词研究工具推荐」&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;简单说：写得像百科全书词条——清晰、准确、可验证、有来源。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;新 SEO 策略：品牌曝光 &amp;gt; 单纯流量&lt;a href=&quot;#新-seo-策略品牌曝光--单纯流量&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;p&gt;&lt;strong&gt;零点击时代，SEO 的核心任务不是「把人拉进来」，而是「让品牌被看到」。&lt;/strong&gt;&lt;/p&gt;&lt;section&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;直接访问（Direct Traffic）是否上升&lt;/li&gt;
&lt;li&gt;AI Overview 引用频率&lt;/li&gt;
&lt;li&gt;SERP 特征出现次数&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果品牌搜索量和直接访问在增长，即使点击下降，你的 SEO 也是有效的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;追踪 AI Overview 引用&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Ahrefs：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;Site Explorer → Organic Keywords&lt;/li&gt;
&lt;li&gt;SERP Features filter → 勾选 “AI Overview”&lt;/li&gt;
&lt;li&gt;查看哪些关键词触发 AI Overview，以及你的页面是否被引用&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Semrush：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;Position Tracking → 添加目标关键词&lt;/li&gt;
&lt;li&gt;SERP Features 列会显示 AI Overview 标记&lt;/li&gt;
&lt;li&gt;或用 Domain Overview → Organic Rankings → 篮选 AI Overview 关键词&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;手动检查&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;搜索你的目标关键词，看 AI Overview 是否出现，以及引用来源里有没有你的域名。&lt;/p&gt;&lt;p&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;原创研究、数据驱动内容、交互式工具——这些 AI 无法完全替代的内容类型，价值在上升。&lt;/p&gt;&lt;p&gt;纯信息类内容，比如「什么是 XX」「XX 怎么用」，会越来越多被 AI 直接回答。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;品牌实体建设&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;增加品牌提及（无论是否有链接）、保持一致的品牌信息、提升在垂直领域的权威性。&lt;/p&gt;&lt;p&gt;这些是 AI 引用的关键信号。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;p&gt;期待流量回到 2020 年的水平，就像期待智能手机消失一样不现实。&lt;/p&gt;&lt;p&gt;但换个角度想：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;当用户在 AI Overview 里看到你的观点、记住你的品牌，你其实已经在转化漏斗里了。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;只是这个漏斗，不再从点击开始。&lt;/p&gt;&lt;p&gt;从曝光开始。&lt;/p&gt;&lt;p&gt;这是一个更长的游戏，但玩得好的人，护城河会更深。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;SparkToro：&lt;a href=&quot;https://sparktoro.com/blog/2024-zero-click-search-study-for-every-1000-us-google-searches-only-374-clicks-go-to-the-open-web-in-the-eu-its-360/&quot; target=&quot;_blank&quot;&gt;2024 Zero-Click Search Study&lt;/a&gt;（Rand Fishkin，基于 Semrush Datos 数据）&lt;/li&gt;
&lt;li&gt;Ahrefs：&lt;a href=&quot;https://ahrefs.com/blog/ai-overviews-reduce-clicks-update/&quot; target=&quot;_blank&quot;&gt;Update: AI Overviews Reduce Clicks by 58%&lt;/a&gt;（2025 年 12 月）&lt;/li&gt;
&lt;li&gt;xseek：&lt;a href=&quot;https://www.xseek.io/learnings/how-does-structured-data-boost-ai-search-visibility&quot; target=&quot;_blank&quot;&gt;Structured Data for AI Search: How Schema Markup Drives 40% More AI Citations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Discovered Labs：&lt;a href=&quot;https://discoveredlabs.com/blog/citable-the-aeo-content-framework-we-use-to-get-b2b-brands-cited-by-ai&quot; target=&quot;_blank&quot;&gt;CITABLE: The AEO Content Framework&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>权力的48条法则：职场生存攻防手册</title><link>https://blog.moewah.com/posts/workplace-power-48-laws-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/workplace-power-48-laws-guide/</guid><description>罗伯特·格林《权力的48条法则》职场解读，涵盖进攻、防御、操控、生存四大维度的实战案例，助你识别职场操控行为，在权力游戏中保护自己。</description><pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;有一本书，被誉为「职场版的《孙子兵法》」。&lt;/p&gt;
&lt;p&gt;有些老板禁止员工读它，有些高管偷偷把它放在床头。它撕开职场道德的面纱，把权力游戏的底层逻辑摊在阳光下——罗伯特·格林的《权力的48条法则》。&lt;/p&gt;
&lt;p&gt;格林说得直白：权力无处不在。你无视它，只会成为别人的棋子。&lt;/p&gt;
&lt;p&gt;把权力法则当作 &lt;strong&gt;防御工具&lt;/strong&gt; ——识别他人的操控行为——比当作进攻武器更可持续。读懂它，是为了不被玩。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;进攻法则（如何积累权力）&lt;a href=&quot;#进攻法则如何积累权力&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;blockquote&gt;&lt;p&gt;Never Outshine the Master&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：你的光芒不应盖过上级。让他们显得更聪明、更有能力，你才能安全地获得信任和支持。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：项目汇报时，将关键成果归功于领导的指导。即便大部分工作是你完成的，这能让你获得青睐和更多机会。&lt;/p&gt;&lt;/section&gt;&lt;section&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;blockquote&gt;&lt;p&gt;Conceal Your Intentions&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：让人猜不透你的下一步，你才能掌控局势。过早暴露目标，等于把武器交给对手。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：跳槽谈判时，不要一开始就亮出底牌。先让对方说明条件，再决定是否透露你的期望薪资。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则6：不惜一切代价引起注意&lt;a href=&quot;#法则6不惜一切代价引起注意&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Court Attention at All Cost&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：默默无闻等于不存在。被看见，才有机会。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：主动承担跨部门项目，或在会议上提出关键问题。让决策层记住你的名字。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则7：让别人为你工作，你拿荣誉&lt;a href=&quot;#法则7让别人为你工作你拿荣誉&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Get Others to Do the Work for You, but Always Take the Credit&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：借力使力。你不必亲力亲为每件事，但你要确保成果归你所有。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：作为项目经理，协调各方资源完成任务。汇报时由你统一呈现，体现你的统筹能力。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则8：让别人来找你——必要时用诱饵&lt;a href=&quot;#法则8让别人来找你必要时用诱饵&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Make Other People Come to You — Use Bait if Necessary&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：主动权在你手中，你才能谈判。追着别人跑，永远是被动方。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：面试时不要表现得太急切。让HR觉得你是被争抢的人才，薪资谈判时你才有筹码。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则11：让人依赖你&lt;a href=&quot;#法则11让人依赖你&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Make People Dependent on You&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：被需要等于拥有权力。没有你，事情就运转不下去——这就是安全感。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：掌握一项团队里只有你会的核心技能（如特定系统操作、客户关系、技术栈）。裁员时，你是最后一个被考虑的人。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则12：用选择性诚实解除对方武装&lt;a href=&quot;#法则12用选择性诚实解除对方武装&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Use Selective Honesty and Generosity to Disarm Your Victim&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：真诚是最好的欺骗。先示好、示弱，对方会放下戒备，你再出手。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：谈判时先主动承认一个无关紧要的弱点，对方会认为你诚实，从而降低对你关键信息的警觉。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则15：彻底击败敌人&lt;a href=&quot;#法则15彻底击败敌人&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Crush Your Enemy Totally&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：留后患等于自找麻烦。敌人只要还有一口气，就会找机会反击。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：竞争同一个晋升名额，一旦你胜出，就不要再给对方任何翻盘的机会。调离他的核心项目，切断他的资源。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则23：集中你的力量&lt;a href=&quot;#法则23集中你的力量&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Concentrate Your Forces&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：分散等于稀释。把资源集中在最关键的目标上，一击必中。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：与其同时做三个边缘项目，不如全力攻克一个核心项目。年终考核时，一个亮点成果比三个平庸项目更有说服力。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则28：行动要大胆&lt;a href=&quot;#法则28行动要大胆&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Enter Action with Boldness&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：犹豫等于失败。大胆的行动会让人觉得你胸有成竹，即使你内心在打鼓。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：提出激进方案时，语调坚定、数据充分。领导会认为你经过深思熟虑，而不是临时起意。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则33：发现每个人的弱点&lt;a href=&quot;#法则33发现每个人的弱点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Discover Each Man’s Thumbscrew&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：每个人都有软肋——贪婪、虚荣、恐惧、不安全感。找到它，你就能影响他。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：你的同事渴望被认可，那你就在公开场合多提他的贡献。他以后会主动站在你这边。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则42：打击牧羊人，羊群就会散开&lt;a href=&quot;#法则42打击牧羊人羊群就会散开&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Strike the Shepherd and the Sheep Will Scatter&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：针对领导者。首领倒下，追随者自然溃散。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：部门内斗时，不要和对方的手下纠缠。直接解决带头人，其他人自然瓦解。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;防御法则（如何保护权力）&lt;a href=&quot;#防御法则如何保护权力&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;blockquote&gt;&lt;p&gt;Never Put Too Much Trust in Friends, Learn How to Use Enemies&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：朋友可能因嫉妒背叛，敌人反而更渴望证明忠诚——他有机会才会被你招安。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：曾经的竞争对手加入你的团队后，往往比老同事更卖力。因为他需要证明自己值得被信任。&lt;/p&gt;&lt;/section&gt;&lt;section&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;blockquote&gt;&lt;p&gt;Always Say Less Than Necessary&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：言多必失。沉默让对方焦虑，主动暴露更多信息。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：被问及敏感问题时，简短回答后停顿。对方往往会主动填补沉默，说出更多本不想透露的信息。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则5：名誉是一切，不惜代价保护它&lt;a href=&quot;#法则5名誉是一切不惜代价保护它&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;So Much Depends on Reputation — Guard It with Your Life&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：名誉是权力的基石。一旦受损，重建几乎不可能。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：不要参与办公室八卦，不要在公开场合说同事坏话。你永远不知道这些话会传到谁耳朵里。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则9：用行动而非争论赢得胜利&lt;a href=&quot;#法则9用行动而非争论赢得胜利&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Win Through Your Actions, Never Through Argument&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：争论没有赢家，只会加深对立。用结果说话。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：同事质疑你的方案不可行，不要辩论。直接做出原型或数据证明，对方自然闭嘴。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则14：像间谍一样试探朋友，识别敌人&lt;a href=&quot;#法则14像间谍一样试探朋友识别敌人&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Pose as a Friend, Work as a Spy&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：知己知彼。了解每个人的真实立场，你才能制定策略。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：茶水间闲聊时，问一些看似随意的问题。对方可能在放松状态下透露真实想法。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则16：用缺席增加尊重和荣誉&lt;a href=&quot;#法则16用缺席增加尊重和荣誉&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Use Absence to Increase Respect and Honor&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：稀缺等于价值。你总是随叫随到，别人就会习以为常。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：不是每次会议都抢着发言，不是每个请求都秒回。偶尔的缺席，会让你的出现更有分量。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则17：用不可预测保持他人恐惧&lt;a href=&quot;#法则17用不可预测保持他人恐惧&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Keep Others in Suspended Terror: Cultivate an Air of Unpredictability&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：可预测等于可控。偶尔的出其不意，让人不敢轻易算计你。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：一向温和的你偶尔在关键问题上强硬表态，同事会重新评估你的边界。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则18：不要筑起堡垒——孤立是危险的&lt;a href=&quot;#法则18不要筑起堡垒孤立是危险的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Do Not Build Fortresses to Protect Yourself — Isolation Is Dangerous&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：信息即权力。孤立意味着信息断裂，你会在不知不觉中出局。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：不要只埋头做事。保持和不同部门同事的连接，你才能在第一时间知道公司动向。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则19：知道你在和谁打交道&lt;a href=&quot;#法则19知道你在和谁打交道&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Know Who You’re Dealing with — Do Not Offend the Wrong Person&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：认清对手。得罪错了人，后果可能远超你的想象。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：得罪一个普通同事，可能只是冷战。得罪老板的亲信，你可能被边缘化而不自知。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则21：对傻瓜装傻&lt;a href=&quot;#法则21对傻瓜装傻&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Play a Sucker to Catch a Sucker — Seem Dumber Than Your Mark&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：让他人低估你，是最安全的位置。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：新入职时，多问问题，少发表意见。等你看清局势再出手，比一上来就锋芒毕露更安全。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则26：保持双手干净&lt;a href=&quot;#法则26保持双手干净&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Keep Your Hands Clean&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：脏活让别人做。你负责发号施令，出了问题有人替你背锅。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：敏感项目不要亲自动手。让外包或临时工执行，你只负责「监督」。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则36：鄙视你得不到的东西&lt;a href=&quot;#法则36鄙视你得不到的东西&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Disdain Things You Cannot Have: Ignoring Them Is the Best Revenge&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：酸葡萄是心理防御。表现出不在乎，对方就无法用这件事伤害你。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：没有争取到的项目，不要表现出失落。轻描淡写地说「可能不太适合我」，对方无法拿这件事嘲讽你。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则40：警惕免费午餐&lt;a href=&quot;#法则40警惕免费午餐&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Despise the Free Lunch&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：免费的东西最贵。背后总有账单——人情、把柄、或隐形成本。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：同事请你吃饭又帮你做事，后来他请你帮忙时你很难拒绝。免费的背后是人情债。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则46：永远不要显得完美&lt;a href=&quot;#法则46永远不要显得完美&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Never Appear Too Perfect&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：完美等于威胁。偶尔暴露无伤大雅的缺点，能降低他人的戒心。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：能力出众的同事，主动承认自己「不太会做饭」或「方向感差」。这些小缺点让人感觉更亲近，减少嫉妒。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则47：勿逾所定目标，胜中适止&lt;a href=&quot;#法则47勿逾所定目标胜中适止&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Do Not Go Past the Mark You Aimed for; In Victory, Learn When to Stop&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：贪心导致翻盘。赢了就该收手，继续追击可能引发反扑。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：在争论中占了上风就适可而止。继续穷追猛打，对方可能翻脸，反而让你失去更多。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;操控法则（如何影响他人）&lt;a href=&quot;#操控法则如何影响他人&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;法则10：避开不快乐和不幸的人&lt;a href=&quot;#法则10避开不快乐和不幸的人&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Infection: Avoid the Unhappy and Unlucky&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：情绪会传染。和消极的人在一起，你也会变得消极。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：少和总是抱怨的同事待在一起。他的负能量会影响你的判断，也会让领导觉得你也是「那类人」。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则13：求助时诉诸对方利益，而非怜悯&lt;a href=&quot;#法则13求助时诉诸对方利益而非怜悯&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;When Asking for Help, Appeal to People’s Self-Interest, Never to Their Mercy&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：利益驱动行为。说「你能得到什么」，不说「我有多难」。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：请同事帮忙时，强调这件事对他的好处，而不是你有多着急。他会更愿意出手。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则22：用投降策略把弱势转化为优势&lt;a href=&quot;#法则22用投降策略把弱势转化为优势&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Use the Surrender Tactic: Transform Weakness into Power&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：以退为进。承认失败，保存实力，等待时机反击。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：项目中你处于劣势，不要硬拼。主动示弱、配合对方，等他松懈或犯错时再出手。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则24：扮演完美的朝臣&lt;a href=&quot;#法则24扮演完美的朝臣&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Play the Perfect Courtier&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：学会权谋的艺术。察言观色、见风使舵、在复杂关系中游刃有余。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：不同领导有不同偏好。有的喜欢直接汇报，有的喜欢走流程。摸清每个人的风格，你才能左右逢源。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则27：利用人们的信仰需求，创建追随者&lt;a href=&quot;#法则27利用人们的信仰需求创建追随者&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Create a Cult-like Following&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：人们渴望被引导。提供愿景和归属感，他们会追随你。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：团队领导通过描绘「我们一起在做一件大事」来凝聚人心。成员会为这个愿景付出更多。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则30：让成就看起来毫不费力&lt;a href=&quot;#法则30让成就看起来毫不费力&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Make Your Accomplishments Seem Effortless&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：轻松等于能力。让人看到你的成果，但不要让他们看到你有多努力。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：加班到凌晨完成项目，汇报时说「挺顺利的」。让人以为你游刃有余，而不是能力不足需要加班。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则31：控制选项——让别人玩你发的牌&lt;a href=&quot;#法则31控制选项让别人玩你发的牌&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Control the Options: Get Others to Play with the Cards You Deal&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：让对方「自己选择」你安排的选项。无论他选哪个，都在你的掌控之中。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：给老板两个方案，一个有明显的缺陷，另一个是你真正推荐的。老板会「自己选择」你想要的方案。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则32：利用人们的幻想&lt;a href=&quot;#法则32利用人们的幻想&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Play to People’s Fantasies&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：人们愿意相信自己想相信的。顺着他们的幻想，你就能影响他们。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：下属想晋升，你告诉他「按照这个方向努力，明年有机会」。他因此更卖力，即使你不一定真的打算提拔他。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则34：像国王一样以尊严对待自己&lt;a href=&quot;#法则34像国王一样以尊严对待自己&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Be Royal in Your Own Fashion: Act Like a King to Be Treated Like One&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：你如何对待自己，决定他人如何对待你。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：穿着得体、言行自信，同事自然会尊重你。如果你自己都不当回事，别人更不会。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则37：创造引人注目的场面&lt;a href=&quot;#法则37创造引人注目的场面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Create Compelling Spectacles&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：戏剧性等于影响力。用视觉化的方式呈现你的成果。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：年终汇报时，不只列数据，还用图表、视频、实物展示。领导和同事会记住你的呈现方式。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则43：致力于他人的心和思想&lt;a href=&quot;#法则43致力于他人的心和思想&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Work on the Hearts and Minds of Others&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：情感比武力更持久。赢得人心，你才能真正站稳脚跟。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：管理下属时，不只下达命令，还关心他们的成长和需求。他们会在关键时刻支持你。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则44：用镜子效应解除武装并激怒敌人&lt;a href=&quot;#法则44用镜子效应解除武装并激怒敌人&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Disarm and Infuriate with the Mirror Effect&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：模仿对方的行为，让他看到自己的影子。他会因此困惑或愤怒，失去判断力。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：对方咄咄逼人时，你用同样的语调和节奏回应。他可能会意识到自己的无礼，或因被镜像而恼羞成怒。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则45：鼓吹改变，但不要一次改变太多&lt;a href=&quot;#法则45鼓吹改变但不要一次改变太多&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Preach the Need for Change, but Never Reform Too Much at Once&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：激进改革会引发恐慌。渐进式改变，让人更容易接受。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：空降领导第一年只做小调整，等团队适应后再推行大变革。阻力会小很多。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;生存法则（如何在权力游戏中存活）&lt;a href=&quot;#生存法则如何在权力游戏中存活&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;法则20：不要对任何人承诺&lt;a href=&quot;#法则20不要对任何人承诺&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Do Not Commit to Anyone&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：承诺是枷锁。保持独立，你才能在局势变化时灵活应对。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：站队时不要彻底倒向任何一方。今天的朋友可能是明天的对手，保持一定距离更安全。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则25：重塑自己&lt;a href=&quot;#法则25重塑自己&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Re-create Yourself&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：不要让过去定义你。主动塑造形象，适应新环境。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：换工作时，重新设计你的人设。新公司没有人知道你的过去，你可以成为任何人。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则29：计划到底，但行动时显得随意&lt;a href=&quot;#法则29计划到底但行动时显得随意&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Plan All the Way to the End&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：深思熟虑+自然流畅。准备充分，但执行时看起来像临时起意。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：你在会议上「随口」提出的建议，其实是事前反复推敲过的。看似随意，实则有备而来。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则35：掌握时机的艺术&lt;a href=&quot;#法则35掌握时机的艺术&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Master the Art of Timing&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：时机决定成败。同样的行动，在不同时间点效果截然不同。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：在领导心情好的时候提加薪，比在他焦虑时提更可能成功。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则38：随大流思考，但表现独立&lt;a href=&quot;#法则38随大流思考但表现独立&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Think as You Like but Behave Like Others&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：合群+独特=安全+出众。内心保持独立，外表融入群体。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：你内心不认同公司的某些做法，但表面配合。等你积累足够实力，再按自己的方式做事。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则39：搅动水面以捕获鱼&lt;a href=&quot;#法则39搅动水面以捕获鱼&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Stir Up Waters to Catch Fish&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：制造混乱，从中获利。局势动荡时，更容易重新分配资源。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：部门重组时主动提出新方案。混乱中，你的提议更容易被采纳。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则41：避免踩进伟人的足迹&lt;a href=&quot;#法则41避免踩进伟人的足迹&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Avoid Stepping into a Great Man’s Shoes&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：无法超越，另辟蹊径。接替一个传奇人物，你只会被比较。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：不要接手一个极其成功的项目，因为很难超越前任。相反，选择一个有挑战的新项目，做出自己的成绩。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;法则48：假设无形无相&lt;a href=&quot;#法则48假设无形无相&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;Assume Formlessness&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;解释&lt;/strong&gt; ：灵活适应，无迹可寻。不让任何人摸透你的套路。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场案例&lt;/strong&gt; ：你的策略和方法不断变化。对手以为掌握了你的规律，你已经换了打法。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;/p&gt;&lt;p&gt;&lt;strong&gt;启示二：利益驱动一切&lt;/strong&gt; ——求人时说「你能得到什么」，不说「我有多难」。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;启示三：让人依赖你&lt;/strong&gt; ——被需要比需要别人安全。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;启示四：控制选择而非控制人&lt;/strong&gt; ——让别人「自己选择」你安排的选项。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;启示五：被低估是最安全的位置&lt;/strong&gt; ——偶尔犯错降低威胁感，才有空间行动。&lt;/p&gt;&lt;p&gt;这些法则有效的前提是你仍在「规则内游戏」。当你遇到完全不按规则出牌的人（比如恶意抢功、背后捅刀），防御法则比进攻法则更重要。 &lt;strong&gt;识别毒性环境，有时比学会操控环境更有价值。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;但这不意味着你要变成你最警惕的那种人。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;这本书的视角是纯粹的工具主义。它教你「如何赢」，不教「该不该玩」。法则有效。但长期信任和声誉的建立，还需要正直作为底座。&lt;/p&gt;&lt;p&gt;把权力法则当作 &lt;strong&gt;防御工具&lt;/strong&gt; ——识别他人的操控行为——比当作进攻武器更可持续。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;读懂它，是为了不被玩。不是为了去玩别人。&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;延伸阅读&lt;/strong&gt; ：《君主论》马基雅维利、《人性的弱点》卡耐基、《孙子兵法》&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Google SEO 优化 2026：从架构到外链的 11 个检查点</title><link>https://blog.moewah.com/posts/google-seo-checklist-2026/</link><guid isPermaLink="true">https://blog.moewah.com/posts/google-seo-checklist-2026/</guid><description>从海外 SEO 实战案例拆解出的完整检查清单，涵盖技术架构迁移、URL清理、索引控制、锚文本优化、内容审计等11个核心环节。适合初学者对照排查，避开常见坑点。</description><pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近刷 X，看到其中一位海外老哥分享了他自己的一个 SEO 案例——20 多项优化动作，目睹了一个网站从「半死不活」变成了「有机增长」的整个过程。&lt;/p&gt;
&lt;p&gt;说实话，这些动作本身不算惊天动地。框架迁移、URL 清理、索引控制……都是很基础的 SEO 操作。但把它们串起来，按顺序执行，效果就出来了。&lt;/p&gt;
&lt;p&gt;我将这个案例拆解后，加上术语解释和判断标准，整理成这份清单。如果你刚入门 SEO 想用自己个人博客站点练练手，对照着下面的步骤排查一遍，能避开不少坑。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&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;从  Angular/Pre-render + Cloudflare Workers 迁移到 Next.js + Netlify。&lt;/p&gt;&lt;p&gt;Angular 是 Google 出的框架，功能强大但渲染慢。Pre-render 是「预渲染」，提前把页面生成静态文件。Cloudflare Workers 是边缘计算，在离用户最近的服务器处理请求。每打开一个页面，JavaScript 都要先跑一遍才能显示内容。这也导致了页面加载慢、渲染依赖 JS，爬虫可能直接放弃，用户也等不及。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt; ：换成 Next.js。这是 React 框架的升级版，能直接输出 HTML 文件。页面加载快了，爬虫能直接读内容，排名自然上去。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;二、URL 瘦身：删掉没人要的页面&lt;a href=&quot;#二url-瘦身删掉没人要的页面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;100 个高质量页面抵得上 1 万个垃圾页。程序化 SEO 批量生成，90% 的页面要是没实质价值，做越多反而越伤排名。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;判断页面该不该删，看两个数据：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://search.google.com/search-console/about&quot; target=&quot;_blank&quot;&gt;GSC&lt;/a&gt;&lt;/strong&gt; （Google 搜索后台）—— 16 个月无搜索曝光&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.google.com/analytics&quot; target=&quot;_blank&quot;&gt;GA4&lt;/a&gt;&lt;/strong&gt; （流量统计工具）—— 16 个月无访问&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;两个都没有，就是僵尸页面。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;处理方式&lt;/strong&gt; ：有外链的死页面 → 301 重定向保权重。完全无价值的 → HTTP 410（告诉 Google「永久删除，别再爬」）。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三、Canonical 陷阱：谁才是「正版」？&lt;a href=&quot;#三canonical-陷阱谁才是正版&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://support.google.com/webmasters/answer/10347851?hl=en&quot; target=&quot;_blank&quot;&gt;Canonical&lt;/a&gt; 标签告诉搜索引擎「哪个是原件」。但动态 URL（带 session ID）可能被外链引用后，反过来被当成正版。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt; ：清理动态参数，用 robots.txt 禁止带 session ID 的路径，allow 保留有外链的例外。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;对分类、标签、归档、分页设置 noindex, follow。这些页面进搜索没意义，但上面链接还有价值。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;怎么设置&lt;/strong&gt; ：在页面 HTML 头部加 &lt;code&gt;&amp;lt;meta name=&quot;robots&quot; content=&quot;noindex, follow&quot;&amp;gt;&lt;/code&gt;。noindex = 不进搜索，follow = 仍跟踪链接。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;导航从 JS 动态加载改成静态输出。JS 生成的菜单用户能看见，爬虫可能看不到。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;推荐结构&lt;/strong&gt; ：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;导航用静态 HTML 写进页面，不依赖 JS 加载&lt;/li&gt;
&lt;li&gt;层级不超过 3 层（首页 → 分类 → 文章）&lt;/li&gt;
&lt;li&gt;关键页面放顶部导航，权重优先传递&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;strong&gt;重复的定义&lt;/strong&gt; ：同一个关键词作为锚文本，链接到同一个目标页面超过 5 次。比如 10 个页面都用「笔记本」链接到同一篇产品页，权重就分散了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt; ：分析哪些页面曝光多但链接少 → 给它们加内链。用不同关键词做锚文本（如「笔记本电脑选购指南」「笔记本推荐」）。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;NLP&lt;/strong&gt; 让机器理解文本，分析文章质量、关键词覆盖。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;怎么做&lt;/strong&gt; ：用工具（Surfer SEO、Clearscope）批量评分 → 按作者分组 → 对比收录率和停留时间 → 找弱作者培训或换人。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;典型的 「SEO关键词蚕食」 问题，例如两篇都抢「笔记本电脑」，结果谁也排不上。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;怎么识别&lt;/strong&gt; ：用 Ahrefs Site Audit 或 Semrush 找关键词重叠超过 30% 的文章。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;合并步骤&lt;/strong&gt; ：选一篇主文章 → 把另一篇有价值的内容迁移过去 → 设置 301 重定向 → 更新内链指向新页面。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;HARO 平台&lt;/strong&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;在知乎、Reddit 回答专业问题，带来源链接&lt;/li&gt;
&lt;li&gt;与同行业网站互推内容&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;十、hub 页面：链接中转站&lt;a href=&quot;#十hub-页面链接中转站&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;hub 页面&lt;/strong&gt; 是主题聚合页，把相关内容集中在一页。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;建设要点&lt;/strong&gt; ：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;每个核心主题建一个 hub 页（如「SEO 完全指南」）&lt;/li&gt;
&lt;li&gt;汇集该主题下所有文章链接，加简要描述&lt;/li&gt;
&lt;li&gt;hub 页本身内容丰富，容易被外链引用&lt;/li&gt;
&lt;li&gt;获权重后通过内链分发给子页面&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;十一、disavow 清理：别把好人当坏人&lt;a href=&quot;#十一disavow-清理别把好人当坏人&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://support.google.com/webmasters/answer/2648487?hl=zh-Hans&quot; target=&quot;_blank&quot;&gt;disavow&lt;/a&gt; 文件是提交给 Google 的名单，告诉它「这些链接我不认，别影响排名」。用于屏蔽垃圾外链。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;检查频率&lt;/strong&gt; ：每季度一次。查看屏蔽名单里是否有误判的好域名（有自然流量、相关性高的），放出来恢复权重。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;em&gt;2026 年的今天，全球 AI 算力高度紧张的时期，搜索引擎的爬虫预算会更保守。AI 时代，爬虫对于页面内容质量和页面性能的要求，将大大超越以往任何时期——选择在正确的方向上发力，才能赢得胜利。&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;SEO 真不是「改改标题」那么简单，技术架构、URL 清理、索引控制、内容审计、外链建设——每一环都得跟上。缺一环，就像链条断了，效果就卡在那儿。这份清单，下次排查时对照着用。看看自己的网站，哪一步漏了，补上再说。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>AI-First 团队的架构方法论：从 Harness Engineering 到自愈系统</title><link>https://blog.moewah.com/posts/ai-first-architecture-harness-self-healing-pipeline/</link><guid isPermaLink="true">https://blog.moewah.com/posts/ai-first-architecture-harness-self-healing-pipeline/</guid><description>当 AI 成为主要代码生产者时，工程团队的首要工作不再是写代码，而是搭建让 Agent 高效工作的基础设施。从 Monorepo 统一到自愈 pipeline，拆解 AI-First 架构的完整方法论。</description><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;当 99% 的生产代码由 AI 编写时，工程团队的首要工作不再是写代码，而是让 Agent 能够高效地工作。&lt;/p&gt;
&lt;p&gt;OpenAI 在 2026 年 2 月将其命名为 Harness Engineering。 &lt;strong&gt;当 build time 从几周压缩到几小时，制约整个 pipeline 的就不再是代码产出速度，而是你为 AI 搭建的基础设施。&lt;/strong&gt;&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;一、AI-Assisted 与 AI-First 的本质区别&lt;a href=&quot;#一ai-assisted-与-ai-first-的本质区别&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;AI-Assisted：在原有流程上外挂 AI&lt;a href=&quot;#ai-assisted在原有流程上外挂-ai&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;工程师装 Cursor，PM 用 ChatGPT 写文档，QA 试 AI 生成测试&lt;/li&gt;
&lt;li&gt;工作流程不变，效率提升 10% 到 20%&lt;/li&gt;
&lt;li&gt;加法逻辑&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;AI-First：围绕 AI 重新设计一切&lt;a href=&quot;#ai-first围绕-ai-重新设计一切&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;前提：AI 是主要的 builder&lt;/li&gt;
&lt;li&gt;重新设计流程、架构、组织结构&lt;/li&gt;
&lt;li&gt;不再问 AI 能帮工程师做什么，而是问怎么重组一切让 AI 负责 building&lt;/li&gt;
&lt;li&gt;乘法逻辑&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;判断标准&lt;/strong&gt; ：如果你的 Sprint、Jira、站会、QA 审批都没变，只是加了 AI 工具，那你还在 AI-Assisted 阶段。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;当 AI 把 build time 从几个月压缩到几小时，任何手动环节都会成为致命瓶颈。&lt;/p&gt;&lt;section&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;PM 花几周做调研、设计、写规格文档。Agent 两小时就能实现。以周为单位的规划周期成了瓶颈，PM 必须进化成产品导向的架构师，靠快速原型-发布-测试-迭代的循环来设计，而不是靠委员会评审规格文档。&lt;/p&gt;&lt;p&gt;QA 那边，AI 两小时交付，QA 花三天测边界。解法是用 AI 构建的测试平台来测试 AI 写的代码。验证必须和实现同速，否则只是把瓶颈搬到了下游。&lt;/p&gt;&lt;p&gt;人力规模的问题更直接——竞争对手有百倍人力。招人是追不上的，只能靠架构设计追平。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;法则&lt;/strong&gt; ：产品怎么设计、怎么实现、怎么测试，三个系统必须全部跑通 AI。任何一个留在手动状态，就拖死整个 pipeline。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三、架构原则：让 AI 能看到一切&lt;a href=&quot;#三架构原则让-ai-能看到一切&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;为什么选择 Monorepo&lt;a href=&quot;#为什么选择-monorepo&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;对人类工程师尚可应对，对 AI Agent 却是盲区&lt;/li&gt;
&lt;li&gt;Agent 看不到全局，无法推理跨服务影响，也没法在本地跑集成测试&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;统一所有代码到一个 Monorepo，让 AI 能看到一切&lt;/li&gt;
&lt;li&gt;碎片化的代码库对 Agent 是隐形的，统一的代码库才是可读的&lt;/li&gt;
&lt;li&gt;系统越能被 Agent 检查、验证和修改，获得的杠杆越大&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;大多数团队在构建阶段加了 AI，但检测、triage 和验证还是手动的。AI-First 架构必须闭合这个循环。&lt;/p&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;检测 → triage → 修复 → 验证 → 关闭&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;每日自动化流程&lt;/strong&gt; ：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;自动化健康检查：查询监控数据，分析错误模式，生成健康摘要&lt;/li&gt;
&lt;li&gt;triage 引擎：将错误聚类，按多维度打分，自动生成调查工单&lt;/li&gt;
&lt;li&gt;工单附带上下文：日志样例、受影响用户、受影响端点、建议调查路径&lt;/li&gt;
&lt;li&gt;去重与回归检测：已有工单则更新，已关闭问题复现则重新打开&lt;/li&gt;
&lt;li&gt;修复验证：部署后自动复查，错误消失则工单自动关闭&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;设计哲学&lt;a href=&quot;#设计哲学&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;每个工具只负责一个阶段。没有哪个工具试图包揽一切。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;五、确定性 pipeline：没有快速验证的快速 AI，就是快速积累的技术债&lt;a href=&quot;#五确定性-pipeline没有快速验证的快速-ai就是快速积累的技术债&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;六阶段 CI/CD pipeline&lt;a href=&quot;#六阶段-cicd-pipeline&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;验证 CI → 构建部署开发 → 测试开发 → 部署生产 → 测试生产 → 发布&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;每个阶段必须包含&lt;/strong&gt; ：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;类型检查、lint&lt;/li&gt;
&lt;li&gt;单元测试、集成测试&lt;/li&gt;
&lt;li&gt;端到端测试（Playwright）&lt;/li&gt;
&lt;li&gt;环境一致性检查&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;每次 PR 并行运行：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;代码质量&lt;/strong&gt; ：逻辑错误、性能问题、可维护性&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全扫描&lt;/strong&gt; ：漏洞检测、认证边界、注入风险&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;依赖扫描&lt;/strong&gt; ：供应链风险、版本冲突、许可证问题&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&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;pipeline 必须是确定性的，Agent 才能预测结果并推理失败&lt;/li&gt;
&lt;li&gt;这些是闸门，不是建议&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;六、组织设计：工程师的两种角色&lt;a href=&quot;#六组织设计工程师的两种角色&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;角色 1：架构师（1-2 人）&lt;a href=&quot;#角色-1架构师1-2-人&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这个人的工作不是写代码，而是设计教 AI 如何工作的 SOP。搭测试基础设施，搭集成系统，搭 triage 系统。决定架构和系统边界，定义什么是对 Agent 来说的 “好”。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;关键能力：批判性思维。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;批判性地审视 AI，而不是跟着它走。Agent 提出方案，架构师找漏洞——遗漏了什么失败模式？跨了什么安全边界？积累了什么技术债？质疑假设、压力测试论证、发现盲点的能力，将比写代码的能力更有价值。&lt;/p&gt;&lt;/section&gt;&lt;section&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;AI 分配任务，人执行。triage 系统发现 bug，创建工单，展示诊断结果，分派给合适的人。人调查、验证、批准修复。AI 生成 PR，人审查是否有风险。&lt;/p&gt;&lt;/section&gt;&lt;section&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;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;七、AI-Native 必须渗透到每个职能&lt;a href=&quot;#七ai-native-必须渗透到每个职能&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;工程用小时级交付功能，市场部花一周发公告，市场部就是瓶颈。产品团队还在跑月度规划周期，规划就是瓶颈。&lt;/p&gt;&lt;p&gt;AI-First 要求所有职能都以 Agent 速度运转。产品发布说明从变更日志自动生成，功能介绍视频用 AI 生成动效，社交媒体内容 AI 编排自动发布，健康报告和分析摘要从监控数据自动生成。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;法则&lt;/strong&gt; ：一个职能以 Agent 速度运转，另一个以人类速度运转，慢的那个就约束一切。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;八、给不同角色的行动建议&lt;a href=&quot;#八给不同角色的行动建议&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;价值正在从代码输出转向决策质量。产品直觉和品味变得更重要——能在用户指出问题之前看出生成的 UI 哪里不对。批判性思维是必须训练的：学会评估论证、发现漏洞、质疑假设。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;给 CTO 和创始人&lt;a href=&quot;#给-cto-和创始人&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果 PM 流程比 build time 还长，从这里开始改。 &lt;strong&gt;先建好测试框架，再扩展 Agent 规模。&lt;/strong&gt; 从一个架构师开始，证明系统可行，再把其他人接入操作员角色。把 AI-Native 推到每个职能，预期会有阻力，有些人会抗拒。&lt;/p&gt;&lt;/section&gt;&lt;section&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;hr /&gt;&lt;blockquote&gt;&lt;p&gt;没有快速验证的快速 AI，就是快速积累的技术债。先建好测试框架，再扩展 Agent 规模。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;这套方法论不是什么工具或公司的专利，而是一个简单的前提：&lt;strong&gt;如果 AI 是主要的 builder，那你必须围绕这个事实重新设计一切。&lt;/strong&gt; 不是外挂，不是改造，是重构。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>GhostVM：给 AI Agent 一个完整的 Mac，而不是容器！</title><link>https://blog.moewah.com/posts/ghostvm-macos-vm-ai-agents/</link><guid isPermaLink="true">https://blog.moewah.com/posts/ghostvm-macos-vm-ai-agents/</guid><description>介绍 GhostVM——基于 Apple Virtualization.framework 的 macOS 虚拟机工具。支持近原生性能、自包含 bundle、秒级克隆，提供完整的 CLI (vmctl) 覆盖 GUI 功能，适合 AI agent 隔离环境和多项目开发者。</description><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;上周跑一个 agent 项目，在容器里踩了三个坑：剪贴板不通、端口映射混乱、GUI 测试直接报废。折腾到凌晨两点才搞明白—— &lt;strong&gt;容器隔离不了系统级行为&lt;/strong&gt; 。&lt;/p&gt;
&lt;p&gt;第二天朋友扔给我一个工具：GhostVM。&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Your agents need more than a container. Give them a Mac.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;用了三天，写了篇完整的工具介绍和配置指南。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1293&quot; src=&quot;/_astro/hero-screenshot.DskpdQL3_2utEE6.webp&quot; srcset=&quot;/_astro/hero-screenshot.DskpdQL3_BN8oN.webp 640w, /_astro/hero-screenshot.DskpdQL3_Z2pumKS.webp 750w, /_astro/hero-screenshot.DskpdQL3_ZJwmaQ.webp 828w, /_astro/hero-screenshot.DskpdQL3_6vhVv.webp 1080w, /_astro/hero-screenshot.DskpdQL3_SOWNw.webp 1280w, /_astro/hero-screenshot.DskpdQL3_1TLOus.webp 1668w, /_astro/hero-screenshot.DskpdQL3_2utEE6.webp 2000w&quot; /&gt;&lt;/p&gt;
&lt;section&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;GhostVM 是一个 macOS 虚拟机管理工具，基于 Apple Virtualization.framework，在 Apple Silicon 上跑 macOS 虚拟机。&lt;/p&gt;&lt;p&gt;关键区别： &lt;strong&gt;近原生性能，零仿真&lt;/strong&gt; 。&lt;/p&gt;&lt;p&gt;每个虚拟机就是一个 &lt;code&gt;.GhostVM&lt;/code&gt; 文件夹，自包含，拷走就能用。APFS 写时复制，克隆是秒级的。&lt;/p&gt;&lt;p&gt;项目地址：&lt;a href=&quot;https://github.com/groundwater/GhostVM&quot; target=&quot;_blank&quot;&gt;github.com/groundwater/GhostVM&lt;/a&gt;&lt;/p&gt;&lt;p&gt;官网地址：&lt;a href=&quot;https://ghostvm.org&quot; target=&quot;_blank&quot;&gt;ghostvm.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;GhostVM 和 UTM、VirtualBuddy 同源（都基于同一个框架），但定位完全不同：&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;strong&gt;GhostVM&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;隔离工作区，CLI 强&lt;/td&gt;&lt;td&gt;开发者、多 agent 隔离&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;VirtualBuddy&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;macOS guest 优化，简单&lt;/td&gt;&lt;td&gt;快速测试 macOS 版本&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;UTM&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;通用虚拟机，支持 QEMU&lt;/td&gt;&lt;td&gt;需要跑 Linux/Windows&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;如果你只需要跑 macOS，三者性能几乎没差别——取决于你分了多少 CPU 和内存。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;系统要求&lt;a href=&quot;#系统要求&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;项目&lt;/th&gt;&lt;th&gt;要求&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;CPU&lt;/td&gt;&lt;td&gt;Apple Silicon（M1 或更新）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;系统&lt;/td&gt;&lt;td&gt;macOS 15 Sequoia 或更新&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;内存占用说明&lt;/strong&gt; ：GhostVM 的内存分配是硬性的， &lt;strong&gt;给多少就占用多少&lt;/strong&gt; ，不会被动态压缩或与主机共享。规划时要留足主机余量。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;没有 Intel 支持，也没有老版本 macOS 支持。这限制了通用性，但换来了性能和简洁。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;GhostVM 提供两种安装方式：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;方式一：下载 DMG（推荐）&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;直接去 &lt;a href=&quot;https://github.com/groundwater/GhostVM/releases/latest&quot; target=&quot;_blank&quot;&gt;GitHub Releases&lt;/a&gt; 下载最新的 DMG 文件，双击安装即可。二进制免费开放，无功能限制。&lt;/p&gt;&lt;p&gt;安装包包含 GhostVM.app 和 &lt;code&gt;vmctl&lt;/code&gt; 命令行工具。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;方式二：源码编译&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;需要 Xcode 15+ 和 &lt;a href=&quot;https://github.com/yonaskolb/XcodeGen&quot; target=&quot;_blank&quot;&gt;XcodeGen&lt;/a&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;brew&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xcodegen&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://github.com/groundwater/GhostVM&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GhostVM&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;app&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 编译 GhostVM.app&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;make&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;# 编译 vmctl 命令行工具&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;Makefile 还提供 &lt;code&gt;make run&lt;/code&gt;（编译后连接终端运行）、&lt;code&gt;make dist&lt;/code&gt;（打包 DMG）、&lt;code&gt;make test&lt;/code&gt;（运行单元测试）等目标。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;CLI 怎么用&lt;a href=&quot;#cli-怎么用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;GhostVM 附带一个 &lt;code&gt;vmctl&lt;/code&gt; 命令行工具，覆盖全部 GUI 功能。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;快速上手&lt;/strong&gt; ：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 初始化一个虚拟机，分配 6 核 16G&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vmctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/VMs/dev.GhostVM&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--cpus&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;--memory&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;16&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装 macOS（几分钟）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vmctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/VMs/dev.GhostVM&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 启动&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vmctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/VMs/dev.GhostVM&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;快照和克隆&lt;/strong&gt; ：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 创建快照（改东西前备份）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vmctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;snapshot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/VMs/dev.GhostVM&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clean-install&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 克隆（APFS 写时复制，几乎不占额外空间）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vmctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/VMs/dev.GhostVM&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/VMs/dev-copy.GhostVM&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;停止和挂起&lt;/strong&gt; ：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 停止&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vmctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stop&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/VMs/dev.GhostVM&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 挂起（保存状态到磁盘，下次直接恢复）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vmctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;suspend&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/VMs/dev.GhostVM&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;远程操作&lt;/strong&gt; （在 agent 场景下很有用）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 在虚拟机里执行命令&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vmctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;remote&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;dev&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;exec&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;npm run build&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 读写虚拟机剪贴板&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vmctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;remote&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;dev&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clipboard&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vmctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;remote&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;dev&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clipboard&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;要写入的内容&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 列出虚拟机里运行的应用&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vmctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;remote&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;dev&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apps&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;网络支持 NAT（默认）和桥接模式，每个虚拟机有独立的网络栈。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;GhostVM 的隔离默认开启，不需要额外配置。几个细节：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;剪贴板同步&lt;/strong&gt; 有明确权限提示。虚拟机和主机之间的复制粘贴需要确认，不会偷偷传数据。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;端口转发&lt;/strong&gt; 自动检测监听端口，显示进程名，直接在工具栏管理。不用自己写端口映射规则。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;文件拖拽&lt;/strong&gt; 传进去的文件默认隔离。不会污染主机的文件系统。&lt;/p&gt;&lt;p&gt;每个虚拟机有自己的 Dock 图标和 App Switcher 入口。你可以：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;克隆某个 App 的图标，让虚拟机看起来像原生应用&lt;/li&gt;
&lt;li&gt;叠两个图标，表示里面跑着什么&lt;/li&gt;
&lt;li&gt;用预设图标或自定义上传&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;每个虚拟机跑在独立窗口里，和切换原生 App 没区别。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;跑 AI agent 需要完整 macOS 环境的&lt;/li&gt;
&lt;li&gt;多项目隔离，不想互相污染的&lt;/li&gt;
&lt;li&gt;需要测试不同 macOS 版本兼容性的&lt;/li&gt;
&lt;li&gt;想要轻量级虚拟机方案的开发者&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;UI 确实朴素&lt;a href=&quot;#ui-确实朴素&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;说句实话，GhostVM 的界面很简陋。没有花哨的仪表盘，没有管理面板，就是一个窗口加菜单栏。&lt;/p&gt;&lt;p&gt;但这不是缺点。CLI 足够强，隔离做得到位，性能没问题。&lt;/p&gt;&lt;p&gt;如果你需要漂亮的 UI 或者跨平台虚拟机，UTM 是更好的选择。&lt;/p&gt;&lt;p&gt;但如果你只需要在 Mac 上跑几个隔离的 macOS 工作区，给 agent 一个完整的系统而不是容器，GhostVM 目前是最佳方案。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Agent Skills 设计的十个原则：为什么你的 AI 助手总在重复劳动</title><link>https://blog.moewah.com/posts/agent-skill-design-ten-principles/</link><guid isPermaLink="true">https://blog.moewah.com/posts/agent-skill-design-ten-principles/</guid><description>IntuitMachine 分享 Agent Skills 设计的十条核心原则：Skill 是食谱不是命令、教思考不给结论、区分判断与计算、智能向上执行向下……每次解决问题时问自己：这能成为 Skill 吗？</description><pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;为什么有人用 AI 拿到 100 倍结果？&lt;a href=&quot;#为什么有人用-ai-拿到-100-倍结果&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;同样一个模型，有人做一次性问答，有人搭建持续进化的系统。差距不在模型，而在 Skills。&lt;/p&gt;&lt;p&gt;Carlos E. Perez（@IntuitMachine）最近发布了长文&lt;a href=&quot;https://x.com/IntuitMachine/status/2043071219667480853&quot; target=&quot;_blank&quot;&gt;《Ten Design Principles of Agentic AI Skills Design》&lt;/a&gt;。读完之后，我觉得这套方法论值得每个 AI Agent 爱好者认真拆解。&lt;/p&gt;&lt;p&gt;Perez 的观点很直接：&lt;strong&gt;获得 100 倍结果的人并不更聪明，他们只是无情地将工作沉淀为 Skills。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;下面逐条梳理这十个原则。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;原则一：Skill 是食谱，不是命令&lt;a href=&quot;#原则一skill-是食谱不是命令&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;大多数人写 Skill 时，容易犯这样的错误：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“分析客户反馈并总结主要趋势。”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;这不是 Skill，这是命令。所有具体信息都硬编码在内，只能用一次。&lt;/p&gt;&lt;p&gt;真正的 Skill 应该像食谱，有参数，有流程：&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;strong&gt;参数&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;语料库、研究问题、深度级别&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;流程&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;通读 → 识别模式 → 命名主题 → 提取案例 → 撰写报告&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;命令是一次性的，食谱是可复用的。一个设计良好的 Skill 可以处理数百种场景 —— 客户反馈、员工调研、学术论文，只需更换输入参数。这要求我们从「具体问题解决者」转变为「方法论设计者」。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;如果你在 Skill 里预设了结论：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“第四步：得出证据支持患者安全担忧的结论。”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;AI 就成了确认偏误的工具。你预决定了结果，把 AI 变成了傀儡。&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;p&gt;检验标准很直接：&lt;strong&gt;同一个 Skill，能否用来论证相反的结论？&lt;/strong&gt; 如果能用「调查举报者」Skill 既证明「此人被压制」又证明「举报毫无根据」，并根据证据得出不同答案，这才是真正的 Skill。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;Perez 用了一个很直观的例子：&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;安排 8 人晚宴座位&lt;/td&gt;&lt;td&gt;判断&lt;/td&gt;&lt;td&gt;AI ✅&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;安排 800 人座位&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;8 人座位是判断问题 ——AI 能感知社交动态，做出合理权衡。800 人座位是优化问题 —— 需要算法，不是直觉。AI 没有这个算法，所以它会幻觉出一个看似合理却违反约束的方案。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;别让 AI 做算术，也别让计算器做解释。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;Skill 应显式标注：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;哪些步骤需要判断 → 让 AI 思考&lt;/li&gt;
&lt;li&gt;哪些步骤需要计算 → 调用工具&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这个边界经常被模糊，但它是系统可靠性的基础。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;数据库查询做不到的是：阅读一个人的 50 份文档，发现矛盾，追踪叙事变化，写出一页档案。Perez 把这叫做 &lt;strong&gt;「日志化」（Diarization）&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;真实案例：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;会议组织者的数据库显示申请者做「AI 基础设施」。但 1 对 1 谈话暴露他们主要担心计费和成本归因。GitHub 提交显示 80% 近期工作在支付模块。&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;别预过滤「相关」文档。直到读完才知道什么相关。力量来自看到全貌后涌现的综合 —— 这是 AI 相比传统查询的独特优势。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;Perez 分享了自己的失败教训。他写过 &lt;strong&gt;20,000 行&lt;/strong&gt;指令，涵盖每个怪癖和模式。结果更糟 ——AI 的注意力有限，信息过载让重要指令被淹没。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方案是 200 行指针：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;当你做 X 时 → 加载文档 Y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;当你看到模式 A 时 → 查阅 Skill B&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这叫做&lt;strong&gt;解析器（Resolver）&lt;/strong&gt;—— 一个路由系统，在正确时刻加载正确上下文。&lt;/p&gt;&lt;p&gt;想想写代码时的 import。你不会把所有库的文档塞进一个文件，你只在需要的时候导入。Skill 系统也一样： &lt;strong&gt;按需加载，而不是全量注入。&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;顶层：Skill&lt;/strong&gt; — 丰富的流程、判断、智慧文档&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中层：Harness&lt;/strong&gt; — 约 200 行代码，运行 AI 循环、管理上下文、调用工具&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;底层：Tool&lt;/strong&gt; — 快速、简单的程序，做一件事且可靠&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;反模式是「胖框架」——40 个工具定义占满上下文，业务逻辑嵌在编排层，Skill 反而成了附属品。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;原则：智能推入 Skill，执行推入工具，保持框架纤薄。&lt;/strong&gt; 当模型改进时，所有 Skill 自动改进；工具保持可靠，因为它们只是代码。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;通用工具是陷阱。Perez 列出了三个问题：&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;strong&gt;慢&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;通用浏览器工具 15 秒 vs 专用工具 100ms，相差 150 倍&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;臃肿&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;40 个工具定义耗尽 AI 注意力预算&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;隐藏复杂性&lt;/strong&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;p&gt;软件不再珍贵。需要什么工具就建什么，30 分钟搞定，AI 还能帮忙写。不需要就删。工具是脚手架，不是建筑。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;用户对 AI 输出的三种反应：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;优秀 ← 还行 → 糟糕&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;大多数人专注于修复「糟糕」的响应。它们很戏剧化，感觉很紧急。但反直觉的洞察是：&lt;strong&gt;「还行」才是改进的空间所在。&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;「糟糕」通常是明显失败 —— 系统崩溃、工具超时。这些是 bug。&lt;/li&gt;
&lt;li&gt;「还行」意味着系统几乎工作了，但某些东西差了一点。这些是机会。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;真实案例：&lt;/strong&gt; 活动匹配 Skill 有 12% 的「还行」评级。添加一条规则后降到 4%：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;当某人说 AI 基础设施但代码主要是计费，将其归类为 FinTech。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;这条规则来自审视「还行」与「优秀」之间的差距 —— 精准修补，而非重写整个流程。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;每个 Skill 都是系统的永久升级：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;被保存、版本化、永久可用&lt;/li&gt;
&lt;li&gt;凌晨 3 点运行，处理千次实例不疲倦&lt;/li&gt;
&lt;li&gt;当模型改进时，&lt;strong&gt;每个 Skill 自动升级&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;更好的模型 + 相同的 Skill = 更好的产出&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;如果系统有 100 个 Skills，每个处理一类工作，每个随模型改进自动升级 —— 这不是一套工具，而是一个持续复利的资产。停止把 AI 交互当对话，开始把它当构建永久能力的机会。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;/match&lt;/code&gt; 的 Skill，接受三个参数：&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;ENTITIES&lt;/td&gt;&lt;td&gt;匹配谁？&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CRITERIA&lt;/td&gt;&lt;td&gt;什么是好匹配？&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CONSTRAINTS&lt;/td&gt;&lt;td&gt;必须遵循的规则？&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;同一套流程，三种完全不同的场景：&lt;/p&gt;




























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;场景&lt;/th&gt;&lt;th&gt;ENTITIES&lt;/th&gt;&lt;th&gt;CRITERIA&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;1200 名创始人&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;/td&gt;&lt;td&gt;600 名创始人&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;/td&gt;&lt;td&gt;大楼里的人&lt;/td&gt;&lt;td&gt;最近邻嵌入&lt;/td&gt;&lt;td&gt;1:1 配对&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;相同 Skill，相同七个步骤，完全不同的行为。&lt;/strong&gt; 参数提供具体世界，Skill 提供流程。设计一次，永久调用。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;沉淀（Codification）&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;遇到重复任务，沉淀为 Skill。注意到有效的判断，沉淀如何做出它。发现模式，沉淀模式让系统识别它。&lt;/p&gt;&lt;p&gt;一年后，你的 Skills 将运行在比今天更好的模型上。你现在写的每个 Skill，都是对未来能力的投资。你沉淀的每个判断，都将成为永远不会失去的杠杆。&lt;/p&gt;&lt;p&gt;写好食谱，做好不同餐食。系统复利增长。构建一次，永远运行。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Hermes Agent vs OpenClaw：控制还是进化？</title><link>https://blog.moewah.com/posts/hermes-agent-vs-openclaw-comparison/</link><guid isPermaLink="true">https://blog.moewah.com/posts/hermes-agent-vs-openclaw-comparison/</guid><description>深度对比 Hermes Agent 与 OpenClaw 两大 AI Agent 框架的设计哲学差异。OpenClaw 走控制路线，Hermes 走进化路线。从记忆系统、技能生成、安全机制、执行环境等维度解析，助你选型决策。</description><pubDate>Fri, 10 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近 AI Agent 领域涌现出两个备受关注的框架：Hermes Agent 和 OpenClaw。我在研究过程中发现，它们定位相似——都是「个人 AI 助手」，但底层设计哲学截然不同。这篇文章从技术角度拆解两者的差异，帮助刚接触 AI Agent 的开发者做出选择。&lt;/p&gt;
&lt;section&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;Hermes Agent&lt;/strong&gt; 来自 Nous Research，GitHub 目前积累 &lt;strong&gt;57,169 Stars&lt;/strong&gt;。它以 Python 构建，核心定位是「The agent that grows with you」——一个会随使用而成长的代理。官网：&lt;a href=&quot;https://hermes-agent.nousresearch.com/&quot; target=&quot;_blank&quot;&gt;hermes-agent.nousresearch.com&lt;/a&gt;，GitHub：&lt;a href=&quot;https://github.com/NousResearch/hermes-agent&quot; target=&quot;_blank&quot;&gt;github.com/NousResearch/hermes-agent&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;OpenClaw&lt;/strong&gt; 以 TypeScript 编写，GitHub Stars 达到 &lt;strong&gt;354,714&lt;/strong&gt;，是目前热度最高的 Agent 框架之一。定位是「Personal AI assistant. Any OS. Any Platform.」——强调跨平台能力和控制平面的完整性。&lt;/p&gt;&lt;p&gt;数据上看，OpenClaw 的社区热度更高，但这不意味着它更适合所有场景。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;设计哲学：学习循环 vs 控制平面&lt;a href=&quot;#设计哲学学习循环-vs-控制平面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这是两者最根本的差异。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Hermes 采用「学习循环优先」设计&lt;/strong&gt;。它内置闭环系统：Agent 从复杂任务中自动提取经验、生成技能，并在后续使用中持续改进。比如你说「帮我安排会议」，它不仅执行任务，还会记住你偏好上午 10 点、倾向 Zoom 而非 Teams、习惯提前 15 分钟提醒。这些偏好被自动提炼存储，下次无需重复说明。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;OpenClaw 采用「控制平面优先」设计&lt;/strong&gt;。它的 Gateway 是 WebSocket 控制中枢，管理 sessions、channels、tools、events——人在决策链中心。你需要显式配置技能、路由规则、安全策略，Agent 不会自动「进化」，但你对其一切行为有完整掌控。比如明确规定「所有文件操作必须人工确认」、「敏感数据访问需二次验证」。这种设计牺牲便利性，换来了可预测性和可审计性。&lt;/p&gt;&lt;p&gt;简而言之：&lt;strong&gt;Hermes 追求「越用越懂你」，OpenClaw 追求「你定义它做什么」&lt;/strong&gt;。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;记忆系统是 Agent 的核心能力，两者实现差异明显。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Hermes 多层架构&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;SQLite FTS5 底层存储，支持全文检索&lt;/li&gt;
&lt;li&gt;LLM summarization 自动压缩历史对话&lt;/li&gt;
&lt;li&gt;Honcho dialectic user modeling 建立用户画像&lt;/li&gt;
&lt;li&gt;字符限制强制优先级排序，避免记忆膨胀&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;代价是复杂性——多层系统意味着多层调试。好处是跨会话检索强，Agent 能「回忆」几周前的对话细节。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;OpenClaw Markdown 文件&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;记忆以纯 Markdown 文件存储（&lt;code&gt;MEMORY.md&lt;/code&gt;、&lt;code&gt;USER.md&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;无硬性容量限制&lt;/li&gt;
&lt;li&gt;可人工编辑审计，完全透明&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;方案简单直观，适合需要手动干预记忆内容的场景。审计人员可直接查阅记忆文件，确认 Agent 行为依据。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;Hermes 自动生成技能&lt;/strong&gt;。完成复杂任务后，Agent 自动创建 skill 文件，后续类似任务可直接调用。比如你连续三次要求「将 PDF 转为 Markdown 并存入 Obsidian vault」，Hermes 分析操作模式，生成可复用技能脚本，下次只需说「转换这个 PDF」。这套机制符合 agentskills.io 开放标准，技能可跨 Agent 共享。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;OpenClaw 人工编写技能&lt;/strong&gt;。提供 52+ 内置技能，覆盖文档处理、数据分析、API 集成等常见场景，但新技能需要用户显式创建。技能平台有安装门控和 UI 管理，适合需要精细控制技能集的场景。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;多维度对比&lt;a href=&quot;#多维度对比&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;












































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;维度&lt;/th&gt;&lt;th&gt;Hermes&lt;/th&gt;&lt;th&gt;OpenClaw&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;模型支持&lt;/td&gt;&lt;td&gt;200+ 模型（OpenRouter），一条命令切换&lt;/td&gt;&lt;td&gt;BYOK 模式，用户自行配置 API Key&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;平台支持&lt;/td&gt;&lt;td&gt;Telegram、Discord、Slack、WhatsApp、Signal、CLI&lt;/td&gt;&lt;td&gt;22 渠道（含 WeChat、iMessage、Matrix 等）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;安全机制&lt;/td&gt;&lt;td&gt;默认沙盒隔离，容器执行，零遥测&lt;/td&gt;&lt;td&gt;DM pairing 验证，显式 allowlist&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;运行环境&lt;/td&gt;&lt;td&gt;6 种 backend：local、Docker、SSH、Daytona、Singularity、Modal&lt;/td&gt;&lt;td&gt;Node 24，npm/pnpm/bun 安装&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Serverless&lt;/td&gt;&lt;td&gt;Modal/Daytona 支持，闲置近乎零成本&lt;/td&gt;&lt;td&gt;无原生 serverless，需自行部署&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cron 调度&lt;/td&gt;&lt;td&gt;内置 cron，支持多平台投递&lt;/td&gt;&lt;td&gt;内置 cron + webhooks&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;部署成本&lt;/td&gt;&lt;td&gt;5 美元 VPS 可运行&lt;/td&gt;&lt;td&gt;推荐本地运行或托管选项&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;
&lt;section&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;适合 Hermes 的场景&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;长期陪伴型助手，需要跨会话记忆积累&lt;/li&gt;
&lt;li&gt;Serverless 部署，预算敏感（5 美元 VPS 即可运行）&lt;/li&gt;
&lt;li&gt;多模型切换需求，不想被单一 provider 锁定&lt;/li&gt;
&lt;li&gt;希望 Agent 自主学习、减少手动配置&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;适合 OpenClaw 的场景&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;企业级部署，需要完整审计能力&lt;/li&gt;
&lt;li&gt;复杂渠道路由，需精细控制消息流向&lt;/li&gt;
&lt;li&gt;iOS/Android 原生集成需求（Voice Wake、Canvas）&lt;/li&gt;
&lt;li&gt;安全合规优先，需显式审批每条 DM&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;核心观点：两个框架各有优劣，场景决定选择。&lt;/strong&gt; Hermes 更适合「轻量、自进化」的个人助手场景；OpenClaw 更适合「可控、可审计」的正式部署场景。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Hermes 快速上手&lt;a href=&quot;#hermes-快速上手&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果决定尝试 Hermes，安装极其简单：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-fsSL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;安装后执行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;source&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.bashrc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;hermes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;setup&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 配置向导&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;hermes&lt;/span&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;# 启动对话&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;hermes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 选择模型&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;hermes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gateway&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 启动消息网关&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;首次运行会引导选择模型 provider（推荐 OpenRouter 以获得最大模型选择范围）、配置安全策略、设置 Telegram/Discord 等平台连接。完整文档见 &lt;a href=&quot;https://hermes-agent.nousresearch.com/docs/&quot; target=&quot;_blank&quot;&gt;hermes-agent.nousresearch.com/docs&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;如果从 OpenClaw 迁移，Hermes 提供一键迁移命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;hermes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;claw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;migrate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--dry-run&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 先预览&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;hermes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;claw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;migrate&lt;/span&gt;&lt;span&gt;              &lt;/span&gt;&lt;span&gt;# 执行迁移&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;会导入 &lt;code&gt;SOUL.md&lt;/code&gt;、记忆文件、技能、API Keys 等历史配置。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;选择框架本质是选择一种 Agent 与人交互的范式：让 Agent 自主进化，还是让人类完全掌控？Hermes 和 OpenClaw 代表了两种截然不同的答案。建议先用 Hermes 起步——它的学习循环能让你快速体验「Agent 会成长」的感觉，之后再根据实际需求决定是否切换到 OpenClaw 的控制平面模式。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;选择哪一个，取决于你的核心诉求是效率还是控制。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>LLM Wiki：知识只编译一次</title><link>https://blog.moewah.com/posts/karpathy-llm-wiki-knowledge-base/</link><guid isPermaLink="true">https://blog.moewah.com/posts/karpathy-llm-wiki-knowledge-base/</guid><description>介绍 Andrej Karpathy 提出的 LLM Wiki 模式，一种用 agent 维护持久化知识库的方法。与传统 RAG 每次从头检索不同，知识编译一次永久使用。文章详解三层架构、分工模式、核心操作及适用场景。</description><pubDate>Thu, 09 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近逛 &lt;a href=&quot;https://hermes-agent.nousresearch.com/&quot; target=&quot;_blank&quot;&gt;Hermes Agent&lt;/a&gt; 的源码，发现有个 llm-wiki skill。看实现，原来是 Andrej Karpathy 提出的思路。&lt;/p&gt;
&lt;p&gt;Karpathy 在 Gist 里提了个概念：&lt;strong&gt;与其每次用 RAG 从零检索，不如让 agent 帮你构建一个持久化的知识库&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;完整思路在这里：&lt;a href=&quot;https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f&quot; target=&quot;_blank&quot;&gt;https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;RAG 的重复劳动问题&lt;a href=&quot;#rag-的重复劳动问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;RAG 每次查询都要走完整流程：检索 → 提取 → 合成。&lt;/p&gt;&lt;p&gt;同一个问题问两次，系统每次都从头干一遍活。你问”Transformer 是什么”，系统翻文档、提取内容、生成答案。换个说法再问，系统又从头来一次。&lt;/p&gt;&lt;p&gt;Wiki 模式的核心价值：&lt;strong&gt;知识整理一次，永久保存。下次直接查已编译的内容。&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;传统笔记 vs LLM Wiki&lt;a href=&quot;#传统笔记-vs-llm-wiki&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;传统笔记应用&lt;/th&gt;&lt;th&gt;LLM Wiki&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;/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;手动搜索和检索&lt;/td&gt;&lt;td&gt;agent 找到并合成跨整个知识库&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;传统笔记是”存起来以后自己找”，LLM Wiki 是”存起来让 agent 理解后帮你找”。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;为什么 Markdown 是正确基础&lt;a href=&quot;#为什么-markdown-是正确基础&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Karpathy 强调用 markdown，理由有三：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;便携无锁定&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;.md&lt;/code&gt; 文件任何编辑器都能打开。不依赖某家公司活着。之前用过几个云笔记产品，后来倒闭了，数据导出特别麻烦。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;LLM 原生支持&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;模型训练数据里有大量 GitHub README、技术文档。headers、列表、代码块这些结构，模型天然能识别。不需要额外解析。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;强制清晰&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;markdown 的格式本身推动组织内容：标题命名段落，列表分开条目。不像某些富文本编辑器，混乱内容也能存进去。&lt;/p&gt;&lt;p&gt;Karpathy 有一句话：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;No database. No vector embeddings. No server. Just files and a capable model.&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wiki/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── SCHEMA.md      # 规则、约定、标签分类&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── index.md       # 所有页面目录 + 一行摘要&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── log.md         # 操作日志（只追加）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── raw/           # Layer 1: 原始来源（不可修改）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── articles/  # 网页文章&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── papers/    # PDF/论文&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── entities/      # Layer 2: 实体页（人、组织、产品）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── concepts/      # Layer 2: 概念/主题页&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── comparisons/   # Layer 2: 对比分析&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└── queries/       # Layer 2: 有价值的查询结果&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Layer 1：原始来源&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;agent 只读，不改。你丢进去的文章、论文，原样保存。source material 不丢失，万一 wiki 页面有错误，可以回去查原文。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Layer 2：Wiki 页面&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;编译后的知识。agent 创建、更新、建立链接。每个页面对应一个实体、概念或对比。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Layer 3：Schema&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;定义规则：标签分类、页面命名规范、什么时候该建新页面。给 agent 的”操作手册”。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;人机协作分工&lt;a href=&quot;#人机协作分工&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;你做的事&lt;/th&gt;&lt;th&gt;agent 做的事&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;/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;用 Obsidian 打开 wiki 目录浏览&lt;/td&gt;&lt;td&gt;维护 index、log、lint 检查&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;你提供原材料，agent 加工整理。wiki 目录在本地，随时手动编辑。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;四个核心操作&lt;a href=&quot;#四个核心操作&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Ingest（导入）&lt;a href=&quot;#ingest导入&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;丢给 agent 一个链接或文章，它会：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;提取内容，保存到 &lt;code&gt;raw/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;识别提到的实体、概念&lt;/li&gt;
&lt;li&gt;创建或更新 wiki 页面&lt;/li&gt;
&lt;li&gt;建立 &lt;code&gt;[[wikilink]]&lt;/code&gt; 跨引用&lt;/li&gt;
&lt;li&gt;更新 index.md 和 log.md&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;一篇源文章可能触发 5-15 个页面的更新。Karpathy 叫这”复利效应”。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Query（查询）&lt;a href=&quot;#query查询&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;问 agent：“wiki 里有没有关于 Transformer 的内容？”&lt;/p&gt;&lt;p&gt;它会：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;读 index.md 找相关页面&lt;/li&gt;
&lt;li&gt;搜索所有 &lt;code&gt;.md&lt;/code&gt; 文件&lt;/li&gt;
&lt;li&gt;从已编译的知识合成答案&lt;/li&gt;
&lt;li&gt;告诉你引用了哪些页面&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Lint（检查）&lt;a href=&quot;#lint检查&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;/li&gt;
&lt;li&gt;断裂链接（指向不存在页面）&lt;/li&gt;
&lt;li&gt;过期内容（90 天没更新）&lt;/li&gt;
&lt;li&gt;矛盾信息（同主题页面说不一样的话）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;每个 wiki 页面顶部写一行 summary。agent 读这行就能判断整个文件是否相关，不用读完全文。十秒钟写个摘要，省下 agent 读无关文件的时间。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;/p&gt;&lt;ul&gt;
&lt;li&gt;学术研究（论文多、概念交叉引用频繁）&lt;/li&gt;
&lt;li&gt;技术学习（框架/工具层出不穷）&lt;/li&gt;
&lt;li&gt;行业跟踪（公司、产品、人物动态）&lt;/li&gt;
&lt;li&gt;个人知识库（任何你想长期累积的领域）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;判断标准：&lt;/strong&gt;&lt;/p&gt;&lt;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;/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;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;如何触发 agent&lt;a href=&quot;#如何触发-agent&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;前提是 skill 启用。Hermes 默认启用，被禁用的话，从 &lt;code&gt;config.yaml&lt;/code&gt; 的 &lt;code&gt;disabled&lt;/code&gt; 列表移除。&lt;/p&gt;&lt;p&gt;之后对 agent 说：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;“创建一个 wiki，主题是 AI 工具” → 初始化目录结构&lt;/li&gt;
&lt;li&gt;“把这篇文章加入 wiki” → ingest 操作&lt;/li&gt;
&lt;li&gt;“wiki 里有没有关于 X 的内容” → query 操作&lt;/li&gt;
&lt;li&gt;“检查一下 wiki 有没有问题” → lint 操作&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Obsidian 兼容性&lt;a href=&quot;#obsidian-兼容性&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;wiki 目录本身就是 Obsidian vault：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[[wikilinks]]&lt;/code&gt; 渲染为可点击链接&lt;/li&gt;
&lt;li&gt;Graph View 可视化知识网络&lt;/li&gt;
&lt;li&gt;YAML frontmatter 支持 Dataview 查询&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果机器没有显示器（比如服务器），可以用 &lt;code&gt;obsidian-headless&lt;/code&gt; 做 sync，让你在笔记本上用 Obsidian 浏览，agent 在服务器上写。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;llm-wiki 的核心价值：&lt;strong&gt;知识只编译一次，之后直接用&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;不像 RAG 每次从头检索，它是 agent 帮你维护一个结构化的 markdown 知识库。你丢源材料，agent 提取整理、建立链接、维护结构。&lt;/p&gt;&lt;p&gt;适合需要长期累积、反复查询、有交叉引用价值的领域。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>AI 内容与 Helpful Content Update：Google 真正惩罚的是什么？</title><link>https://blog.moewah.com/posts/ai-content-helpful-content-update/</link><guid isPermaLink="true">https://blog.moewah.com/posts/ai-content-helpful-content-update/</guid><description>Google 不惩罚 AI 内容，惩罚的是低质量内容。本文解读 HCU 的真正目标、三个致命误区、AI 内容安全使用边界，以及 Who-How-Why 自检框架和 E-E-A-T 补充策略。</description><pubDate>Tue, 07 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;hr /&gt;
&lt;section&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;一个外贸独立站站长在Reddit发帖求助：他的站点从300K月访问量跌到零。SEO审计机构告诉他，原因是”AI内容过多触发了HCU惩罚”。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;这个结论，对了一半，也错了一半。&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Google官方立场：质量决定排名，不是生产方式&lt;a href=&quot;#google官方立场质量决定排名不是生产方式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;2023年2月，Google Search Central发布了一篇官方博客，标题是「Google Search’s guidance about AI-generated content」。这篇文章的结论被无数SEO解读，但核心一句话很多人没读懂：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“Our focus on the quality of content, rather than how content is produced, is a useful guide that has helped us deliver reliable, high quality results to users for years.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;翻译过来&lt;/strong&gt; ：Google关注的是内容质量，而不是内容是怎么生产的。&lt;/p&gt;&lt;p&gt;这不是公关话术。Google的Search Quality Rater Guidelines（搜索质量评估指南）里，没有一条标准叫”是否使用AI”。评估员打分的依据是E-E-A-T：经验、专业性、权威性、可信度。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;那为什么那么多用AI内容的站点被惩罚了？&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Helpful Content Update：不是”反AI”，是”反垃圾”&lt;a href=&quot;#helpful-content-update不是反ai是反垃圾&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Helpful Content System（HCS）在2024年经历了多次更新，2025年进入常态化运行阶段。它的核心目标只有一个：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;打击”为搜索引擎创建的内容”，奖励”为用户创建的内容”。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Google在官方文档里写得非常清楚：使用AI工具生成大量页面而不为用户增加价值，可能违反”规模化内容滥用”政策。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;关键词是”不为用户增加价值”，不是”使用AI”。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Rankability在2025年做了一个研究：分析了487个高竞争关键词的Top结果，用Originality.ai检测AI内容比例。结果发现，83%的顶级结果是非AI生成的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;但这不意味着Google惩罚AI内容。&lt;/strong&gt; 它意味着：在当前搜索生态里，真正能排在前面的内容，往往投入了大量人工精力——无论是否使用AI辅助。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三个致命误区&lt;a href=&quot;#三个致命误区&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;这是最常见的误解。Google官方FAQ明确回答：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“Is AI content against guidelines? No, appropriate use is allowed.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;惩罚触发条件&lt;/strong&gt; ：内容主要用于操纵排名，而非帮助用户。生产方式（AI或人工）不是判断标准。&lt;/p&gt;&lt;p&gt;Bankrate是一个典型案例。他们在高竞争关键词页面使用AI生成内容，明确标注”AI生成”，照样排在第3位、第14位。为什么能排？因为内容经过了人工编辑，添加了原创数据，满足了搜索意图。&lt;/p&gt;&lt;/section&gt;&lt;section&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让内容生产成本降到几乎为零，很多人开始”批量生产”：一天生成100篇，一周上线1000页。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;这正是HCS最擅长检测的模式。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Google的SpamBrain系统专门识别”规模化垃圾内容”。特征包括：内容模板化、缺乏原创价值、发布节奏异常、用户行为信号差（高跳出率、短停留时间）。&lt;/p&gt;&lt;p&gt;Reddit上那个TailRide案例：站点用AI规模化发布，流量暴跌。用户评论很直接：“AI内容不够好，除非规模化发布才能吸引访问者。问题不是AI，是质量不够。“&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;误区三：不需要E-E-A-T也能排&lt;a href=&quot;#误区三不需要e-e-a-t也能排&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;有人认为E-E-A-T只对健康、金融等YMYL领域重要。但Google的Search Quality Rater Guidelines里，E-E-A-T是 &lt;strong&gt;所有内容&lt;/strong&gt; 的评估框架。&lt;/p&gt;&lt;p&gt;AI内容最大的短板，恰恰是E-E-A-T：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Experience&lt;/strong&gt; ：AI没有第一手经验&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expertise&lt;/strong&gt; ：AI没有领域专业背景&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Authoritativeness&lt;/strong&gt; ：AI没有行业认可&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trustworthiness&lt;/strong&gt; ：AI生成内容可能存在事实错误&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;不补充这些信号，AI内容很难获得长期稳定排名。&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;AI内容安全使用边界&lt;a href=&quot;#ai内容安全使用边界&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Google在官方文档里给了明确指引：用”Who, How, Why”三个问题自检内容。&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;strong&gt;Who&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;谁创建了内容？是否有真实作者署名？&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;How&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;如何创建？是否有人工编辑流程？&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Why&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;为何创建？是为了帮助用户，还是为了操纵排名？&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;section&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; ：建议≥30%。AI初稿只是骨架，真正有价值的是你注入的销售数据、产品分析、客户反馈。Rankability研究里提到：排名第一的内容，都包含”Google在别处找不到的信息”。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;人工审核流程&lt;/strong&gt; ：必须。Search Engine Land提出的C.R.A.F.T框架就是操作&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;C（Cut）：删除AI生成的废话、套话&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;R&lt;/strong&gt; ：检查验证&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A&lt;/strong&gt; ：添加视觉、链接、原创数据&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;F&lt;/strong&gt; ：事实核查&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;T&lt;/strong&gt; ：转换语调为真人风格&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;作者署名&lt;/strong&gt; ：真实专家。不要把AI列为作者——Google官方明确不推荐。更好的做法是署名真人作者，必要时说明AI在创作过程中的辅助作用。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;更新频率&lt;/strong&gt; ：定期更新。AI内容的一个风险是”发布后不管”。搜索算法会持续评估内容时效性，不更新的页面会逐渐失去排名。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;让AI辅助而非替代&lt;a href=&quot;#让ai辅助而非替代&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;AI在SEO内容里的正确定位，是 &lt;strong&gt;效率工具&lt;/strong&gt; ，不是 &lt;strong&gt;替代方案&lt;/strong&gt; 。&lt;/p&gt;&lt;section&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;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;/section&gt;&lt;section&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;E-E-A-T构建：作者署名、专家背书、来源引用&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;John Mueller（Google Search Advocate）在一次问答里说得很清楚：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“I wouldn’t think about it as AI or not, but about the value that the site adds to the web.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;翻译&lt;/strong&gt; ：不要纠结AI还是人工，要问的是你的站点为互联网增加了什么价值。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;如果你正在使用AI内容，三个问题先自查：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;你的内容比现有Top结果更好吗？&lt;/strong&gt; 不一定要完美，但要至少在某一个维度（数据深度、案例数量、实操细节）有独特价值。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;你的内容经过人工编辑了吗？&lt;/strong&gt; 直接发布ChatGPT输出，是最快的”去索引”路径。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;你的E-E-A-T信号够吗？&lt;/strong&gt; 作者署名、专家引用、可验证来源——这些信号告诉Google”这是可信内容”。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;底线&lt;/strong&gt; ：Google不惩罚AI内容。Google惩罚的是低质量内容。用AI提升效率，用人工注入价值——这才是2025年SEO内容生产的正确姿势。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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://developers.google.com/search/docs/fundamentals/using-gen-ai-content&quot; target=&quot;_blank&quot;&gt;Google Search’s guidance on using generative AI content&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/search/blog/2023/02/google-search-and-ai-content&quot; target=&quot;_blank&quot;&gt;Google Search’s guidance about AI-generated content&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rankability.com/data/does-google-penalize-ai-content/&quot; target=&quot;_blank&quot;&gt;Does Google Penalize AI Content? - Rankability Case Study&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://keywordseverywhere.com/blog/does-google-penalize-ai-content/&quot; target=&quot;_blank&quot;&gt;Does Google Penalize AI Content in 2026? - Keywords Everywhere&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://searchengineland.com/does-google-helpful-content-update-penalize-ai-content-433221&quot; target=&quot;_blank&quot;&gt;Does Google’s helpful content update penalize AI content? - Search Engine Land&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>你的文章为什么没人引用？E-E-A-T 信号缺失的诊断与修复</title><link>https://blog.moewah.com/posts/eeat-signals-ai-citations-fix/</link><guid isPermaLink="true">https://blog.moewah.com/posts/eeat-signals-ai-citations-fix/</guid><description>96% 被 AI Overviews 引用的文章都有可验证的 E-E-A-T 信号。本文详解四个维度、三个常见缺失、作者页面和 Schema 的实操方法，以及低成本 E-E-A-T 提升方案。</description><pubDate>Fri, 03 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;有个做独立站的朋友问我，明明内容写得不错，技术 SEO 也没问题，为什么 AI 搜索（Google AI Overviews、Perplexity）从来不引用他的文章？&lt;/p&gt;
&lt;p&gt;我打开他的网站看了五分钟，问题很明显：没有作者署名，没有作者页面，文章底部的「About」写着「我们是一群热爱分享的编辑」。&lt;/p&gt;
&lt;p&gt;这不只是他一个人的问题。2026 年的一项研究显示， &lt;strong&gt;96% 被 AI Overviews 引用的文章都有可验证的 E-E-A-T 信号&lt;/strong&gt; ，而大多数独立站恰恰缺的就是这个。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;E-E-A-T 不是排名指标，是评估框架&lt;a href=&quot;#e-e-a-t-不是排名指标是评估框架&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;先说清楚一件事：E-E-A-T 不是 Google 算法里的某个打分项，你没法在 Search Console 里看到「E-E-A-T 分数」。&lt;/p&gt;&lt;p&gt;它是质量评估员用来判断内容质量的一套框架。Google 用各种信号来「猜」你的内容是不是值得信任——作者署名、资质展示、原创证据、外部背书，这些都算信号。&lt;/p&gt;&lt;p&gt;打个比方：E-E-A-T 就像餐厅的卫生评级。顾客（用户）看不到后厨，但能看到门口贴的「A 级」标识。这个标识本身不影响菜的味道，但它决定了顾客愿不愿意进来吃。&lt;/p&gt;&lt;section&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;Experience（经验）&lt;/strong&gt; ：你是不是真的做过这件事？&lt;/p&gt;&lt;p&gt;比如写「如何给 WordPress 做 SEO」，如果你从来没实操过，只看了几篇文章拼凑出来，那就不叫有经验。经验信号是「我测试了三种方案，A 方案提升了 40%，B 方案没用，C 方案被惩罚了」。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Expertise（专业性）&lt;/strong&gt; ：你是不是真的懂这个领域？&lt;/p&gt;&lt;p&gt;这不是说你要有 PhD，而是你的背景要能支撑你写的内容。写医疗话题的，最好有医学背景；写理财的，最好有 CPA 或 CFA；写代码的，最好有开源项目或从业经历。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Authoritativeness（权威性）&lt;/strong&gt; ：别人认不认可你？&lt;/p&gt;&lt;p&gt;权威性是「被认可」的结果，不是自封的。有人引用你的文章、行业媒体报道你的观点、同行专家推荐你的内容——这些都算权威信号。但记住，这是别人给你的，不是你自己在页面上写「我是专家」。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Trustworthiness（可信度）&lt;/strong&gt; ：你这个人/网站靠不靠谱？&lt;/p&gt;&lt;p&gt;清晰的作者署名、真实的联系方式、明确的数据来源、及时的内容更新——这些都在告诉读者：我对我说的话负责。没有署名的文章就像匿名信，可信度天然打折。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;为什么 2026 年 E-E-A-T 权重放大&lt;a href=&quot;#为什么-2026-年-e-e-a-t-权重放大&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;两个原因。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;一是 AI 生成内容泛滥。&lt;/strong&gt; 任何人都能用 AI 批量生产内容，但 AI 没法伪造「我做过这件事」的经验。Google 需要一个可靠的信号来区分「抄来的内容」和「亲身经历的内容」，E-E-A-T 就是这个信号。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;二是 AI Overviews 的引用偏好。&lt;/strong&gt; 研究数据显示：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;86% 的 AI Overviews 引用来自前 100 名自然搜索结果&lt;/li&gt;
&lt;li&gt;有结构化数据（Schema）的网站，引用率提高 340%&lt;/li&gt;
&lt;li&gt;内容发布在 2 年内的，被引用概率远超老文章&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;AI 在选引用来源时，优先选择「可信」的内容。而可信的判断标准，就是 E-E-A-T 信号够不够强。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;新手常见的三个信号缺失&lt;a href=&quot;#新手常见的三个信号缺失&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;这是最常见的问题。文章写完了，直接发布，没有作者名，或者写个「Admin」「编辑」。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;问题在于&lt;/strong&gt; ：没有署名 = 没有人对内容负责。Google 没法追溯这篇内容是谁写的、这个人有没有资格写这个话题。&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;/section&gt;&lt;section&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;/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;外部验证链接（LinkedIn、Google Scholar、GitHub 等）&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;blockquote&gt;&lt;p&gt;[姓名] 是 [具体职位]，在 [具体领域] 拥有 [X 年] 经验。曾 [具体成就]，持有 [相关资质]。目前专注于 [与文章主题相关的方向]。[验证链接：LinkedIn/作品集]&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&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;/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;案例故事：「客户 A 实施后流量增长 120%」&lt;/li&gt;
&lt;li&gt;失败教训：「这个坑我踩过三次」&lt;/li&gt;
&lt;li&gt;过程截图：配置界面、数据面板、前后对比&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;实操清单：三步建立 E-E-A-T 信号&lt;a href=&quot;#实操清单三步建立-e-e-a-t-信号&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;code&gt;/author/your-name&lt;/code&gt; 页面&lt;/li&gt;
&lt;li&gt;添加真实照片（不是图库）&lt;/li&gt;
&lt;li&gt;写清楚从业年限和专注领域&lt;/li&gt;
&lt;li&gt;提供 LinkedIn 或社交媒体链接&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;Schema 标记：Person + Article&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第二步：Schema 怎么加&lt;a href=&quot;#第二步schema-怎么加&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Person Schema（放在作者页面）&lt;/strong&gt; ：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@context&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://schema.org&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@type&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Person&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;name&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;张三&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;url&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://example.com/author/zhangsan/&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;image&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://example.com/images/zhangsan.jpg&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;jobTitle&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;SEO 技术专家&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;description&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;8 年 SEO 从业经验，专注技术 SEO 和 Schema 实现&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;sameAs&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;[&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://www.linkedin.com/in/zhangsan/&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://twitter.com/zhangsan&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;knowsAbout&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;[&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;技术 SEO&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Schema Markup&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;网站架构&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;worksFor&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;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@type&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Organization&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;name&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Example Company&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Article Schema（放在文章页面，关联作者）&lt;/strong&gt; ：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@context&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://schema.org&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@type&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Article&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;headline&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;文章标题&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;author&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;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@id&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://example.com/author/zhangsan/#person&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;datePublished&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;2026-04-26&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;dateModified&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;2026-04-26&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt; ：&lt;code&gt;@id&lt;/code&gt; 要和 Person Schema 里的 &lt;code&gt;url&lt;/code&gt; 对应，这样 Google 才能把作者和文章关联起来。&lt;/p&gt;&lt;/section&gt;&lt;section&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;每个观点配一个具体例子：「比如我们在 A 网站做了 X，结果是 Y」&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;LinkedIn 档案与网站身份一致&lt;/li&gt;
&lt;li&gt;在相关社区（如 Reddit、行业论坛）有活跃记录&lt;/li&gt;
&lt;li&gt;在其他可信网站有客座发文或被引用&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;低成本 E-E-A-T 提升方案&lt;a href=&quot;#低成本-e-e-a-t-提升方案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果你是个人博客或小型独立站，预算有限，按这个优先级做：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第一步（零成本）&lt;/strong&gt; ：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;所有文章添加署名&lt;/li&gt;
&lt;li&gt;创建作者页面，写真实背景&lt;/li&gt;
&lt;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;手动添加 Person + Article Schema（很多 SEO 插件支持）&lt;/li&gt;
&lt;li&gt;在文章中加入个人案例或测试数据&lt;/li&gt;
&lt;li&gt;建立与网站身份一致的 LinkedIn 档案&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;第三步（中等投入）&lt;/strong&gt; ：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;原创研究或数据分析（独家数据是E-E-A-T强信号）&lt;/li&gt;
&lt;li&gt;参与行业讨论，建立可见度&lt;/li&gt;
&lt;li&gt;定期更新内容，标注更新时间&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&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;E-E-A-T 信号缺失的本质是「没人对你的内容负责」。修复它不需要花钱，需要的是：&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;做好这三件事，你的内容才有可能被 AI 搜索引用，才有可能在 2026 年的搜索环境里站稳脚跟。&lt;/p&gt;&lt;hr /&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; 作者页面有外部验证链接（LinkedIn 等）&lt;/li&gt;
&lt;li&gt; 添加了 Person + Article Schema&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;hr /&gt;&lt;/section&gt;
&lt;section&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://guidelines.raterhub.com/searchqualityevaluatorguidelines.pdf&quot; target=&quot;_blank&quot;&gt;Google Search Quality Rater Guidelines&lt;/a&gt;（September 2025）&lt;/li&gt;
&lt;li&gt;SearchX：&lt;a href=&quot;https://searchxpro.com/google-quality-rater-guidelines-key-2025-updates/&quot; target=&quot;_blank&quot;&gt;Google Quality Rater Guidelines: Key 2025 Updates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>网站「内容老化」这件事，你可能一直没认真对待</title><link>https://blog.moewah.com/posts/content-decay-refresh-strategy/</link><guid isPermaLink="true">https://blog.moewah.com/posts/content-decay-refresh-strategy/</guid><description>老文章才是流量底盘，76% 的流量来自历史内容。本文教你如何用 GSC 诊断内容老化、判断哪些文章值得更新、刷新老内容的具体方法，以及更新 vs 新写的取舍策略。</description><pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;上周有个做独立站的朋友找我，说流量莫名其妙掉了 30%，但查了一圈也没发现什么技术问题。&lt;/p&gt;
&lt;p&gt;我问了他一个问题：你最近有没有看过两年前发的那些文章？&lt;/p&gt;
&lt;p&gt;他愣了一下，说没注意。&lt;/p&gt;
&lt;p&gt;打开 Google Search Console 看了看，排名下滑最狠的几篇，正好是 2022 年写的产品评测。&lt;/p&gt;
&lt;p&gt;这不是个案。很多做 SEO 的人，尤其是刚起步的，都会陷入一个误区： &lt;strong&gt;只顾着写新内容，完全忘了老文章在悄悄「老化」&lt;/strong&gt; 。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&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;HubSpot 有一组数据挺有意思：他们每个月发的 200 篇新文章，只贡献了 24% 的流量；剩下  &lt;strong&gt;76% 的流量来自老文章&lt;/strong&gt; 。如果博客团队休假一个月，流量几乎不会掉。&lt;/p&gt;&lt;p&gt;这说明什么？ &lt;strong&gt;老文章才是你的流量底盘&lt;/strong&gt; 。&lt;/p&gt;&lt;p&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;strong&gt;二是竞争对手追上来了。&lt;/strong&gt; 你当初排第一，是因为当时你写得最好。但现在别人写得更全、更深、更符合当前搜索意图，你的位置自然被挤掉。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;三是搜索意图变了。&lt;/strong&gt; 同一个关键词，两年前用户想要的是「入门教程」，今天可能想要的是「工具推荐」。你的文章没跟上这个变化，排名就会掉。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;不要凭感觉。打开 GSC，按这个流程筛查：&lt;/p&gt;&lt;section&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;在 GSC 的 Performance 报告里，选过去 12 个月的数据，按页面排序。重点看两种情况：&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;/ul&gt;&lt;/section&gt;&lt;section&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;可能原因&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;/td&gt;&lt;td&gt;对比去年同期的数据，曲线一致就是正常&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;突然某天掉了一大截&lt;/td&gt;&lt;td&gt;技术问题或算法更新&lt;/td&gt;&lt;td&gt;检查 GSC 的 Coverage 报告，看有没有索引问题&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;第三方工具排名没变，但 GSC 点击掉了&lt;/td&gt;&lt;td&gt;SERP 变化（比如出了 AI 概览）&lt;/td&gt;&lt;td&gt;搜索一下目标关键词，看结果页有没有新元素&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&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;评分标准（0-3分）&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;关键词排名&lt;/td&gt;&lt;td&gt;还在前 10 名 = 3，掉到第二页 = 1，已经没排名 = 0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;外链数量&lt;/td&gt;&lt;td&gt;有优质外链 = 3，有一些但质量一般 = 1，几乎没有 = 0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;转化表现&lt;/td&gt;&lt;td&gt;有转化贡献 = 3，流量有但没转化 = 1，两者都没 = 0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;战略价值&lt;/td&gt;&lt;td&gt;核心主题页面 = 3，边缘话题 = 1，已经偏离业务方向 = 0&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;strong&gt;7-9 分&lt;/strong&gt; ：必须更新，这是你的核心资产&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;4-6 分&lt;/strong&gt; ：可以更新，但优先级不高&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;0-3 分&lt;/strong&gt; ：直接 301 重定向到相关页面，或者干脆删掉&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;更新老内容 vs 写新内容，怎么取舍&lt;a href=&quot;#更新老内容-vs-写新内容怎么取舍&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这是很多人纠结的问题。答案不是「二选一」，而是「按比例分配」。&lt;/p&gt;&lt;p&gt;HubSpot 给过一个建议： &lt;strong&gt;如果你博客已经运营超过 2 年，至少把 20-30% 的精力放在历史内容优化上&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;ul&gt;
&lt;li&gt;页面本身有排名基础（至少在前 20）&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;ul&gt;
&lt;li&gt;这是一个全新的话题，你之前没有覆盖&lt;/li&gt;
&lt;li&gt;搜索意图明显转向了新方向（比如用户开始搜索「AI 工具」而不是「人工操作」）&lt;/li&gt;
&lt;li&gt;竞争对手已经写了很全面的内容，你很难通过小修小补追上去&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;举个例子：你有一篇 2021 年写的「外贸独立站建站指南」，现在排名掉到了第 15 位。这时候你面临两个选择——&lt;/p&gt;&lt;p&gt;A. 更新这篇文章，补上 2024 年的平台政策、新工具、新流程
B. 写一篇全新的「2024 外贸独立站建站完整攻略」&lt;/p&gt;&lt;p&gt;如果原来的文章有外链、有排名基础，选 A。你花 2 小时更新，可能一周内排名就能回升。写新文章，从零开始积累权重，至少要 3 个月才能见效。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;不要只改个日期就重新发布。Google 看的不是「日期变新」，而是「内容是否更好地回答了当前的搜索意图」。&lt;/p&gt;&lt;p&gt;我一般按这个清单来：&lt;/p&gt;&lt;section&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;ul&gt;
&lt;li&gt;统计数据换成最新版本（比如 2021 年的行业数据 → 2024 年）&lt;/li&gt;
&lt;li&gt;产品型号/价格换成当前版本&lt;/li&gt;
&lt;li&gt;过时的案例换成新的案例（比如某个工具已经倒闭了，换成替代品）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;ul&gt;
&lt;li&gt;如果原文章是长段落，拆成小段 + 小标题&lt;/li&gt;
&lt;li&gt;补上当时没覆盖的角度（比如当初只写了优点，现在补上缺点对比）&lt;/li&gt;
&lt;li&gt;加上常见问题 FAQ 模块&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;p&gt;看看当前排在前面的竞争对手写了什么。他们覆盖了你没写的，就补上。&lt;/p&gt;&lt;p&gt;比如你当初写「SEO 工具推荐」，没提 AI 工具。现在竞品文章都写了，你就得加一段。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;这样做的好处是： &lt;strong&gt;让搜索引擎重新识别这篇文章在整个内容体系里的位置&lt;/strong&gt; 。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;section&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;Google 需要时间重新抓取和评估。刷新后第一天看排名没变化，不要急。&lt;/p&gt;&lt;/section&gt;&lt;section&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;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;GSC Performance&lt;/td&gt;&lt;td&gt;相比刷新前提升 3 位以上&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;点击率&lt;/td&gt;&lt;td&gt;GSC Performance&lt;/td&gt;&lt;td&gt;相比刷新前提升 5% 以上&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;转化数&lt;/td&gt;&lt;td&gt;GA4 或你的 CRM&lt;/td&gt;&lt;td&gt;相比刷新前提升或持平&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&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;p&gt;可能你更新的力度不够，或者搜索意图已经完全变化了。这时候考虑：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;再做一轮更深入的更新（补更多内容、重写部分段落）&lt;/li&gt;
&lt;li&gt;或者放弃更新，写一篇新文章覆盖这个关键词&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;/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;hr /&gt;&lt;/section&gt;
&lt;section&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;Search Engine Land：&lt;a href=&quot;https://searchengineland.com/guide/content-decay&quot; target=&quot;_blank&quot;&gt;Content Decay: What It Is &amp;amp; How to Reverse Traffic Drops&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;HubSpot：&lt;a href=&quot;https://blog.hubspot.com/marketing/historical-blog-seo-conversion-optimization&quot; target=&quot;_blank&quot;&gt;The Blogging Tactic No One Is Talking About: Optimizing the Past&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Search Engine Journal：&lt;a href=&quot;https://www.searchenginejournal.com/how-to-uncover-traffic-declines-in-google-search-console-and-how-to-fix-them/516668/&quot; target=&quot;_blank&quot;&gt;How To Uncover Traffic Declines In Google Search Console&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;thekingofsearch：&lt;a href=&quot;https://aiandsearchnews.com/content-decay-solved-a-framework-for-refreshing-old-seo-content/&quot; target=&quot;_blank&quot;&gt;Content Decay Solved - A Framework For Refreshing Content&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>AI检测AI：一个值得怀疑的闭环</title><link>https://blog.moewah.com/posts/ai-detection-loop-suspicion/</link><guid isPermaLink="true">https://blog.moewah.com/posts/ai-detection-loop-suspicion/</guid><description>对AI检测工具的怀疑：不透明的标准、数据去向问题、检测结果可信度，提出跳出循环的应对思路</description><pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;上周测试了一款 AI 检测工具。三篇文章，每次都提示”有 AI 痕迹”。调整措辞、修改句式、增加细节——再测，还是”有痕迹”。&lt;/p&gt;
&lt;p&gt;折腾几轮后我意识到一件事：&lt;strong&gt;这会不会是一个精心设计的闭环？&lt;/strong&gt;&lt;/p&gt;
&lt;section&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;检测工具的输出极其简洁：一个百分比分数，外加”有/无 AI 痕迹”。&lt;strong&gt;它不会告诉你具体哪句话触发了判定，依据什么逻辑得出结论。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;用户只能盲改。改了测，测了改，像在黑暗中摸索。&lt;/p&gt;&lt;p&gt;我统计了自己五次调整的过程：累计修改 27 处，平均每次 5.4 处。改动包括句式重组、词汇替换、细节增删。但工具给出的反馈始终是一个冷冰冰的数字。&lt;/p&gt;&lt;p&gt;没有可验证的标准，没有可追溯的逻辑。这个过程本身，就值得警惕。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;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;/section&gt;
&lt;section&gt;&lt;h2&gt;用 AI 判断 AI，谁来验证？&lt;a href=&quot;#用-ai-判断-ai谁来验证&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;更深层的问题是：检测结果本身可信吗？&lt;/p&gt;&lt;p&gt;检测工具本身是 AI 产品。用 AI 检测 AI，这个闭环里，“检测结果”是由 AI 生成的判断。&lt;/p&gt;&lt;p&gt;我查阅了几款主流检测工具的技术文档。公开信息极少，核心算法全部以”商业机密”为由不予披露。没有独立验证，没有开源审计，没有第三方测试基准。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;“这段文字有 87% 的 AI 痕迹”——这个结论由谁背书？如果答案是 AI 自己，那它本身就是一种”AI 判断”，而非客观事实。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;用户信了这个判断，就会继续调整、继续提交、继续产生数据。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;假设检测准确率是 90%（这个数字已经相当乐观），那么：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;检测 100 篇文章，10 篇会被误判&lt;/li&gt;
&lt;li&gt;这 10 篇误判文章的作者，会开始调整、再提交&lt;/li&gt;
&lt;li&gt;每篇平均调整 3 次，产生 30 份新的训练数据&lt;/li&gt;
&lt;li&gt;这 30 份数据进入模型，用于”优化”检测器&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;但问题在于：那 10 篇本来就是误判。基于误判进行的”优化”，方向对吗？&lt;/p&gt;&lt;p&gt;没有人知道。因为整个流程都是黑箱。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;p&gt;&lt;strong&gt;如果检测工具真的在用用户数据反向训练，那不断调整反倒在帮它。不如跳出这个循环，按自己的标准写。&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;AI 检测 AI，本身就是一个悖论。检测器是 AI，被检测的也是 AI。谁来判断谁？谁来监督裁判？&lt;/p&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;/blockquote&gt;&lt;/section&gt;</content:encoded></item><item><title>长上下文的副作用：模型安全护栏为何会失效</title><link>https://blog.moewah.com/posts/long-context-safety-guardrails/</link><guid isPermaLink="true">https://blog.moewah.com/posts/long-context-safety-guardrails/</guid><description>使用 DeepSeek 时发现长对话会削弱模型安全护栏，引用 Anthropic Many-shot Jailbreaking 研究，解释上下文学习如何覆盖安全训练,给出三条实用建议</description><pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;用 DeepSeek 处理一个长文档的时候，我发现一件奇怪的事。&lt;/p&gt;
&lt;p&gt;聊着聊着，模型的安全护栏好像变松了。起初我以为是自己多心，毕竟谁会怀疑一个经过层层安全训练的模型呢？&lt;/p&gt;
&lt;p&gt;我做了个简单测试——同样的敏感问题，分别在短对话和长对话里问。结果有点意思：长对话里，模型更容易放行。&lt;/p&gt;
&lt;p&gt;脑子里蹦出一个词：&lt;strong&gt;上下文稀释&lt;/strong&gt;。&lt;/p&gt;
&lt;section&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;去翻了翻论文，发现 Anthropic 在 2024 年 4 月发了一项研究，叫”Many-shot Jailbreaking”（多样本越狱攻击）。&lt;/p&gt;&lt;p&gt;核心发现很简单：&lt;strong&gt;当上下文窗口里塞了大量示例对话时，模型的安全训练会被逐渐覆盖&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;研究者测了 256 个伪造对话的场景。随着”示例”数量增加，模型返回有害回答的概率明显上升。某些情况下攻击成功率高达 61%。&lt;/p&gt;&lt;p&gt;更关键的是，&lt;strong&gt;模型越大，越容易被这样搞&lt;/strong&gt;。因为大模型的上下文学习能力更强——这本是优点，却成了攻击的切入点。&lt;/p&gt;&lt;p&gt;论文里有段话我看了好几遍：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;上下文学习是指 LLM 仅使用提示词中提供的信息进行学习，而无需后续微调。多样本越狱攻击可以被视为上下文学习的一个特例。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;翻译成人话：模型不会区分哪些示例该学，哪些该忽略。它就是照单全收。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;p&gt;就像一个人在嘈杂环境里待久了，对某些信号的敏感度会下降。不是他变坏了，是环境稀释了他的判断基准。&lt;/p&gt;&lt;p&gt;Anthropic 的研究还提到一个细节：&lt;strong&gt;缓解措施里最有效的是”提示词预处理分类”，不是微调&lt;/strong&gt;。微调只能延迟攻击，没法从根本上解决问题。这从侧面说明，问题的根源不在模型的”知识”，在上下文的”环境”。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;strong&gt;敏感任务，短对话优先。&lt;/strong&gt; 涉及隐私、安全、合规的话题，尽量在干净的上下文里聊，别让它”积累惯性”。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;警惕示例污染。&lt;/strong&gt; 如果你习惯给模型喂大量示例来调教输出风格，注意这些示例可能无意中改变了模型的行为边界。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;验证，再验证。&lt;/strong&gt; 长对话里的回答，尤其是涉及判断的内容，最好在短对话里交叉验证一下。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;AI 安全不是静态目标，是动态平衡&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;长上下文是技术进步，让模型能处理更复杂的任务、理解更长的文档。但每一项进步，都可能带来新的盲区。&lt;/p&gt;&lt;p&gt;Anthropic 在论文最后写了句话：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;即使是对 LLM 的积极、看似无害的改进，有时也可能带来意想不到的后果。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;这次发现让我对”安全”两个字有了更深的理解：它不是一堵墙，而是一个需要持续维护的过程。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;参考：&lt;a href=&quot;https://www.anthropic.com/research/many-shot-jailbreaking&quot; target=&quot;_blank&quot;&gt;Many-shot Jailbreaking - Anthropic Research&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>我们如何证明自己真实存在</title><link>https://blog.moewah.com/posts/how-to-prove-we-truly-exist/</link><guid isPermaLink="true">https://blog.moewah.com/posts/how-to-prove-we-truly-exist/</guid><description>睡前偶尔会质疑自己的存在是真实还是虚拟。当机器也能思考，人类如何证明当下？从《西部世界》到时间倍速感，探讨怀疑本身可能是活着的证据。</description><pubDate>Sun, 29 Mar 2026 00:00: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;
&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;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;
&lt;p&gt;也许证明本身就是伪命题。你不会去证明自己在呼吸，你只是呼吸。你不会去证明自己感到疼，你只是疼。&lt;strong&gt;怀疑自己是否存在这件事，本身就是一个只有活着的人才会做的事。&lt;/strong&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></item><item><title>核心网页指标不达标怎么办？三种情况诊断与优化方向</title><link>https://blog.moewah.com/posts/core-web-vitals-diagnosis-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/core-web-vitals-diagnosis-guide/</guid><description>看到Search Console飘红就慌？43%网站INP未达标，但不等于降权。本文分三种站点类型（WordPress、静态站、自建），详解LCP、INP、CLS达标标准与针对性优化方案。</description><pubDate>Wed, 25 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近帮几个朋友查站点的 &lt;strong&gt;Core Web Vitals （核心网页指标）&lt;/strong&gt; 数据，发现一个有意思的现象：很多人看到 Search Console 里飘红的”INP issue”就紧张，觉得自己网站要被降权了。&lt;/p&gt;
&lt;p&gt;其实没那么严重。&lt;/p&gt;
&lt;p&gt;但也不是说可以完全不管。 &lt;strong&gt;CWV （Core Web Vitals 的简称）&lt;/strong&gt; 这事，理解清楚比瞎优化更重要。&lt;/p&gt;
&lt;section&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;Google 用三个指标来判断你网站的用户体验。说白了，就是测三件事：加载够不够快、交互够不够灵敏、页面够不够稳。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;LCP：页面主内容加载速度&lt;a href=&quot;#lcp页面主内容加载速度&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Largest Contentful Paint（最大内容绘制）&lt;/strong&gt; ，测的是页面主内容呈现的速度。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;标准&lt;/strong&gt; ：2.5 秒以内算”良好”，超过 4 秒就是”差”。&lt;/p&gt;&lt;p&gt;有意思的是，LCP 是三个指标里最难通过的。根据 corewebvitals.io 的数据，只有 &lt;strong&gt;62% 的移动页面&lt;/strong&gt; 能达到良好标准。&lt;/p&gt;&lt;p&gt;常见拖后腿的原因：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;大图片没优化，加载慢&lt;/li&gt;
&lt;li&gt;服务器响应慢（首字节时间 TTFB 高）&lt;/li&gt;
&lt;li&gt;关键资源没预加载&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;INP：用户交互响应速度&lt;a href=&quot;#inp用户交互响应速度&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Interaction to Next Paint（交互到下一次绘制）&lt;/strong&gt; ，测的是用户点击按钮后，界面多久给出反馈。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;标准&lt;/strong&gt; ：200 毫秒以内算”良好”，超过 500 毫秒就是”差”。&lt;/p&gt;&lt;p&gt;这个指标在 2024 年 3 月刚取代了旧的 FID，成为官方 CWV 指标。很多站点还没来得及调整。&lt;/p&gt;&lt;p&gt;DebugBear 2025 年的全球数据显示： &lt;strong&gt;43% 的网站 INP 未达标&lt;/strong&gt; 。这是目前最容易失败的指标。&lt;/p&gt;&lt;p&gt;为什么 INP 这么难搞？因为它测的是真实用户在你的网站上实际点击了什么、点了多久。实验室工具（比如 Lighthouse）根本测不出来。你的 INP 数据只能从 Google 的 CrUX 数据库获取——那是真实 Chrome 用户的数据。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;CLS：页面布局稳定性&lt;a href=&quot;#cls页面布局稳定性&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Cumulative Layout Shift（累积布局偏移）&lt;/strong&gt; ，测的是页面加载过程中元素乱跳的程度。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;标准&lt;/strong&gt; ：偏移值 0.1 以内算”良好”，超过 0.25 就是”差”。&lt;/p&gt;&lt;p&gt;这个指标最容易过。81% 的移动页面都能达到良好标准。&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;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;CWV 通过的标准其实没那么苛刻&lt;a href=&quot;#cwv-通过的标准其实没那么苛刻&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;很多人以为 CWV 要 100% 的用户都达标才能过。其实不是。&lt;/p&gt;&lt;p&gt;Google 的标准是： &lt;strong&gt;至少 75% 的真实用户访问达到”良好”级别，就算通过&lt;/strong&gt; 。&lt;/p&gt;&lt;p&gt;为什么用 75 百分位？因为它覆盖了大多数用户体验，但又不会因为少数极端情况（比如用户手机特别烂）就把你判失败。&lt;/p&gt;&lt;p&gt;换个角度看：你的站点要对绝大多数用户表现良好，但不能指望每个用户都是高端设备、快速网络。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;43% 的站点 INP 失败，这数据说明了什么？&lt;a href=&quot;#43-的站点-inp-失败这数据说明了什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这个数字看起来挺吓人，但得拆开看。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;全球差异巨大&lt;/strong&gt; 。&lt;/p&gt;&lt;p&gt;美国用户的平均 INP 约 100ms，达标很容易。但在尼日利亚，平均 INP 达到 275ms，最慢的那 10% 网站甚至超过 500ms。&lt;/p&gt;&lt;p&gt;这不是网站本身的问题，而是设备差异。高端手机在美国很普及，但在低收入国家，大部分人用的是低端设备——处理器慢，内存小，JS 执行自然就卡。&lt;/p&gt;&lt;p&gt;所以如果你的站点 INP 数据不好，先看看你的用户分布。如果你的访客主要来自欧美，INP 可能比你想象的好。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;另一个视角&lt;/strong&gt; ：排名位置与 CWV 通过率有相关性，但不是因果关系。&lt;/p&gt;&lt;p&gt;DebugBear 的分析显示，排名第 1 的页面 CWV 通过率比第 9 位高 10%。但这不是说 CWV 好就能排名靠前——相关性不等于因果。&lt;/p&gt;&lt;p&gt;CWV 好的网站，通常整体体验也好，内容也扎实，所以排名高。CWV 只是其中一个加分项。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;去哪里看自己的 CWV 数据？&lt;a href=&quot;#去哪里看自己的-cwv-数据&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;最直接的入口是  &lt;strong&gt;Google Search Console&lt;/strong&gt; 。&lt;/p&gt;&lt;p&gt;左侧菜单 → “体验” → “Core Web Vitals”，你会看到三个指标的报告，分移动端和电脑端两种。&lt;/p&gt;&lt;p&gt;状态分三类：良好、需改进、失败。每种状态都会列出涉及的 URL 数量，点击进去能看到具体是哪些页面。&lt;/p&gt;&lt;p&gt;但 Search Console 只告诉你”有问题”，不告诉你”哪里有问题”。比如 INP 失败，它不会告诉你是哪个按钮响应慢。&lt;/p&gt;&lt;p&gt;要深入诊断，得用 &lt;strong&gt;PageSpeed Insights&lt;/strong&gt; （pagespeed.web.dev）。输入 URL，它会结合真实用户数据（CrUX）和实验室数据（Lighthouse）给出分析。&lt;/p&gt;&lt;p&gt;不过有个坑：INP 是真实用户数据，Lighthouse 测不了。Lighthouse 的 Total Blocking Time（TBT）跟 INP 有相关性，但 TBT 好 ≠ INP 好。&lt;/p&gt;&lt;p&gt;如果你想知道具体哪个交互慢，得用真实用户监控工具（RUM），比如 DebugBear，或者自己用 Google 的 web-vitals 库埋点。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;不同站点类型怎么优化？&lt;a href=&quot;#不同站点类型怎么优化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;WordPress 站点&lt;a href=&quot;#wordpress-站点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;WordPress 在 CWV 上有个尴尬的现实：2025 年 Search Engine Journal 的 CMS CWV 排名里，WordPress 的 INP 良好率只有 85.89%，排名第五，和倒数第一的 Drupal 差不多。&lt;/p&gt;&lt;p&gt;问题根源：插件太多、主题太重、第三方脚本堆叠。&lt;/p&gt;&lt;p&gt;优化方向：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;缓存插件必装&lt;/strong&gt; 。WP Rocket 或 LiteSpeed Cache 是主流选择。LiteSpeed Cache 有服务器级缓存，比文件缓存更快，而且免费。2025 年的实测结论是 LiteSpeed Cache 和 FlyingPress 在 CWV 上表现比 WP Rocket 更好。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;图片优化&lt;/strong&gt; 。上 WebP 格式，压缩体积，给关键图片加预加载。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;脚本精简&lt;/strong&gt; 。审查 Google Tag Manager 里埋了多少追踪器，异步加载非关键脚本。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;静态站点（Hugo、Jekyll、Astro）&lt;a href=&quot;#静态站点hugojekyllastro&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;静态站点天然优势：无数据库查询、无动态渲染、部署到 CDN 后首字节时间极低。&lt;/p&gt;&lt;p&gt;Hugo 和 Jekyll 这类静态生成器，生成的是纯 HTML 文件，直接返回给用户。LCP 和 CLS 通常不会有大问题。&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;Astro 这类框架更进一步：默认零 JS 输出，只有需要交互的组件才加载 JS。INP 通常很好。&lt;/p&gt;&lt;/section&gt;&lt;section&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;TTFB 是基础&lt;/strong&gt; 。服务器响应慢，后面怎么优化都没用。上 CDN，优化数据库查询，用缓存。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;前端精简&lt;/strong&gt; 。CSS/JS 压缩，关键 CSS 内联，非关键资源异步加载。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;字体策略&lt;/strong&gt; 。自托管字体 + &lt;code&gt;font-display: optional&lt;/code&gt; 或 &lt;code&gt;swap&lt;/code&gt;，避免字体加载导致布局跳动。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;CWV 是排名因素，但不是主导因素。CWV 好能给排名加分，但 CWV 差不会直接扣分降权。&lt;/p&gt;&lt;p&gt;Google 官方文档写得明白：CWV 是 Page Experience 的一部分，但 Page Experience 只是众多排名信号之一。内容质量、相关性、权威性，这些才是大头。&lt;/p&gt;&lt;p&gt;正确的理解是：CWV 不达标，你的站点在”用户体验”这个维度上竞争力不足。排名可能不会掉，但同等条件下，CWV 更好的对手会更有优势。&lt;/p&gt;&lt;p&gt;换个角度：CWV 好的站点，转化率通常更高。Vodafone 的案例——LCP 改善 31%，销售增长 8%，线索增加 15%，购物车转化提升 11%。这才是 CWV 优化的真正价值。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;打开 Search Console，看看 CWV 报告。三个指标都良好就不用折腾。&lt;/li&gt;
&lt;li&gt;有失败的指标，先看是 LCP、INP 还是 CLS。&lt;/li&gt;
&lt;li&gt;LCP 失败：优化图片、上 CDN、检查 TTFB。&lt;/li&gt;
&lt;li&gt;INP 失败：精简 JS、异步加载第三方脚本、审查事件处理器。&lt;/li&gt;
&lt;li&gt;CLS 失败：给图片设宽高、字体自托管、动态内容预留空间。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;CWV 这事，别焦虑，也别忽视。搞清楚问题在哪，针对性解决，比盲目优化靠谱。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;DebugBear：&lt;a href=&quot;https://www.debugbear.com/blog/global-inp-statistics&quot; target=&quot;_blank&quot;&gt;Website INP Scores In 2025: UX Impact Across The World&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;corewebvitals.io：&lt;a href=&quot;https://www.corewebvitals.io/core-web-vitals&quot; target=&quot;_blank&quot;&gt;What Are the Core Web Vitals? LCP, INP &amp;amp; CLS Explained (2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Search Engine Journal：&lt;a href=&quot;https://www.searchenginejournal.com/2025-core-web-vitals-cms-rankings/552679/&quot; target=&quot;_blank&quot;&gt;2025 Core Web Vitals Challenge: WordPress Versus Everyone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Online Media Masters：&lt;a href=&quot;https://onlinemediamasters.com/cache-plugins/&quot; target=&quot;_blank&quot;&gt;LiteSpeed Cache vs WP Rocket 2026&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>孤立页面是什么？那些被遗忘的页面正在拖垮你的SEO</title><link>https://blog.moewah.com/posts/orphan-pages-seo-fix/</link><guid isPermaLink="true">https://blog.moewah.com/posts/orphan-pages-seo-fix/</guid><description>做了大量内容优化，有些页面流量却迟迟不涨？可能是站内有页面无内链入口。本文用Screaming Frog和Ahrefs排查，通过Pillar-Cluster模型重建内链结构。</description><pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;做了那么多内容优化、外链建设，为什么有些页面流量迟迟不涨？&lt;/p&gt;
&lt;p&gt;你可能忽略了一个隐蔽但致命的问题：&lt;strong&gt;Orphan Pages（孤立页面）&lt;/strong&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;什么是 Orphan Pages？&lt;a href=&quot;#什么是-orphan-pages&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;简单说，Orphan Pages 是网站上没有任何内链指向的页面。&lt;/p&gt;&lt;p&gt;搜索引擎爬虫通过链接发现内容。如果一个页面在站内没有任何链接入口，爬虫只能通过两种方式找到它：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;XML Sitemap 文件&lt;/li&gt;
&lt;li&gt;外部网站的 backlink&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;用户更惨。除非知道精确 URL，否则根本无法访问这些页面。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;为什么这个问题隐蔽？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;因为孤立页面往往不是”故意”创建的。它们更多是网站迁移、导航重构、产品下架后的遗留物。正常流程下，你不会意识到它们的存在——直到流量数据出现异常。&lt;/p&gt;&lt;p&gt;Search Engine Land 曾报道过一个案例：某电商网站大规模下架产品后，相关页面一夜之间全部变成孤立页面，流量暴跌。团队最初以为是技术 SEO 问题，排查后才发现真正原因：产品页面还在，但所有内链入口已删除。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Orphan Pages 的 SEO 影响&lt;a href=&quot;#orphan-pages-的-seo-影响&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;Google 通过内链传递 PageRank 和相关性信号。孤立页面无法接收这些”投票”，排名潜力天然受限。&lt;/p&gt;&lt;p&gt;即使页面被索引（通过 sitemap 或外部链接），没有内链支撑，也很难获得好的排名位置。&lt;/p&gt;&lt;/section&gt;&lt;section&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;Google 的爬虫有爬取预算（Crawl Budget）。如果页面需要从首页点击 4 次以上才能到达，爬虫会认为它不重要，减少甚至放弃爬取。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Search Engine Land 指出：页面超过 4 次点击深度后，重要性感知显著下降。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;孤立页面的爬取深度技术上是”无限”的——根本没有入口路径。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;用户无法通过正常导航找到这些内容。即使内容本身有价值，也无法转化为流量。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;如何发现孤立页面？&lt;a href=&quot;#如何发现孤立页面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;方法一：Screaming Frog SEO Spider&lt;a href=&quot;#方法一screaming-frog-seo-spider&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;ol&gt;
&lt;li&gt;打开 Screaming Frog，进入 Configuration → Spider&lt;/li&gt;
&lt;li&gt;启用”Crawl XML Sitemap”选项（或手动提交 sitemap URL）&lt;/li&gt;
&lt;li&gt;进入 Configuration → API Access，连接 Google Analytics 4 和 Google Search Console&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;爬取完成后，切换到”Links”标签页，查看”Crawl Depth”列。 &lt;strong&gt;空白值即为孤立页面&lt;/strong&gt; ——因为没有内链路径，无法计算点击深度。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;方法二：Ahrefs Site Audit&lt;a href=&quot;#方法二ahrefs-site-audit&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果你使用 Ahrefs Webmaster Tools（免费），可以通过 Page Explorer 直接筛选：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;进入 Site Audit → Page Explorer&lt;/li&gt;
&lt;li&gt;点击”Links”过滤器&lt;/li&gt;
&lt;li&gt;选择”Orphan pages”&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这个功能会自动比对 sitemap 中的 URL 和实际有内链的 URL，列出差异。&lt;/p&gt;&lt;/section&gt;&lt;section&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;Ahrefs 官方推荐的方法：用 Google Sheet 交叉比对两个数据源。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;数据源 A&lt;/strong&gt;：可爬取 URL（来自爬虫工具）
&lt;strong&gt;数据源 B&lt;/strong&gt;：有访问的 URL（来自 GA4 / GSC / 服务器日志）&lt;/p&gt;&lt;p&gt;公式示例：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;=UNIQUE(FILTER(hits!A:A, ISNA(MATCH(hits!A:A, crawl!A:A, 0))))&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;输出结果是：有访问但无内链入口的页面。这些就是真正的孤立页面。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;内链结构规划：Pillar-Cluster 模型&lt;a href=&quot;#内链结构规划pillar-cluster-模型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;修复孤立页面，不是简单地”随便加几个链接”。需要系统性的内链规划。&lt;/p&gt;&lt;p&gt;推荐使用 &lt;strong&gt;Hub-and-Spoke（支柱-集群）模型&lt;/strong&gt;：&lt;/p&gt;&lt;section&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;Hub（支柱页）&lt;/strong&gt;：覆盖一个主题的综合性页面&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spoke（集群页）&lt;/strong&gt;：深入探讨某个子话题的详细页面&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;/ul&gt;&lt;/section&gt;&lt;section&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;Search Engine Land 建议：所有重要页面应在 &lt;strong&gt;3 次点击&lt;/strong&gt; 内可达。&lt;/p&gt;&lt;p&gt;支柱页从首页链接，集群页从支柱页链接，形成清晰的层级结构。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;修复孤立页面的实操步骤&lt;a href=&quot;#修复孤立页面的实操步骤&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Step 1：评估页面价值&lt;a href=&quot;#step-1评估页面价值&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;处理方式&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;/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;内容重复或低质量&lt;/td&gt;&lt;td&gt;合并到现有页面，301 重定向&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;无价值、无流量、无外链&lt;/td&gt;&lt;td&gt;直接删除（返回 404）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;有意隔离（如广告着陆页）&lt;/td&gt;&lt;td&gt;添加 noindex 标签&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Step 2：添加内链&lt;a href=&quot;#step-2添加内链&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;ol&gt;
&lt;li&gt;同主题的高流量页面（GSC 数据可查）&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;：使用 site 搜索快速定位相关页面：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;site:yourdomain.com &quot;关键词&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Step 3：验证修复效果&lt;a href=&quot;#step-3验证修复效果&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;Google Search Console&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;检查 URL Inspection 工具，确认页面被正确爬取&lt;/li&gt;
&lt;li&gt;观察”Discovered - currently not indexed”状态是否变化&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;爬虫工具复查&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;重新运行 Screaming Frog，确认 Crawl Depth 有数值&lt;/li&gt;
&lt;li&gt;检查 Inlinks 列，确认有内链记录&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;数据追踪&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;在 GSC 记录修复前后的 impressions 和 clicks&lt;/li&gt;
&lt;li&gt;预期：impressions 上升 → clicks 上升（周期约2-4周）&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;防止未来出现孤立页面&lt;a href=&quot;#防止未来出现孤立页面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;是否已从至少 1 个现有页面添加内链&lt;/li&gt;
&lt;li&gt;是否已加入 XML Sitemap&lt;/li&gt;
&lt;li&gt;是否已出现在相关主题的支柱页链接列表&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;建议每月运行一次 Site Audit，检查”Incoming Internal Links = 0”的页面。&lt;/p&gt;&lt;p&gt;Semrush、Ahrefs、Moz、Sitebulb 都有内置的孤立页面报告功能。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;迁移 checklist 必须包含：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;全部旧 URL 是否已正确重定向&lt;/li&gt;
&lt;li&gt;新站点导航是否覆盖所有重要页面&lt;/li&gt;
&lt;li&gt;新站点内链结构是否完整&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;Orphan Pages 是 SEO 中容易被忽视的问题。&lt;/p&gt;&lt;p&gt;它不像 404 错误那样显眼，不像重复内容那样容易被工具标记。但它确实在悄悄消耗你的内容价值——那些精心创作的页面，因为没有内链入口，根本无法被搜索引擎和用户发现。&lt;/p&gt;&lt;p&gt;排查一次，修复一次，建立预防机制。&lt;/p&gt;&lt;p&gt;这是一个”低频但高价值”的优化动作。投入几小时的排查工作，可能挽救成百上千页面的流量潜力。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;Ahrefs: &lt;a href=&quot;https://ahrefs.com/blog/orphan-pages/&quot; target=&quot;_blank&quot;&gt;How to Find and Fix Orphan Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Search Engine Land: &lt;a href=&quot;https://searchengineland.com/internal-linking-blogger-mistakes-444009&quot; target=&quot;_blank&quot;&gt;Internal linking for bloggers: 9 mistakes to fix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Search Engine Land: &lt;a href=&quot;https://searchengineland.com/guide/website-structure&quot; target=&quot;_blank&quot;&gt;Site Architecture for SEO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Backlinko: &lt;a href=&quot;https://backlinko.com/orphan-pages&quot; target=&quot;_blank&quot;&gt;Orphan Pages Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>MoeHome 开源个人主页：纯静态、配置驱动、零运行时依赖</title><link>https://blog.moewah.com/posts/moehome-personal-website-open-source-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/moehome-personal-website-open-source-guide/</guid><description>如何打造一个零运行时依赖的极简个人主页？本文详细拆解MoeHome项目从配置驱动到动态内容集成的全流程，涵盖RSS聚合、Memos动态流和终端风格留言板，助你构建高性能品牌入口。</description><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;说实话，2026 年初我做了一个决定：把博客迁移到二级域名。&lt;/p&gt;
&lt;p&gt;你知道为什么吗？两个原因：一是 Typecho 不再适合纯静态页面方案，而 Astro 在社区里越来越活跃：二是我想在迁移过程中，把那些陈旧的内容重新筛一遍。&lt;/p&gt;
&lt;p&gt;但事情的发展，真的超出了我的预期。&lt;/p&gt;
&lt;section&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;/p&gt;&lt;p&gt;我知道我面临一个抉择：必须趁早清空旧站点的页面。但我还没准备好新内容。不过，我已经有了清晰的规划。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;定位：个人品牌的中心化入口&lt;a href=&quot;#定位个人品牌的中心化入口&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;旧站点不再是一个“博客”，而是一个精心设计的数字名片——将分散的社交资产（GitHub、Twitter、博客、音乐品味）聚合为统一的品牌体验。&lt;/p&gt;&lt;p&gt;&lt;img loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;3069&quot; src=&quot;/_astro/MoeHome-FullPage.CqAqniph_1dzfU1.webp&quot; srcset=&quot;/_astro/MoeHome-FullPage.CqAqniph_1ToGUv.webp 640w, /_astro/MoeHome-FullPage.CqAqniph_ldCH2.webp 750w, /_astro/MoeHome-FullPage.CqAqniph_o2P6i.webp 828w, /_astro/MoeHome-FullPage.CqAqniph_1RdajI.webp 1080w, /_astro/MoeHome-FullPage.CqAqniph_Z2kJX6A.webp 1280w, /_astro/MoeHome-FullPage.CqAqniph_1HrF55.webp 1668w, /_astro/MoeHome-FullPage.CqAqniph_1dzfU1.webp 1920w&quot; /&gt;&lt;/p&gt;&lt;section&gt;&lt;h3&gt;第一版规划：终端风格 + RSS+GitHub+链接导航&lt;a href=&quot;#第一版规划终端风格--rssgithub链接导航&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;最初的想法很简单：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;模拟终端风格作为个人介绍&lt;/li&gt;
&lt;li&gt;通过 RSS 地址获取最新博客文章&lt;/li&gt;
&lt;li&gt;展示 GitHub 个人项目&lt;/li&gt;
&lt;li&gt;增加链接导航板块，用字体图标+卡片形式展示主流社交平台&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;但慢慢地，我觉得这个方案缺少点什么。&lt;/p&gt;&lt;/section&gt;&lt;section&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;刚好，我一直在用 Memos 记录碎片化想法，体验真的很棒。为了达成品牌风格的一致性，我决定：&lt;strong&gt;通过 Memos 的 API 作为动态信息流，它支持标签筛选。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这样，主页就能实时展示我最近的思考和分享，不再是一潭死水。&lt;/p&gt;&lt;p&gt;&lt;img loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;2676&quot; src=&quot;/_astro/MoeHome-moment.Cq5UE_O2_ZX0uoK.webp&quot; srcset=&quot;/_astro/MoeHome-moment.Cq5UE_O2_1dV7KT.webp 640w, /_astro/MoeHome-moment.Cq5UE_O2_Z1rulEr.webp 750w, /_astro/MoeHome-moment.Cq5UE_O2_Z114Il4.webp 828w, /_astro/MoeHome-moment.Cq5UE_O2_1DQKbD.webp 1080w, /_astro/MoeHome-moment.Cq5UE_O2_Z1jV2Cu.webp 1280w, /_astro/MoeHome-moment.Cq5UE_O2_Z9Nu5O.webp 1668w, /_astro/MoeHome-moment.Cq5UE_O2_ZX0uoK.webp 1920w&quot; /&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&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;我需要接受外界的「信号」，留言页面也就此诞生。筛选了几个开源评论系统后，最终选择集成 Waline 和 Artalk 两种方案，体验一致，切换自由。&lt;/p&gt;&lt;p&gt;为了让留言板与整体设计风格统一，我选择独立于项目的 UI 方案，打造了一个终端风格的弹幕交互界面。讲真，这是我觉得做得最厚重的一块。&lt;/p&gt;&lt;p&gt;&lt;img loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;977&quot; src=&quot;/_astro/MoeHome-guestbook.DFl-tTWm_1FvO7E.webp&quot; srcset=&quot;/_astro/MoeHome-guestbook.DFl-tTWm_5y4St.webp 640w, /_astro/MoeHome-guestbook.DFl-tTWm_Z2whtOK.webp 750w, /_astro/MoeHome-guestbook.DFl-tTWm_Z1vl07a.webp 828w, /_astro/MoeHome-guestbook.DFl-tTWm_CGSlN.webp 1080w, /_astro/MoeHome-guestbook.DFl-tTWm_2dwy92.webp 1280w, /_astro/MoeHome-guestbook.DFl-tTWm_ZT3cWV.webp 1668w, /_astro/MoeHome-guestbook.DFl-tTWm_1FvO7E.webp 1920w&quot; /&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;这是一个 Vibe 练手的开源项目，整个项目的核心理念很简单：&lt;strong&gt;零运行时依赖，配置驱动，性能优先。&lt;/strong&gt;&lt;/p&gt;&lt;section&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;SEO 友好&lt;/strong&gt;：构建生成纯静态 HTML，搜索引擎完美支持&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;/section&gt;&lt;section&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;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;🎨 配置驱动&lt;/td&gt;&lt;td&gt;所有内容在 config.js 中管理，无需修改代码&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;📰 RSS 聚合&lt;/td&gt;&lt;td&gt;构建时预获取博客文章，无运行时延迟&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;🐙 GitHub 集成&lt;/td&gt;&lt;td&gt;自动展示项目和贡献图（支持真实/随机数据）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;📝 Memos 动态&lt;/td&gt;&lt;td&gt;时间线布局，支持图片/音视频/Markdown&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;💬 留言板&lt;/td&gt;&lt;td&gt;终端风格弹幕交互，支持 Waline/Artalk&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;🎵 音乐播放器&lt;/td&gt;&lt;td&gt;支持 Meting API 和本地音乐&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;🎨 多主题配色&lt;/td&gt;&lt;td&gt;跟随系统/浅色/暗色，8 种精选配色方案&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&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;仅加载 JetBrains Mono 等宽字体（约 30KB）&lt;/li&gt;
&lt;li&gt;中文使用系统字体，避免大文件加载&lt;/li&gt;
&lt;li&gt;国内 Google Fonts 镜像加速&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;性能友好，加载速度快。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;部署指南&lt;a href=&quot;#部署指南&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 克隆项目&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://github.com/moewah/MoeHome.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MoeHome&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装依赖&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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/config.js&lt;/code&gt;按需修改:&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&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;&apos;&lt;/span&gt;&lt;span&gt;YourName&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tagline&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;技术博主 / 开源爱好者 / AI 探索者&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;https://example.com&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;profile&lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&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;&apos;&lt;/span&gt;&lt;span&gt;YourName&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;images/avatar.webp&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&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;&apos;&lt;/span&gt;&lt;span&gt;Blog&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;https://yourblog.com&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;fa-solid fa-pen-nib&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;构建 &amp;amp; 部署&lt;a href=&quot;#构建--部署&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 构建&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 本地预览&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;serve&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dist&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;8080&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 访问 http://localhost:8080&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 部署:上传 dist/ 目录到任意静态托管&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;经过这一段时间的打磨，这个项目已经趋于完整。页面演示DEMO -&amp;gt;&lt;a href=&quot;https://www.moewah.com/&quot; target=&quot;_blank&quot;&gt;MoeWah&lt;/a&gt;&lt;/p&gt;&lt;p&gt;它或许不是功能最全的，也不是最炫酷的，但它符合我对”个人主页”的理解：&lt;strong&gt;简洁、快速、可控。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;项目已开源：&lt;a href=&quot;https://github.com/moewah/MoeHome&quot; target=&quot;_blank&quot;&gt;https://github.com/moewah/MoeHome&lt;/a&gt;，如果你喜欢这个项目，欢迎点个 Star ⭐️&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>重复内容和 canonical 误用：从 29% 的网站踩过的坑说起</title><link>https://blog.moewah.com/posts/duplicate-content-canonical-mistakes/</link><guid isPermaLink="true">https://blog.moewah.com/posts/duplicate-content-canonical-mistakes/</guid><description>29% 的网站存在重复内容问题。本文详解 canonical 标签的五个误用场景、参数 URL 处理方案、GSC 诊断方法，以及如何让 canonical、内链、sitemap 三者保持一致。</description><pubDate>Thu, 12 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;去年我用 Screaming Frog 帮一个朋友检查网站，发现 2000 多个页面里，有 300 多个被 Google 标记为「Duplicate without user-selected canonical」。朋友一脸懵：「我网站内容都是原创的，怎么会有重复内容？」&lt;/p&gt;
&lt;p&gt;这不是个例。Search Engine Land 的一项研究分析了超过 2 亿个页面，发现  &lt;strong&gt;29% 的网站存在重复内容问题&lt;/strong&gt; 。这不是说这些网站抄袭别人，而是它们自己的页面在「打架」。&lt;/p&gt;
&lt;section&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;重复内容指的是出现在不同 URL 上的相同或高度相似的内容。问题在于：搜索引擎会把每个带参数的 URL 视为一个独立页面。&lt;/p&gt;&lt;p&gt;举个实际的例子：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;example.com/product&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;example.com/product?sort=price&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;example.com/product?color=red&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这三个 URL 在 Google 眼里是三个页面，但内容几乎一样。&lt;/p&gt;&lt;p&gt;这就带来了几个问题：分散页面权重信号、浪费爬取预算、内部链接权益稀释。最要命的是，Google 需要自己选择索引哪个版本，而它选的不一定是你想要的那个。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Canonical 标签：给 Google 指条明路&lt;a href=&quot;#canonical-标签给-google-指条明路&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Canonical 标签（&lt;code&gt;rel=&quot;canonical&quot;&lt;/code&gt;）就是解决这个问题的工具。它告诉搜索引擎：「这几个页面内容一样，但我希望你索引这个版本。」&lt;/p&gt;&lt;p&gt;语法很简单：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rel&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;canonical&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://example.com/preferred-url/&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;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;但这里有个关键点很多人忽略： &lt;strong&gt;每个页面都应该有 canonical 标签，包括首选版本本身&lt;/strong&gt; 。这叫自引用 canonical，能避免很多麻烦。&lt;/p&gt;&lt;p&gt;Google 确定 canonical 版本时会参考多个信号，优先级从高到低是：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;Canonical 标签（最重要的信号）&lt;/li&gt;
&lt;li&gt;内部链接结构&lt;/li&gt;
&lt;li&gt;Sitemap 包含情况&lt;/li&gt;
&lt;li&gt;反向链接强度&lt;/li&gt;
&lt;li&gt;HTTPS 优先于 HTTP&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;注意，canonical 是「建议性」的，Google 不一定会照办。但你的建议越明确、越一致，Google 遵循的可能性就越大。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;五个 canonical 误用场景，你踩过几个？&lt;a href=&quot;#五个-canonical-误用场景你踩过几个&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;帮别人诊断网站时，我见过太多离谱的 canonical 用法。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;误用一：所有页面都指向首页&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这是最严重的错误。有人以为把所有页面的 canonical 都指向首页能「集中权重」，结果整个网站只剩首页被索引。这和用 noindex 没什么区别，只是更隐蔽。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;误用二：Canonical 指向重定向 URL&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Canonical 指向的 URL 应该能直接访问，返回 200 状态码。如果指向一个 301 重定向的 URL，Google 需要额外处理，信号可能会丢失。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;误用三：HTTPS 页面 canonical 指向 HTTP 版本&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;现在 Google 默认 HTTPS 优先。如果你的页面是 HTTPS，canonical 却指向 HTTP，等于在给 Google 发混乱信号。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;误用四：Canonical 指向 noindex 页面&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Canonical 是告诉 Google 「索引这个」，noindex 是告诉 Google「别索引」。两个信号矛盾，Google 会很困惑。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;误用五：多个 canonical 标签指向不同 URL&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;有些 CMS 会自动生成 canonical，如果模板里又手动加了一个，页面就会有两个互相矛盾的 canonical 标签。Google 在这种情况下通常两个都不理会。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;参数 URL、打印版、产品页：实操怎么处理？&lt;a href=&quot;#参数-url打印版产品页实操怎么处理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;/p&gt;&lt;p&gt;&lt;strong&gt;排序参数&lt;/strong&gt; ：&lt;code&gt;?sort=price_asc&lt;/code&gt;、&lt;code&gt;?sort=newest&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;分页参数&lt;/strong&gt; ：&lt;code&gt;?page=2&lt;/code&gt;、&lt;code&gt;?page=3&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;过滤参数&lt;/strong&gt; ：&lt;code&gt;?color=red&lt;/code&gt;、&lt;code&gt;?size=42&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;追踪参数&lt;/strong&gt; ：&lt;code&gt;?utm_source=facebook&lt;/code&gt;、&lt;code&gt;?session_id=abc123&lt;/code&gt;&lt;/p&gt;&lt;p&gt;处理方案优先级：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;优先用静态 URL&lt;/strong&gt; ：用 &lt;code&gt;/red-shoes/&lt;/code&gt; 代替 &lt;code&gt;?color=red&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Canonical 标签&lt;/strong&gt; ：在参数页面指向无参数版本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Robots.txt 屏蔽&lt;/strong&gt; （谨慎）：&lt;code&gt;Disallow: /*?sort=&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;对于追踪参数，最简单的办法是在 GSC 里告诉 Google 这些参数不影响页面内容。不过这个功能已经被 Google 弃用了，新站还是老老实实加 canonical 吧。&lt;/p&gt;&lt;/section&gt;&lt;section&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;example.com/article/print&lt;/code&gt; 或 &lt;code&gt;example.com/article?print=1&lt;/code&gt;&lt;/p&gt;&lt;p&gt;这种页面内容完全一样，只是去掉了导航和广告。两个处理办法：&lt;/p&gt;&lt;p&gt;一是给打印版加 canonical 指向原页面；二是直接 noindex，反正打印版也不需要 SEO。&lt;/p&gt;&lt;/section&gt;&lt;section&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;这个要看具体情况。如果三个页面内容几乎一样，只是图片不同，建议用 canonical 指向主版本。如果每个颜色有独立的评论、描述、用户生成内容，那应该保持三个独立页面，各自加自引用 canonical。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;GSC 诊断：怎么找到问题？&lt;a href=&quot;#gsc-诊断怎么找到问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;登录 Google Search Console，进入「索引」&amp;gt;「网页」，在「网页未编入索引的原因」中找到「Duplicate without user-selected canonical」。&lt;/p&gt;&lt;p&gt;点进去，你会看到完整的受影响 URL 列表。导出来，分类分析。&lt;/p&gt;&lt;p&gt;常见模式：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;HTTP 和 HTTPS 并存&lt;/li&gt;
&lt;li&gt;有 www 和无 www 并存&lt;/li&gt;
&lt;li&gt;URL 参数变化&lt;/li&gt;
&lt;li&gt;打印版页面&lt;/li&gt;
&lt;li&gt;产品变体&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;另一个有用的工具是 URL 检查功能。输入一个有问题的 URL，查看 Google 实际选择的 canonical 是什么，和你设置的是否一致。如果不一致，说明你的信号不够强或者有冲突。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;/p&gt;&lt;ul&gt;
&lt;li&gt;选 HTTPS 版本&lt;/li&gt;
&lt;li&gt;选有 www 或无 www（保持一致）&lt;/li&gt;
&lt;li&gt;选最短、最干净的 URL&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- 在所有重复页面的 head 中添加 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rel&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;canonical&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://example.com/preferred-url/&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;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- 首选版本自身也要有自引用 canonical --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rel&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;canonical&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://example.com/preferred-url/&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;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;第三步：更新内部链接&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;把网站内部所有链接都改成指向 canonical URL。如果页面 A 的 canonical 指向页面 B，但网站内部链接全都指向 A，Google 会很困惑。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第四步：更新 sitemap&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;只放 canonical URL，移除非 canonical 版本。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第五步：验证&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;立即验证&lt;/strong&gt; ：用 URL 检查工具确认 canonical 生效，检查页面源代码确认标签存在。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1-2 周后&lt;/strong&gt; ：观察 GSC 索引状态变化，检查重复内容错误数量是否下降。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1-3 个月后&lt;/strong&gt; ：跟踪关键词排名变化，监控自然流量是否增长。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;重复内容问题不会让网站直接完蛋，但会浪费你的 SEO 努力。Canonical 标签本身不难，难的是保持一致：canonical、内部链接、sitemap 三者要指向同一个 URL。&lt;/p&gt;&lt;p&gt;每次我诊断完一个网站，最常见的问题不是「没有 canonical」，而是「canonical 和其他信号打架」。把这件事做对，比做一百个其他优化都有效。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;Search Engine Land：&lt;a href=&quot;https://searchengineland.com/guide/duplicate-content-fixes&quot; target=&quot;_blank&quot;&gt;What Is Duplicate Content? How It Affects SEO &amp;amp; How to Fix It&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Raven Tools：&lt;a href=&quot;https://raventools.com/studies/onpageseo/&quot; target=&quot;_blank&quot;&gt;On-Page SEO Study&lt;/a&gt;（29% 页面存在重复内容）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>搜索意图错配：为什么你的关键词有排名却没流量</title><link>https://blog.moewah.com/posts/search-intent-mismatch-fix/</link><guid isPermaLink="true">https://blog.moewah.com/posts/search-intent-mismatch-fix/</guid><description>关键词有排名却没流量？可能是搜索意图错配。本文详解四种搜索意图类型、SERP 分析判断意图的方法、内容与意图匹配策略，以及错配后的三个修复方向。</description><pubDate>Thu, 05 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我见过太多这样的案例：一个关键词好不容易冲进前十，搜索量也不错，但点击率惨淡，跳出率居高不下。后来才意识到， &lt;strong&gt;问题不在关键词本身，而是搜索意图错配&lt;/strong&gt; 。&lt;/p&gt;
&lt;p&gt;这篇文章讲清楚：什么是搜索意图、四种类型、如何用SERP分析判断意图、内容与意图匹配的实操方法、错配后怎么修复。&lt;/p&gt;
&lt;section&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;搜索意图（Search Intent）是用户输入关键词时的真实目的。Google 不是在匹配字面关键词，而是在匹配用户想要什么。&lt;/p&gt;&lt;p&gt;一个经典例子：搜索”best air fryer”，Google 返回的是评测文章和推荐清单，而不是某品牌的产品页。因为 Google 知道，用户这时候不想买，而是想先了解。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;搞错搜索意图，就算关键词选对了，内容也写对了，照样不排名。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;四种搜索意图类型&lt;a href=&quot;#四种搜索意图类型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;信息型（Informational）&lt;a href=&quot;#信息型informational&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;用户找答案、教程、解释。&lt;/p&gt;&lt;p&gt;关键词特征：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;“how to…”、“what is…”、“why…”&lt;/li&gt;
&lt;li&gt;例：how to grow tomatoes、why are my plant leaves turning yellow&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;SERP 特征：Featured Snippets、People Also Ask、知识图谱&lt;/p&gt;&lt;p&gt;匹配内容：教程、指南、FAQ、深度解析文章&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;商业调查型（Commercial Investigation）&lt;a href=&quot;#商业调查型commercial-investigation&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;用户在对比、评估，还没准备买。&lt;/p&gt;&lt;p&gt;关键词特征：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;“best…”、“vs…”、“review…”、“top…”&lt;/li&gt;
&lt;li&gt;例：best garden hose、raised bed vs in-ground gardening&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;SERP 特征：评测文章、对比清单、购买指南&lt;/p&gt;&lt;p&gt;匹配内容：产品对比、推荐清单、评测文章&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;交易型（Transactional）&lt;a href=&quot;#交易型transactional&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;用户想买、想下单。&lt;/p&gt;&lt;p&gt;关键词特征：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;“buy…”、“for sale”、“price”、“discount”&lt;/li&gt;
&lt;li&gt;例：buy garden hose online、greenhouse kits for sale&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;SERP 特征：购物广告、产品页、价格对比&lt;/p&gt;&lt;p&gt;匹配内容：产品页、类别页、购买落地页&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;导航型（Navigational）&lt;a href=&quot;#导航型navigational&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;用户找特定品牌或网站。&lt;/p&gt;&lt;p&gt;关键词特征：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;品牌名 + “login”、“website”、“official”&lt;/li&gt;
&lt;li&gt;例：Ahrefs login、RHS plant finder&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;SERP 特征：品牌站点链接、知识面板&lt;/p&gt;&lt;p&gt;匹配内容：只有自己品牌词值得优化，无需额外投入&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;我之前做过一个外贸独立站，关键词”project management software”搜索量很高，我写了篇产品介绍页想去截流。&lt;/p&gt;&lt;p&gt;结果呢？页面一直在第 3 页徘徊，流量几乎为零。&lt;/p&gt;&lt;p&gt;后来用 SERP 分析一看，排名前十的全是评测文章和软件对比清单。用户搜这个词，不是想买，而是在 &lt;strong&gt;研究阶段&lt;/strong&gt;——想看有哪些选择、各有什么优缺点。&lt;/p&gt;&lt;p&gt;我的产品页从一开始就错配了意图。&lt;/p&gt;&lt;p&gt;类似案例还有：用博客文章去抢”buy XX online”这种交易型关键词，或者用产品页去写”how to XX”这种信息型关键词。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;搜索量只是入口，意图才是天花板。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;如何判断关键词的意图类型：SERP 分析法&lt;a href=&quot;#如何判断关键词的意图类型serp-分析法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这是最靠谱的方法——直接看 Google 怎么判断。&lt;/p&gt;&lt;section&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;/section&gt;&lt;section&gt;&lt;h3&gt;步骤二：分析内容类型（Content Type）&lt;a href=&quot;#步骤二分析内容类型content-type&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;/li&gt;
&lt;li&gt;全是产品页 → 交易型&lt;/li&gt;
&lt;li&gt;混合（既有文章又有产品页） → 混合意图&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;步骤三：分析内容格式（Content Format）&lt;a href=&quot;#步骤三分析内容格式content-format&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;清单类（Top 10…、Best…） → 用户想要多个选项&lt;/li&gt;
&lt;li&gt;教程类（How to…） → 用户想要操作步骤&lt;/li&gt;
&lt;li&gt;对比类（A vs B） → 用户想要决策参考&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;步骤四：分析内容角度（Content Angle）&lt;a href=&quot;#步骤四分析内容角度content-angle&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;年份（2024、latest） → 用户想要最新信息&lt;/li&gt;
&lt;li&gt;人群（for beginners、for small business） → 用户想要针对性内容&lt;/li&gt;
&lt;li&gt;地域（in UK、near me） → 用户想要本地信息&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;实操案例：“best CRM software”&lt;a href=&quot;#实操案例best-crm-software&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;我搜索这个词，前十名全是博客文章，格式全是清单类（“Top 10 CRM…”），标题都带年份（“2024”）。&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;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;/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;/td&gt;&lt;td&gt;博客文章&lt;/td&gt;&lt;td&gt;教程、指南、FAQ&lt;/td&gt;&lt;td&gt;how to、what is&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;商业调查型&lt;/td&gt;&lt;td&gt;博客文章&lt;/td&gt;&lt;td&gt;清单、对比、评测&lt;/td&gt;&lt;td&gt;best、vs、review&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;交易型&lt;/td&gt;&lt;td&gt;产品页/落地页&lt;/td&gt;&lt;td&gt;产品描述、价格信息&lt;/td&gt;&lt;td&gt;buy、price、for sale&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;导航型&lt;/td&gt;&lt;td&gt;品牌页&lt;/td&gt;&lt;td&gt;官网、登录页&lt;/td&gt;&lt;td&gt;品牌名 + login&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;section&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;很多关键词有多种意图，比如”project management software”，既有信息型（了解概念），又有商业调查型（对比产品）。&lt;/p&gt;&lt;p&gt;两种处理方式：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;选择主导意图，只写一种内容&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;看 SERP 中哪种类型占多数，就写哪种。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;创建多篇文章，分别对齐不同意图&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一篇教程（“什么是项目管理软件”）对齐信息型，一篇评测清单（“10 款项目管理软件对比”）对齐商业调查型，再在文章中做内链引导到产品页。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;section&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;SERP 主导内容&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;/td&gt;&lt;td&gt;新建独立教程或评测文章&lt;/td&gt;&lt;/tr&gt;&lt;tr&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;/td&gt;&lt;td&gt;清单类评测&lt;/td&gt;&lt;td&gt;改写为对比推荐格式&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&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;SERP 主导格式&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;/td&gt;&lt;td&gt;扩展为 Top 10 类型&lt;/td&gt;&lt;/tr&gt;&lt;tr&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;/td&gt;&lt;td&gt;FAQ 格式&lt;/td&gt;&lt;td&gt;添加问答结构和常见问题&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&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;SERP 主导角度&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;/td&gt;&lt;td&gt;更新标题和内容时效性&lt;/td&gt;&lt;/tr&gt;&lt;tr&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;/td&gt;&lt;td&gt;本地化&lt;/td&gt;&lt;td&gt;添加地理修饰符&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;真实案例：Ahrefs 的 516% 流量增长&lt;a href=&quot;#真实案例ahrefs-的-516-流量增长&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ahrefs 的 backlink checker 落地页一开始排名很差。原因很简单：用户搜这个词，想的是一个可用的工具，而不是一个介绍页面。&lt;/p&gt;&lt;p&gt;修复方案：添加免费工具功能，让用户能直接使用。&lt;/p&gt;&lt;p&gt;结果：6 个月内流量增长 516%。&lt;/p&gt;&lt;p&gt;这个案例说明， &lt;strong&gt;意图对齐不是理论，是能直接带来流量的实操动作。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;最后一步：检查 SERP 波动性&lt;a href=&quot;#最后一步检查-serp-波动性&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;意图不是一成不变的。某些关键词的意图会随着时间变化。&lt;/p&gt;&lt;p&gt;比如”LLM”，2022 年之前主要是法学学位（Master of Laws），ChatGPT 发布后变成大语言模型。原本做法律教育内容的网站，一夜之间失去可见性。&lt;/p&gt;&lt;p&gt;检查方法：在 Ahrefs Keywords Explorer 看排名历史图表。&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;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;高波动&lt;/td&gt;&lt;td&gt;意图不稳定，谨慎投入&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;
&lt;section&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;/p&gt;&lt;p&gt;修复流程：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;用 SERP 分析判断意图类型&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;/ol&gt;&lt;p&gt;搜索量是流量入口，意图才是转化关键。搞对意图，排名才能转化为有效流量。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;Ahrefs：&lt;a href=&quot;https://ahrefs.com/blog/search-intent/&quot; target=&quot;_blank&quot;&gt;Search Intent in SEO: What It Is &amp;amp; How to Optimize for It&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Search Engine Journal：&lt;a href=&quot;https://www.searchenginejournal.com/mastering-serp-analysis-guide-to-understanding-search-engine-results-pages/536469/&quot; target=&quot;_blank&quot;&gt;Mastering SERP Analysis: A Step-By-Step Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;SE Ranking：&lt;a href=&quot;https://seranking.com/blog/search-intent/&quot; target=&quot;_blank&quot;&gt;The 6 Types of Search Intent&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>Astro Firefly 主题 RSS 配置：全文还是摘要，这是个问题</title><link>https://blog.moewah.com/posts/firefly-theme-rss-full-text-summary-configuration-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/firefly-theme-rss-full-text-summary-configuration-guide/</guid><description>如何在Firefly主题中自定义RSS输出内容？本文详细拆解从配置文件到代码修改的完整实现步骤，支持一键切换全文或摘要输出模式，解决RSS订阅臃肿问题。</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&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/CuteLeaf/Firefly&quot; target=&quot;_blank&quot;&gt;Firefly&lt;/a&gt; 是一款非常优秀的 Astro 主题，但在使用过程中我发现 RSS 订阅功能默认只能输出全文，对于一些内容较长的文章来说，RSS 阅读器会显得比较臃肿。如果能添加一个配置选项，让站长自主选择输出全文还是摘要，那就更完美了。&lt;/p&gt;&lt;p&gt;经过一番研究和实践，我找到了一个非常简单的实现方法，只需要修改 3 个文件，就能在配置文件中一键切换 RSS 的输出模式。今天就把这个方法分享给同样使用 Firefly 主题的朋友们。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;实现的方法总共只需要改动 Firefly 主题的三个文件。提前说明一下我当前使用的 Firefly 主题版本 &lt;code&gt;v6.5.8&lt;/code&gt;关于这个需求作者后续有可能也会主动跟进。下面的实现过程只针对当前的版本，请自行判断风险。总归一句，多备份准没错。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;1. src/config/siteConfig.ts&lt;a href=&quot;#1-srcconfigsiteconfigts&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在 &lt;code&gt;analytics&lt;/code&gt; 后面加个 &lt;code&gt;rss&lt;/code&gt; 配置：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 统计分析&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&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;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;googleAnalyticsId&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;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;microsoftClarityId&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;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// RSS 配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&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;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fullText&lt;/span&gt;&lt;span&gt;:&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;// true=全文，false=摘要&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 字体配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;font&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fontConfig&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;fullText: false&lt;/code&gt; 就是只输出摘要。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. src/types/config.ts&lt;a href=&quot;#2-srctypesconfigts&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;TypeScript 得知道有这个配置。文件末尾，&lt;code&gt;analytics&lt;/code&gt; 后面：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;googleAnalyticsId?&lt;/span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;microsoftClarityId&lt;/span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fullText&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;boolean&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. src/pages/rss.xml.ts&lt;a href=&quot;#3-srcpagesrssxmlts&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这是关键。原来的代码大概是这样的：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;feedItems&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;push&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&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;post&lt;/span&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pubDate&lt;/span&gt;&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;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&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;post&lt;/span&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;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;&quot;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;/posts/&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;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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&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;sanitizeHtml&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;cleanedContent&lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;allowedTags&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sanitizeHtml&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;defaults&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;allowedTags&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;concat&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;img&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;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;问题就在那个 &lt;code&gt;content&lt;/code&gt;，全文都塞进去了。改成条件判断：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;feedItems&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;push&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&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;post&lt;/span&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pubDate&lt;/span&gt;&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;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&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;post&lt;/span&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;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;&quot;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;/posts/&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;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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;siteConfig&lt;/span&gt;&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;fullText&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&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;sanitizeHtml&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;cleanedContent&lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;allowedTags&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sanitizeHtml&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;defaults&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;allowedTags&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;concat&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;img&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;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;用的是展开运算符。&lt;code&gt;fullText&lt;/code&gt; 为 &lt;code&gt;true&lt;/code&gt; 时才加 &lt;code&gt;content&lt;/code&gt; 字段。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;下 RSS 长这样：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;item&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;title&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;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;description&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;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;https://example.com/posts/article-slug/&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;pubDate&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Mon, 06 Feb 2025 00:00:00 GMT&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;pubDate&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;item&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;就一个 &lt;code&gt;description&lt;/code&gt;，干净利落。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;全文模式&lt;/strong&gt;会多一个 &lt;code&gt;content&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;item&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;title&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;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;description&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;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;https://example.com/posts/article-slug/&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;pubDate&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Mon, 06 Feb 2025 00:00:00 GMT&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;pubDate&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;content&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;![CDATA[&lt;/span&gt;&lt;span&gt;&amp;lt;p&amp;gt;完整内容...&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;span&gt;]]&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;content&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;item&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;完整文章全在里面。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;strong&gt;摘要模式适合：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;文章超过 800 字&lt;/li&gt;
&lt;li&gt;代码块多、图片多&lt;/li&gt;
&lt;li&gt;想引导回网站看完整版&lt;/li&gt;
&lt;li&gt;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;短文，300-500 字&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;/section&gt;
&lt;section&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;。没写的话 RSS 会空着，很尴尬的～&lt;/p&gt;&lt;p&gt;改完要重启 &lt;code&gt;npm run dev&lt;/code&gt;，不然配置不生效。&lt;/p&gt;&lt;p&gt;SEO 不受影响。搜索引擎爬的是 HTML 页面，不读 RSS。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;改完之后 RSS 文件从几十 KB 降到几 KB，Feedly 刷新也快多了。读者看个大概，感兴趣的点链接回来看完整内容，这样做也希望好朋友们偶尔能回来看看。&lt;/p&gt;&lt;p&gt;如果你也在用 Firefly，有一样的需求不妨也试试。代码不多，三分钟搞定。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;最后提醒：改完 build 一下，去 &lt;code&gt;dist/rss.xml&lt;/code&gt; 看看效果。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>使用 Lume 在 macOS 虚拟机中隔离运行 OpenClaw/Moltbot：完整部署指南</title><link>https://blog.moewah.com/posts/moltbot-macos-virtual-machine-isolation-deployment-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/moltbot-macos-virtual-machine-isolation-deployment-guide/</guid><description>想在 macOS 虚拟机中安全隔离运行 OpenClaw 并实现高效部署？本文提供私有化部署实战复盘，详细步骤演示 Lume 创建虚拟机的全过程，帮助你快速搭建并确保系统稳定。</description><pubDate>Fri, 30 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ClawdBot / OpenClaw / Moltbot 又又又改名字了，火到连 Mac mini 都成了理财产品。昨晚梦见库克托梦给我：“其实这是我们新的营销策略。” 现在的好奇心已经快比我的显卡还烫了——不行，我得立刻部署一个，看看它能不能解释为什么我的钱包总是比模型训练先收敛。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; width=&quot;1700&quot; height=&quot;850&quot; src=&quot;/_astro/moltbot.B-xAAX2J_Z1gTzUe.webp&quot; srcset=&quot;/_astro/moltbot.B-xAAX2J_Z1TFE64.webp 640w, /_astro/moltbot.B-xAAX2J_B6vj.webp 750w, /_astro/moltbot.B-xAAX2J_1LAE0L.webp 828w, /_astro/moltbot.B-xAAX2J_Z1yqNf1.webp 1080w, /_astro/moltbot.B-xAAX2J_Zvn7z5.webp 1280w, /_astro/moltbot.B-xAAX2J_Z2bA6xq.webp 1668w, /_astro/moltbot.B-xAAX2J_Z1gTzUe.webp 1700w&quot; /&gt;&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;什么是 OpenClaw？&lt;a href=&quot;#什么是-openclaw&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;OpenClaw（前身为 Clawdbot / MoltBot）是一个完全运行在你自己机器上的开源个人 AI 助手。与基于云端的 AI 服务不同，OpenClaw 默认保护你的数据隐私，并让你对自己的 AI 助手拥有完全控制权。&lt;/p&gt;&lt;section&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; — 支持 WhatsApp、Telegram、Discord、Slack、Signal 和 iMessage&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; — 处理文件并执行 Shell 命令&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可扩展&lt;/strong&gt; — 50+ 集成，包括 Claude、GPT、Spotify、Philips Hue、Obsidian、Twitter、Gmail 和 GitHub&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自我修改&lt;/strong&gt; — 可以编写自己的扩展和技能&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;为什么要在 macOS 虚拟机中运行 OpenClaw？&lt;a href=&quot;#为什么要在-macos-虚拟机中运行-openclaw&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在虚拟机中运行 OpenClaw 有以下优势：&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; — OpenClaw 在后台运行时你可以正常使用 Mac&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;便携性&lt;/strong&gt; — 可以在机器之间克隆和移动虚拟机&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;iMessage 支持&lt;/strong&gt; — 与 Linux 不同，macOS 虚拟机让你可以使用 iMessage 集成&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&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;strong&gt;Apple Silicon Mac&lt;/strong&gt;（M1、M2、M3、M4 — 任何型号都可以）&lt;/li&gt;
&lt;li&gt;你的主机需要运行 &lt;strong&gt;macOS Sequoia 或更高版本&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;至少建议 &lt;strong&gt;16GB RAM&lt;/strong&gt;（最低 8GB）&lt;/li&gt;
&lt;li&gt;虚拟机需要 &lt;strong&gt;~60GB 可用磁盘空间&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;大约 &lt;strong&gt;20 分钟&lt;/strong&gt; 的设置时间&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;快速设置指南&lt;a href=&quot;#快速设置指南&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 安装 Lume&lt;a href=&quot;#1-安装-lume&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/bin/bash&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;&quot;$(&lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-fsSL&lt;/span&gt;&lt;span&gt;&lt;span&gt; https://raw.githubusercontent.com/trycua/cua/main/libs/lume/scripts/install.sh&lt;/span&gt;&lt;span&gt;)&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;或者使用 Homebrew：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;brew&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tap&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;trycua/lume&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;brew&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lume&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果 &lt;code&gt;~/.local/bin&lt;/code&gt; 不在 PATH 中：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;export PATH=&quot;$PATH:$HOME/.local/bin&quot;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;~/.zshrc&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;source&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.zshrc&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;验证安装：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lume&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--version&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 创建 macOS 虚拟机&lt;a href=&quot;#2-创建-macos-虚拟机&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lume&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;openclaw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--os&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;macos&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--ipsw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;latest&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这会下载 macOS 并创建虚拟机，VNC 窗口会自动打开。根据网络速度，下载可能需要一些时间。&lt;/p&gt;&lt;p&gt;网络不佳的朋友：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 查询 ipsw 下载地址，然后迅雷下载&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lume ipsw&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# curl 命令下载或者迅雷下载也行（因镜像地址会更新，请替换实际得到的下载地址）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl -L -o ~/Downloads/macos.ipsw https://updates.cdn-apple.com/2025FallFCS/fullrestores/093-37399/E144C918-CF99-4BBC-B1D0-3E739B9A3F2D/UniversalMac_26.2_25C56_Restore.ipsw&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 指定 ipsw 镜像来创建虚拟机&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lume create openclaw --os macos --ipsw ~/Downloads/macos.ipsw&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lume run openclaw&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. 完成 macOS 设置向导&lt;a href=&quot;#4-完成-macos-设置向导&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在弹出的 VNC 窗口中：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;选择语言和地区&lt;/li&gt;
&lt;li&gt;跳过 Apple ID（如果你后续需要 iMessage 可以登录）&lt;/li&gt;
&lt;li&gt;创建用户账户（记住用户名和密码）&lt;/li&gt;
&lt;li&gt;跳过所有可选功能&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;设置完成后，启用 SSH：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;打开系统设置 → 通用 → 共享&lt;/li&gt;
&lt;li&gt;启用”远程登录”&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. 获取虚拟机的 IP 地址&lt;a href=&quot;#5-获取虚拟机的-ip-地址&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lume&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;openclaw&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;查找 IP 地址（通常是 &lt;code&gt;192.168.64.x&lt;/code&gt;）。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6. SSH 进入虚拟机&lt;a href=&quot;#6-ssh-进入虚拟机&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ssh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;youruser@192.168.64.X&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;将 &lt;code&gt;youruser&lt;/code&gt; 替换为你创建的账户，将 IP 替换为你的虚拟机 IP。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;7. 安装 OpenClaw&lt;a href=&quot;#7-安装-openclaw&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在虚拟机内：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装 OpenClaw&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-fsSL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://openclaw.ai/install.sh&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;openclaw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onboard&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--install-daemon&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;按照 onboarding 提示设置你的模型提供商（Anthropic、OpenAI 等）。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;8. 配置频道&lt;a href=&quot;#8-配置频道&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;编辑配置文件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nano&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.openclaw/openclaw.json&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;添加你的频道：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;channels&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;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;whatsapp&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;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;dmPolicy&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;allowlist&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;allowFrom&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;[&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;+15551234567&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;telegram&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;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;botToken&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;YOUR_BOT_TOKEN&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;修改完配置文件后，需要重启一下网关：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;openclaw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gateway&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;restart&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;WhatsApp&lt;/strong&gt;
运行下面命令，登录 WhatsApp（扫描二维码）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;openclaw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;channels&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;login&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Telegram&lt;/strong&gt;
首次与创建机器人对话，默认会对陌生人发送一个 code （配对码），运行下方命令完成配对。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;openclaw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pairing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;approve&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;telegram&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;CODE&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;完成这些设置后，就可以指挥机器人干活辣～&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;9. 无头运行虚拟机&lt;a href=&quot;#9-无头运行虚拟机&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;停止虚拟机并重新启动无显示模式：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lume&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stop&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;openclaw&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lume&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;openclaw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--no-display&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;虚拟机在后台运行。Moltbot 的守护进程会保持网关运行。&lt;/p&gt;&lt;p&gt;检查状态：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ssh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;youruser@192.168.64.X&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;openclaw status&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;10. 设置 Xcode&lt;a href=&quot;#10-设置-xcode&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果你是一名 iOS 开发者，你现在可以安装 Xcode 和其他 iOS 开发相关工具。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;xcode&quot; loading=&quot;lazy&quot; width=&quot;1260&quot; height=&quot;1003&quot; src=&quot;/_astro/xcode.D5ZGPJmF_ZGeBQq.webp&quot; srcset=&quot;/_astro/xcode.D5ZGPJmF_Z1DkQGE.webp 640w, /_astro/xcode.D5ZGPJmF_Z2fGKuI.webp 750w, /_astro/xcode.D5ZGPJmF_Z1z4IA2.webp 828w, /_astro/xcode.D5ZGPJmF_10Bh8q.webp 1080w, /_astro/xcode.D5ZGPJmF_ZGeBQq.webp 1260w&quot; /&gt;&lt;figcaption&gt;xcode&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;之后，可以让机器人生成代码，运行应用，并通过 Telegram 发送运行应用的截图，非常酷 😎&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;telegram&quot; loading=&quot;lazy&quot; width=&quot;460&quot; height=&quot;1000&quot; src=&quot;/_astro/telegram.BUADZvcH_yEI5Y.webp&quot; srcset=&quot;/_astro/telegram.BUADZvcH_yEI5Y.webp 460w&quot; /&gt;&lt;figcaption&gt;telegram&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;进阶：iMessage 集成&lt;a href=&quot;#进阶imessage-集成&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这是在 macOS 上运行 OpenClaw 的杀手级功能。使用 &lt;a href=&quot;https://bluebubbles.app&quot; target=&quot;_blank&quot;&gt;BlueBubbles&lt;/a&gt; 将 iMessage 添加到 OpenClaw。&lt;/p&gt;&lt;p&gt;在虚拟机内：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;从 bluebubbles.app 下载 BlueBubbles&lt;/li&gt;
&lt;li&gt;使用你的 Apple ID 登录&lt;/li&gt;
&lt;li&gt;启用 Web API 并设置密码&lt;/li&gt;
&lt;li&gt;将 BlueBubbles webhook 指向你的网关（例如：&lt;code&gt;https://your-gateway-host:3000/bluebubbles-webhook?password=&amp;lt;password&amp;gt;&lt;/code&gt;）&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;添加到你的 OpenClaw 配置：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;channels&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;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;bluebubbles&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;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;serverUrl&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;http://localhost:1234&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;password&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;your-api-password&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;webhookPath&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/bluebubbles-webhook&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;重启网关。现在你的智能体可以发送和接收 iMessages。&lt;/p&gt;&lt;p&gt;详细设置说明：&lt;a href=&quot;https://docs.molt.bot/channels/bluebubbles&quot; target=&quot;_blank&quot;&gt;BlueBubbles 频道文档&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;虚拟机管理技巧&lt;a href=&quot;#虚拟机管理技巧&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lume&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stop&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;openclaw&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lume&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;openclaw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;openclaw-golden&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;便于崩溃的时候可以随时重置：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lume&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stop&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;openclaw&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;lume&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;delete&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;openclaw&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lume&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;openclaw-golden&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;moltbot&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lume&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;openclaw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--no-display&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;保持 24/7 运行&lt;a href=&quot;#保持-247-运行&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;让你的 Mac 保持插电状态&lt;/li&gt;
&lt;li&gt;在系统设置 → 节能 中禁用睡眠&lt;/li&gt;
&lt;li&gt;如有需要，使用 &lt;code&gt;caffeinate&lt;/code&gt; 命令&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;对于真正的全天候运行，考虑使用专用的 Mac mini 或小型 VPS。参见 &lt;a href=&quot;https://docs.molt.bot/vps&quot; target=&quot;_blank&quot;&gt;VPS 托管&lt;/a&gt;。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;故障排除&lt;a href=&quot;#故障排除&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;




























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;问题&lt;/th&gt;&lt;th&gt;解决方案&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;无法 SSH 进入虚拟机&lt;/td&gt;&lt;td&gt;检查虚拟机系统设置中的”远程登录”是否已启用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;虚拟机 IP 未显示&lt;/td&gt;&lt;td&gt;等待虚拟机完全启动，再次运行 &lt;code&gt;lume get openclaw&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;找不到 Lume 命令&lt;/td&gt;&lt;td&gt;将 &lt;code&gt;~/.local/bin&lt;/code&gt; 添加到 PATH&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;WhatsApp QR 无法扫描&lt;/td&gt;&lt;td&gt;确保你在运行 &lt;code&gt;openclaw channels login&lt;/code&gt; 时已登录到虚拟机（而非主机）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;守护进程未启动&lt;/td&gt;&lt;td&gt;运行 &lt;code&gt;openclaw onboard --install-daemon&lt;/code&gt; 重新安装&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;卸载 Lume&lt;a href=&quot;#卸载-lume&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果需要完全移除 Lume，运行以下命令：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 停止并移除后台服务&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;launchctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;unload&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/Library/LaunchAgents/com.trycua.lume_daemon.plist&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;/dev/null&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-f&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/Library/LaunchAgents/com.trycua.lume_daemon.plist&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 停止并移除自动更新程序&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;launchctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;unload&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/Library/LaunchAgents/com.trycua.lume_updater.plist&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;/dev/null&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-f&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/Library/LaunchAgents/com.trycua.lume_updater.plist&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-f&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.local/bin/lume-update&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 可选：移除缓存的镜像（在移除二进制文件之前运行）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lume&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;prune&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 移除 Lume 二进制文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-f&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;which&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lume&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 可选：移除虚拟机和配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-rf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.lume&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-rf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.config/lume&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：移除虚拟机和配置会删除所有已创建的虚拟机，请谨慎操作。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;我可以使用任何 Mac，不只是 Mac Mini 吗？&lt;/strong&gt;
可以。MacBook Air、MacBook Pro、iMac、Mac Studio — 任何 Apple Silicon Mac 都可以。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;它可以在 M1 上运行吗？&lt;/strong&gt;
可以。所有 Apple Silicon 都可以运行 — M1、M2、M3、M4。那台 2020 年的 MacBook Air？是的。&lt;/p&gt;&lt;/section&gt;
&lt;section&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://openclaw.ai/&quot; target=&quot;_blank&quot;&gt;OpenClaw官网&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cua.ai/docs/lume&quot; target=&quot;_blank&quot;&gt;Lume 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bluebubbles.app&quot; target=&quot;_blank&quot;&gt;BlueBubbles&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>我为 Astro Firefly 主题构建了一款智能文章推荐的组件</title><link>https://blog.moewah.com/posts/astro-firefly-smart-article-recommendation-component/</link><guid isPermaLink="true">https://blog.moewah.com/posts/astro-firefly-smart-article-recommendation-component/</guid><description>如何提升Firefly主题的文章关联性？本文详解基于标签匹配和时间权重的智能推荐组件，解决文章孤岛问题，提升用户停留时长与跳出率优化。</description><pubDate>Wed, 28 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/CuteLeaf/Firefly&quot; target=&quot;_blank&quot;&gt;Firefly 主题&lt;/a&gt;是我现在正在使用的一款基于模块化设计的美观、轻盈的 Astro 主题，最近在使用的过程中发现个问题：&lt;strong&gt;文章页太单薄。用户看完一篇文章大概率就走了，页面之间没什么连接，“文章”成了孤岛，跳出率肯定高。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;网上看到一位博主在分享他自己博客网站的文章推荐的思路，我借鉴了一些想法，和 Claude Code 整出了一个智能推荐组件。基于标签匹配和时间权重，给用户推相关性高的文章。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;它长这样：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Dark 模式&quot; loading=&quot;lazy&quot; width=&quot;1586&quot; height=&quot;1058&quot; src=&quot;/_astro/2026-01-27_23.55.58.CnbFK08i_1B6c9U.webp&quot; srcset=&quot;/_astro/2026-01-27_23.55.58.CnbFK08i_ZxKsyN.webp 640w, /_astro/2026-01-27_23.55.58.CnbFK08i_1eho4a.webp 750w, /_astro/2026-01-27_23.55.58.CnbFK08i_1RtyeG.webp 828w, /_astro/2026-01-27_23.55.58.CnbFK08i_27AfDa.webp 1080w, /_astro/2026-01-27_23.55.58.CnbFK08i_Z1nsbp3.webp 1280w, /_astro/2026-01-27_23.55.58.CnbFK08i_1B6c9U.webp 1586w&quot; /&gt;&lt;figcaption&gt;Dark 模式&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&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;时间权重算法：优先推荐较新的文章（6 个月内权重更高）&lt;/li&gt;
&lt;li&gt;随机补充机制：当标签匹配不足时，智能补充随机推荐&lt;/li&gt;
&lt;li&gt;综合评分系统：匹配度 + 时间新鲜度双重评分&lt;/li&gt;
&lt;li&gt;精美 UI 设计：卡片式布局，序号样式区分推荐类型，完美适配 Firefly 主题配色&lt;/li&gt;
&lt;li&gt;深色模式支持：自动适配明暗主题，统一使用主题色背景&lt;/li&gt;
&lt;li&gt;响应式设计：完美支持移动端和桌面端&lt;/li&gt;
&lt;li&gt;SEO 友好：服务端预计算推荐结果，搜索引擎可直接抓取推荐链接&lt;/li&gt;
&lt;li&gt;性能优化：减少 HTML 体积，提升页面加载速度&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&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;默认推荐 6 篇文章，70% 来自标签匹配（最多 4 篇）高相关性，最新文章优先展示；30% 随机推荐（最多 2 篇）作为兜底和补充。理论上不会出现无相关推荐的尴尬时刻。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;推荐列表的去重与排序：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;按标题去重，按标签匹配优先 &amp;gt; 同类型按评分排序，取前 6 篇。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;如果你也喜欢这个组件，恰巧也正在使用 Astro 框架 + Firefly 主题，可以直接复制我的代码按下面的步骤集成到你的网站。&lt;/strong&gt;&lt;/p&gt;&lt;section&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/components/features/RecommenderSEO.astro&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/components/features/RecommenderSEO.astro&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// SEO 优化版：服务端预计算推荐结果&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;getCollection&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;astro:content&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;removeFileExtension&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@utils/url-utils&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dayjs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;dayjs&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;utc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;dayjs/plugin/utc&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;timezone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;dayjs/plugin/timezone&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;siteConfig&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@/config/siteConfig&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 扩展 dayjs 插件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;dayjs&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;extend&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;utc&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;dayjs&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;extend&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;timezone&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;interface&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;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&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;string&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&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;string&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;published&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; &lt;/span&gt;&lt;span&gt;Date&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&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;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;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Astro&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 获取所有文章&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;allPosts&lt;/span&gt;&lt;span&gt; &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; &lt;/span&gt;&lt;span&gt;getCollection&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;posts&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sort&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dateA&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&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;&lt;span&gt;a&lt;/span&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;published&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dateB&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&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;&lt;span&gt;b&lt;/span&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;published&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dateB&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dateA&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&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;&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;=&amp;gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&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;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;removeFileExtension&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;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&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;post&lt;/span&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;slug&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&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;post&lt;/span&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;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;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&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;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 当前文章&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;currentPostSlug&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;removeFileExtension&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;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;currentPost&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&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;post&lt;/span&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;currentPostSlug&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&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;post&lt;/span&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;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;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&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;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;51&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;52&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;53&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// ========== 服务端计算推荐结果 ==========&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;54&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;maxRecommandItemCount&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;55&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;recommendations&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;56&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;57&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 排除当前文章&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;58&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;otherPosts&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;allPosts&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;filter&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;59&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;article&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;&lt;span&gt;article&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;!==&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;currentPostSlug&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;60&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;61&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;62&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 1. 标签匹配推荐（70% 权重）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;63&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tagMatches&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;64&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;currentPost&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;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;currentPost&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;length&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;0&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;65&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;currentTags&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Set&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;currentPost&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;66&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&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;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;67&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;68&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;otherPosts&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;forEach&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;article&lt;/span&gt;&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;69&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;articleTags&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Set&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;article&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;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;70&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;intersection&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Set&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;71&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;&lt;span&gt;currentTags&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;filter&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&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;&lt;span&gt;articleTags&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;has&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;72&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;73&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;74&lt;/div&gt;&lt;/div&gt;&lt;div&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;intersection&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;size&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;0&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;75&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;// 计算时间权重（最近6个月的文章权重更高）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;76&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;articleDate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&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;&lt;span&gt;article&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;published&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;77&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;daysDiff&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;articleDate&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;1000&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;60&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;60&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;24&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;78&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;timeWeight&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&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;&lt;span&gt;max&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&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;daysDiff&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;180&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 180天 = 6个月&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;79&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;80&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tagMatches&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;push&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;81&lt;/div&gt;&lt;/div&gt;&lt;div&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;article&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;82&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;article&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;83&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;/posts/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;article&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;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;84&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;tag-match&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;85&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;matchingTags&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;&lt;span&gt;intersection&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;86&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;score&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;intersection&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;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;10&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;timeWeight&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;87&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;article&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;88&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;89&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;90&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;91&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;92&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tagMatches&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sort&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&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;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;score&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;score&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;93&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;94&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;95&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 2. 随机推荐（30% 权重）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;96&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;randomPool&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;otherPosts&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;97&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;filter&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;article&lt;/span&gt;&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;98&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;&lt;span&gt;tagMatches&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;some&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;match&lt;/span&gt;&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;&lt;span&gt;match&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;===&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;article&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;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;99&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;100&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&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;&lt;span&gt;article&lt;/span&gt;&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;101&lt;/div&gt;&lt;/div&gt;&lt;div&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;article&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;102&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;article&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;103&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;/posts/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;article&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;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;104&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;random&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;105&lt;/div&gt;&lt;/div&gt;&lt;div&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;article&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;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;106&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;article&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;107&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;score&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;article&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;&lt;/span&gt;&lt;span&gt;length&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;0&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;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;108&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;109&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sort&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&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;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;score&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;score&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&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;&lt;span&gt;random&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.5&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;110&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;slice&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Math&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;max&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;maxRecommandItemCount&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tagMatches&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;length&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;111&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;112&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 3. 智能混合&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;113&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tagMatchCount&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&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;&lt;span&gt;min&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;&lt;span&gt;tagMatches&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;length&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;114&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;randomCount&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&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;&lt;span&gt;min&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;randomPool&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;length&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;115&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;116&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;recommendations&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;&lt;span&gt;tagMatches&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;slice&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tagMatchCount&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;117&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;recommendations&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;&lt;span&gt;randomPool&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;slice&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;randomCount&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;118&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;119&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 4. 去重并排序&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;120&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;finalResults&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;recommendations&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;121&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;filter&lt;/span&gt;&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;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&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;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;findIndex&lt;/span&gt;&lt;span&gt;&lt;span&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; &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;t&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;v&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;i&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;122&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sort&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;123&lt;/div&gt;&lt;/div&gt;&lt;div&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;a&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;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;tag-match&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;b&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;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;random&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;return&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;124&lt;/div&gt;&lt;/div&gt;&lt;div&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;a&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;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;random&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;b&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;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;tag-match&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;125&lt;/div&gt;&lt;/div&gt;&lt;div&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;a&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;score&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;!==&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;undefined&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;score&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;!==&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;undefined&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;126&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;score&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;score&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;127&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&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;&lt;span&gt;random&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.5&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;128&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;129&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;slice&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;maxRecommandItemCount&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;130&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;131&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 5. Fallback&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;132&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;finalResults&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;length&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;133&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fallbackPosts&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;otherPosts&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;slice&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;maxRecommandItemCount&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;134&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;finalResults&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;135&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;&lt;span&gt;fallbackPosts&lt;/span&gt;&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;&lt;span&gt;article&lt;/span&gt;&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;136&lt;/div&gt;&lt;/div&gt;&lt;div&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;article&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;137&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;/posts/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;article&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;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;138&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;fallback&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;139&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;article&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;140&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;141&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;142&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;143&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;144&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// ========== 辅助函数 ==========&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;145&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formatTime&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dateStr&lt;/span&gt;&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; &lt;/span&gt;&lt;span&gt;Date&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;gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;146&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt;dateStr&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;147&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;148&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// 获取配置的时区，如果为空则使用本地时间&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;149&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;timezone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;siteConfig&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;timezone&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;150&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;hasTimezone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;timezone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;timezone&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;trim&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;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;151&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;152&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&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;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;hasTimezone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dayjs&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dateStr&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;tz&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;timezone&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dayjs&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dateStr&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;153&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;hasTimezone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dayjs&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;tz&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;timezone&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dayjs&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;154&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;155&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// 计算天数差（使用 startOf 确保只比较日期，忽略具体时间）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;156&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;diffDays&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;startOf&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;day&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;&lt;span&gt;diff&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;&lt;span&gt;startOf&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;day&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;day&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;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;157&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;158&lt;/div&gt;&lt;/div&gt;&lt;div&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;diffDays&lt;/span&gt;&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;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;今天&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;159&lt;/div&gt;&lt;/div&gt;&lt;div&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;diffDays&lt;/span&gt;&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;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;昨天&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;160&lt;/div&gt;&lt;/div&gt;&lt;div&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;diffDays&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&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;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;diffDays&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;161&lt;/div&gt;&lt;/div&gt;&lt;div&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;diffDays&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;30&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`&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;floor&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;diffDays&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&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;}&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;162&lt;/div&gt;&lt;/div&gt;&lt;div&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;diffDays&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;365&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`&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;floor&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;diffDays&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;30&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;163&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`&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;floor&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;diffDays&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;365&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;164&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;165&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;166&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getTagColor&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&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;gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;167&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;bg-[var(--primary)]/10 text-[var(--primary)] border-[var(--primary)]/20&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;168&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;169&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;170&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getNumberStyle&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;index&lt;/span&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;number&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;article&lt;/span&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;any&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;gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;171&lt;/div&gt;&lt;/div&gt;&lt;div&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;article&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;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;tag-match&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;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;172&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;bg-[var(--primary)] shadow-lg shadow-[var(--primary)]/30&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;173&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;else&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;174&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;bg-gradient-to-br from-[var(--primary)] to-[var(--primary)]/80 shadow-lg shadow-[var(--primary)]/30&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;175&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;176&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;177&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;178&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;179&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mt-12 pt-8 border-t border-gray-200 dark:border-gray-700&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;180&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mb-6 onload-animation&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;181&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;flex items-center justify-between mb-6&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;182&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;h3&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;text-2xl font-bold text-black/90 dark:text-white/90&lt;/span&gt;&lt;span&gt;&quot;&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;&lt;span&gt;h3&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;183&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;text-sm text-gray-500 dark:text-gray-400&lt;/span&gt;&lt;span&gt;&quot;&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;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;184&lt;/div&gt;&lt;/div&gt;&lt;div&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;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;185&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;186&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;finalResults&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;length&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;0&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;187&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;space-y-4&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;188&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;finalResults&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;&lt;span&gt;article&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;index&lt;/span&gt;&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;189&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;timeAgo&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;formatTime&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;article&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;published&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;190&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;numberStyle&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;getNumberStyle&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;index&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;article&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;191&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tagColor&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;getTagColor&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;192&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;193&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;194&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;195&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;              &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;&lt;/span&gt;&lt;span&gt;article&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;196&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;              &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;group block relative overflow-hidden rounded-2xl border border-gray-200 dark:border-gray-700/50 dark:bg-(--card-bg) hover:border-[var(--primary)] hover:shadow-xl hover:shadow-[var(--primary)]/15 hover:-translate-y-1 transition-all duration-300&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;197&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;198&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;absolute inset-0 bg-gradient-to-r from-[var(--primary)]/0 via-[var(--primary)]/0 to-[var(--primary)]/0 group-hover:from-[var(--primary)]/5 group-hover:via-[var(--primary)]/10 group-hover:to-[var(--primary)]/5 transition-all duration-500&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;199&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;200&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;relative p-5 md:p-6&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;201&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;flex items-start gap-4&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;202&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;203&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;flex-shrink-0&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;204&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;w-12 h-12 rounded-xl &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;/span&gt;&lt;span&gt;numberStyle&lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; flex items-center justify-center group-hover:scale-110 group-hover:rotate-3 transition-all duration-300&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;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;205&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;text-white font-bold text-lg&lt;/span&gt;&lt;span&gt;&quot;&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;index&lt;/span&gt;&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;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;206&lt;/div&gt;&lt;/div&gt;&lt;div&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;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;207&lt;/div&gt;&lt;/div&gt;&lt;div&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;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;208&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;209&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;210&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;flex-1 min-w-0&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;211&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;font-semibold text-black/90 dark:text-white/90 group-hover:text-[var(--primary)] transition-colors mb-2&lt;/span&gt;&lt;span&gt;&quot;&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;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; text-overflow: ellipsis; line-height: 1.5; min-height: 3rem;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;212&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;article&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;213&lt;/div&gt;&lt;/div&gt;&lt;div&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;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;214&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;215&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;flex items-center gap-2&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;216&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;timeAgo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;217&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;flex items-center text-xs text-gray-500 dark:text-gray-400 flex-shrink-0&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;218&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;svg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;w-3.5 h-3.5 mr-1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fill&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;none&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stroke&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;currentColor&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;viewBox&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;0 0 24 24&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;219&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stroke-linecap&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;round&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stroke-linejoin&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;round&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stroke-width&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;&quot;&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;&quot;&lt;/span&gt;&lt;span&gt;M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;220&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;svg&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;221&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;timeAgo&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;222&lt;/div&gt;&lt;/div&gt;&lt;div&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;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;223&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;224&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;225&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;flex items-center gap-1.5 flex-1 min-w-0 overflow-hidden&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;226&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;article&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;any&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;matchingTags&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;article&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;any&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;matchingTags&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;length&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;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;227&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;flex items-center gap-1.5&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;228&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;article&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;any&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;matchingTags&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;length&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;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;229&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                              &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;inline-flex items-center px-2 py-1 rounded-lg text-xs font-medium &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;/span&gt;&lt;span&gt;tagColor&lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; border hover:scale-105 transition-transform flex-shrink-0&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;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;230&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;svg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;w-3 h-3 mr-1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fill&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;currentColor&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;viewBox&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;0 0 20 20&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;231&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fill-rule&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;evenodd&lt;/span&gt;&lt;span&gt;&quot;&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;&quot;&lt;/span&gt;&lt;span&gt;M17.707 9.293a1 1 0 010 1.414l-7 7a1 1 0 01-1.414 0l-7-7A.997.997 0 012 10V5a3 3 0 013-3h5c.256 0 .512.098.707.293l7 7zM5 6a1 1 0 100-2 1 1 0 000 2z&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clip-rule&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;evenodd&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;232&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;svg&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;233&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;article&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;any&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;matchingTags&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;234&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                              &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;235&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;236&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;article&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;any&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;matchingTags&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;length&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;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;237&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                              &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;inline-flex items-center px-2 py-1 rounded-lg text-xs font-medium &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;/span&gt;&lt;span&gt;tagColor&lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; border hover:scale-105 transition-transform flex-shrink-0 hidden md:inline-flex&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;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;238&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;svg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;w-3 h-3 mr-1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fill&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;currentColor&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;viewBox&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;0 0 20 20&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;239&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fill-rule&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;evenodd&lt;/span&gt;&lt;span&gt;&quot;&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;&quot;&lt;/span&gt;&lt;span&gt;M17.707 9.293a1 1 0 010 1.414l-7 7a1 1 0 01-1.414 0l-7-7A.997.997 0 012 10V5a3 3 0 013-3h5c.256 0 .512.098.707.293l7 7zM5 6a1 1 0 100-2 1 1 0 000 2z&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clip-rule&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;evenodd&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;240&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;svg&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;241&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;article&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;any&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;matchingTags&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;242&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                              &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;243&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;244&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;article&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;any&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;matchingTags&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;length&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;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;245&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                              &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;inline-flex items-center px-2 py-1 rounded-lg text-xs font-medium &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;/span&gt;&lt;span&gt;tagColor&lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; border hover:scale-105 transition-transform flex-shrink-0 hidden lg:inline-flex&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;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;246&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;svg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;w-3 h-3 mr-1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fill&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;currentColor&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;viewBox&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;0 0 20 20&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;247&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fill-rule&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;evenodd&lt;/span&gt;&lt;span&gt;&quot;&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;&quot;&lt;/span&gt;&lt;span&gt;M17.707 9.293a1 1 0 010 1.414l-7 7a1 1 0 01-1.414 0l-7-7A.997.997 0 012 10V5a3 3 0 013-3h5c.256 0 .512.098.707.293l7 7zM5 6a1 1 0 100-2 1 1 0 000 2z&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clip-rule&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;evenodd&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;248&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;svg&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;249&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;article&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;any&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;matchingTags&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;250&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                              &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;251&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;252&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;/* 移动端和平板：+{length-1} */&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;253&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;article&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;any&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;matchingTags&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;length&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;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;254&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                              &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;inline-flex items-center px-2 py-1 rounded-lg text-xs font-medium &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;/span&gt;&lt;span&gt;tagColor&lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; border flex-shrink-0 lg:hidden&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;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;255&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;article&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;any&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;matchingTags&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;256&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                              &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;257&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;258&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;/* 桌面端：+{length-3} */&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;259&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;article&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;any&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;matchingTags&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;length&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;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;260&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                              &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;inline-flex items-center px-2 py-1 rounded-lg text-xs font-medium &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;/span&gt;&lt;span&gt;tagColor&lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; border flex-shrink-0 hidden lg:inline-flex&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;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;261&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;article&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;any&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;matchingTags&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;262&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                              &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;263&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;264&lt;/div&gt;&lt;/div&gt;&lt;div&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;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;265&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;article&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;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;article&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;length&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;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;266&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;flex items-center gap-1.5&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;267&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;article&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;length&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;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;268&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                              &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;inline-flex items-center px-2 py-1 rounded-lg text-xs font-medium &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;/span&gt;&lt;span&gt;tagColor&lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; border flex-shrink-0&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;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;269&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;svg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;w-3 h-3 mr-1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fill&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;currentColor&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;viewBox&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;0 0 20 20&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;270&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fill-rule&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;evenodd&lt;/span&gt;&lt;span&gt;&quot;&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;&quot;&lt;/span&gt;&lt;span&gt;M17.707 9.293a1 1 0 010 1.414l-7 7a1 1 0 01-1.414 0l-7-7A.997.997 0 012 10V5a3 3 0 013-3h5c.256 0 .512.098.707.293l7 7zM5 6a1 1 0 100-2 1 1 0 000 2z&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clip-rule&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;evenodd&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;271&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;svg&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;272&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;article&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;0&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;273&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                              &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;274&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;275&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;article&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;length&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;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;276&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                              &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;inline-flex items-center px-2 py-1 rounded-lg text-xs font-medium &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;/span&gt;&lt;span&gt;tagColor&lt;/span&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; border flex-shrink-0 hidden md:inline-flex&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;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;277&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;svg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;w-3 h-3 mr-1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fill&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;currentColor&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;viewBox&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;0 0 20 20&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;278&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fill-rule&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;evenodd&lt;/span&gt;&lt;span&gt;&quot;&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;&quot;&lt;/span&gt;&lt;span&gt;M17.707 9.293a1 1 0 010 1.414l-7 7a1 1 0 01-1.414 0l-7-7A.997.997 0 012 10V5a3 3 0 013-3h5c.256 0 .512.098.707.293l7 7zM5 6a1 1 0 100-2 1 1 0 000 2z&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clip-rule&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;evenodd&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;279&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;svg&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;280&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;article&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;1&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;281&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                              &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;282&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;283&lt;/div&gt;&lt;/div&gt;&lt;div&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;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;284&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;) &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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;285&lt;/div&gt;&lt;/div&gt;&lt;div&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;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;286&lt;/div&gt;&lt;/div&gt;&lt;div&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;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;287&lt;/div&gt;&lt;/div&gt;&lt;div&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;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;288&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;289&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                  &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;290&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;flex-shrink-0 self-center&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;291&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;w-9 h-9 rounded-xl bg-[var(--primary)]/5 border border-[var(--primary)]/10 flex items-center justify-center opacity-0 group-hover:opacity-100 group-hover:translate-x-0 -translate-x-3 group-hover:bg-[var(--primary)]/10 transition-all duration-300&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;292&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;svg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;w-5 h-5 text-[var(--primary)]&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fill&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;none&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stroke&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;currentColor&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;viewBox&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;0 0 24 24&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;293&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stroke-linecap&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;round&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stroke-linejoin&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;round&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stroke-width&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;2.5&lt;/span&gt;&lt;span&gt;&quot;&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;&quot;&lt;/span&gt;&lt;span&gt;M13 7l5 5m0 0l-5 5m5-5H6&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;294&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;svg&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;295&lt;/div&gt;&lt;/div&gt;&lt;div&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;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;296&lt;/div&gt;&lt;/div&gt;&lt;div&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;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;297&lt;/div&gt;&lt;/div&gt;&lt;div&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;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;298&lt;/div&gt;&lt;/div&gt;&lt;div&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;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;299&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;300&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;301&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;302&lt;/div&gt;&lt;/div&gt;&lt;div&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;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;303&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;304&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;text-center py-16 rounded-2xl border-2 border-dashed border-gray-300 dark:border-gray-700 bg-gradient-to-br from-gray-50 to-white dark:from-gray-800/50 dark:to-gray-900/50&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;305&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;svg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;w-16 h-16 mx-auto mb-4 text-gray-400&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fill&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;none&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stroke&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;currentColor&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;viewBox&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;0 0 24 24&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;306&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stroke-linecap&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;round&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stroke-linejoin&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;round&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stroke-width&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;1.5&lt;/span&gt;&lt;span&gt;&quot;&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;&quot;&lt;/span&gt;&lt;span&gt;M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;307&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;svg&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;308&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;h4&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;text-lg font-semibold text-gray-700 dark:text-gray-300 mb-2&lt;/span&gt;&lt;span&gt;&quot;&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;&lt;span&gt;h4&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;309&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;text-sm text-gray-500 dark:text-gray-400 mb-4&lt;/span&gt;&lt;span&gt;&quot;&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;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;310&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&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; &lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/posts/&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;inline-flex items-center px-6 py-2.5 rounded-xl bg-[var(--primary)] text-white font-medium hover:bg-[var(--primary)]/90 transition-colors&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;311&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;浏览所有文章&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;312&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;svg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;w-4 h-4 ml-2&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fill&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;none&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stroke&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;currentColor&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;viewBox&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;0 0 24 24&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;313&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stroke-linecap&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;round&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stroke-linejoin&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;round&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stroke-width&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;&quot;&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;&quot;&lt;/span&gt;&lt;span&gt;M13 7l5 5m0 0l-5 5m5-5H6&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;314&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;svg&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;315&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;316&lt;/div&gt;&lt;/div&gt;&lt;div&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;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;317&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;318&lt;/div&gt;&lt;/div&gt;&lt;div&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;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;319&lt;/div&gt;&lt;/div&gt;&lt;div&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;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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/posts/[...slug].astro&lt;/code&gt; 文件中增加下面代码（⚠️注意是增加不是覆盖）导入并使用组件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Recommender&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;@components/features/RecommenderSEO.astro&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- 在文章内容后面添加推荐模块 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mb-8&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Recommender&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;{&lt;/span&gt;&lt;span&gt;entry&lt;/span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&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;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;推荐放在文章内容和评论之间，效果最佳。&lt;/p&gt;&lt;p&gt;另外，有需要调整配置的话，可以直接改代码里的参数。&lt;code&gt;maxRecommandItemCount&lt;/code&gt; 改推荐数量，&lt;code&gt;timeWeight&lt;/code&gt; 计算里的 &lt;code&gt;180&lt;/code&gt; 改时间权重周期（默认 180 天 = 6 个月）。文章路径不是 &lt;code&gt;/posts/&lt;/code&gt; 的话，把 &lt;code&gt;url&lt;/code&gt; 那行改成你的路径。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;整体下来，这个组件的 Vibe-Coding （与 &lt;a href=&quot;https://claude.com/product/claude-code&quot; target=&quot;_blank&quot;&gt;Claude Code&lt;/a&gt; 交互） 的过程很轻松、很愉快，调样式花的时间最多，其他逻辑沟通挺顺畅。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>LM Studio 下载模型巨慢？修改 hosts 文件提速</title><link>https://blog.moewah.com/posts/lm-studio-model-download-slow-3-step-hosts-speed-up/</link><guid isPermaLink="true">https://blog.moewah.com/posts/lm-studio-model-download-slow-3-step-hosts-speed-up/</guid><description>LM Studio下载模型巨慢？本指南详解如何通过修改hosts文件解决DNS解析延迟问题，3步快速优化下载速度。关闭代理选项、查询IP地址并添加到hosts文件，Windows/MacOS通用操作步骤，立即提升90%下载效率，告别模型加载卡顿困扰！</description><pubDate>Wed, 28 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;LM Studio 默认从 huggingface.co 下载模型,但网络连接经常超时。软件内置了”使用 LM Studio 的 Hugging Face 代理”选项，我试过后发现速度反而更慢。&lt;/p&gt;
&lt;p&gt;从 huggingface.co 直接下载 gguf 模型时,我发现最终下载服务器是 &lt;code&gt;cas-bridge.xethub.hf.co&lt;/code&gt; 这个域名。&lt;strong&gt;问题出在 DNS 解析上&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;默认情况下,&lt;code&gt;cas-bridge.xethub.hf.co&lt;/code&gt; 会解析到不同的 IP 地址,部分地址可能连接缓慢或超时。&lt;strong&gt;通过修改系统的 hosts 文件直接指定一个可用的 IP 地址能绕过这个问题&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;请关闭 &lt;strong&gt;“使用 LM Studio 的 Hugging Face 代理”&lt;/strong&gt; 选项，然后执行 DNS 查询获取可用的 IP 地址（请自行运行以下命令查询）：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nslookup cas-bridge.xethub.hf.co 8.8.8.8&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;返回结果包含多个 IP 地址，如 &lt;code&gt;3.170.221.29&lt;/code&gt;、&lt;code&gt;3.170.221.18&lt;/code&gt; 等。选择其中一个添加到 hosts 文件。&lt;/p&gt;
&lt;section&gt;&lt;h3&gt;macOS / Linux&lt;a href=&quot;#macos--linux&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nano&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/hosts&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;在文件末尾添加:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3.165.75.25 cas-bridge.xethub.hf.co&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;按 &lt;code&gt;Ctrl + O&lt;/code&gt; 保存,&lt;code&gt;Ctrl + X&lt;/code&gt; 退出。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;Windows&lt;a href=&quot;#windows&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;以管理员身份运行记事本&lt;/li&gt;
&lt;li&gt;打开文件: &lt;code&gt;C:\Windows\System32\drivers\etc\hosts&lt;/code&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;重启 LM Studio&lt;/strong&gt;，模型下载速度会显著提升。&lt;/p&gt;&lt;p&gt;如果第一个 IP 效果不佳,试试其他地址。不同地区的网络环境差异很大，可能需要测试几次才能找到最优解。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>关于SEO与内容：七年博客的一点心得</title><link>https://blog.moewah.com/posts/5412/</link><guid isPermaLink="true">https://blog.moewah.com/posts/5412/</guid><description>如何让技术分享型博客实现价值传递？本文深度拆解SEO与内容创作的底层逻辑，揭示从被动展示到主动吸引的转化方法，帮助你打造高价值独占流量入口。</description><pubDate>Tue, 27 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;说实话，当我重新打开 MoeWah.Com 的后台时，真的有点感慨——这个域名已经陪伴我整整七年了。&lt;/p&gt;
&lt;p&gt;七年是什么概念？足够读完一个博士，足够换三份工作，足够从新手变成”老司机”。但对我来说，七年只是一个数字——一个坚持做某件事的数字。&lt;/p&gt;
&lt;p&gt;你可能会问：&lt;strong&gt;一个不赚钱的网站，值得坚持七年吗？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;老实讲，我无数次想过放弃。MoeWah.Com 不仅没给我带来收益，反而是个”负资产”。Google AdSense 的单次点击收益低到离谱，有时候一天的收入连一杯奶茶都买不起。（如果你觉得我的内容有用，真的可以考虑给点实质性的肯定，谢谢大家！）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;那问题来了：当一个技术分享网站不赚钱，继续做的理由是什么？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我思考了很久，答案其实很简单：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;折腾和分享，满足了我个人的探索乐趣。记录的过程让我在岁月中一点点变好。遇到问题时更有逻辑、更有方法。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;博客对我来说，是一个科技类笔记的形态——个人知识沉淀的工具，而不是变现的载体。多语言运营？垂直测评？产品推荐？这些路径我都清楚，但精力真的有限。&lt;/p&gt;
&lt;p&gt;但你知道吗？这七年里，看到有人有意无意地分享、转载我的内容，我真的挺欣慰的。&lt;strong&gt;我帮助到了一些人。&lt;/strong&gt; 内容在这一刻完成了价值传递。&lt;/p&gt;
&lt;p&gt;这不是一篇系统的方法论，只是七年博客运营的碎碎念。今天不谈技术，不谈AI，交个心。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;我理解的 SEO 本质是什么&lt;a href=&quot;#我理解的-seo-本质是什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;说实话，SEO 这个词听起来挺”玄学”的，但其实没那么复杂。&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; → 提交内容、sitemap 这些&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;说到底，SEO 就是：&lt;strong&gt;基于需求，做有价值的内容，让搜索引擎和用户都能找到它，并认可它。&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;strong&gt;“趋势、热点、产品、方案——都是需求。可以是用户痛点，也可以是大众的共鸣点。“&lt;/strong&gt;&lt;/p&gt;&lt;section&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;p&gt;举个例子：NAS 这个产品注定是小众的。我在折腾 NAS 的过程中，分享了一些问题的解决方案。这些内容搜索量不大，但真正帮到了一小部分用户。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;100个人做同一个内容，用户未必选我。但如果只有1个人或10个人在做，我的胜算就高很多。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这就是稀缺性带来的优势。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&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;/p&gt;&lt;p&gt;&lt;strong&gt;他们刚发生过的热点，很快就会成为我们的热点。只是过程中有一些延迟。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;回望中国经济的几十年辉煌，其实很多模式在西方国家早就出现过。一切都是历史的循环。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&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;ol&gt;
&lt;li&gt;&lt;strong&gt;解决用户”需不需要”的问题&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;解决用户”是否购买”的问题&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;把”是否购买”这个问题交给专业的电商平台。但要注意一件事：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;当我们把产品成功卖给陌生人，首先得解决信任问题。信任是一切的基础。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&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;p&gt;核心关键放在这两部分：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;价值瞬间传达&lt;/strong&gt;：用户在 &lt;strong&gt;3-5秒&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;hr /&gt;&lt;/section&gt;&lt;section&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;p&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;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;a href=&quot;https://blog.moewah.com/&quot;&gt;https://blog.moewah.com/&lt;/a&gt; 只对原站点优选过的内容进行收录。&lt;/p&gt;&lt;p&gt;如果你访问的文章出现 404，我深感抱歉——大概率是被废弃了。具体表现为：原站点文章页面是否跳转新页面。没跳转的，就是未被收录。&lt;/p&gt;&lt;p&gt;整个调整过程我计划用 &lt;strong&gt;6个月&lt;/strong&gt;——准确说是用户引导的适应过程。内容本身其实已经完成迁移了。&lt;/p&gt;&lt;p&gt;最后说一句：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;AI时代，内容正在成为AI的”燃料”。被引用的价值在上升，被点击的价值在下降。朋友们，请保持这份清醒——比追热点更重要。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;提前祝大家 2026 年新年快乐，一切顺遂！&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;回顾一下核心要点：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;SEO 本质：做有价值的内容，让搜索引擎和用户都能找到&lt;/li&gt;
&lt;li&gt;内容价值：痛点、稀缺性、信息差都是机会&lt;/li&gt;
&lt;li&gt;产品传达：3-5秒内让用户理解价值，以用户为中心&lt;/li&gt;
&lt;li&gt;关键词：关注但不要堆砌，内容价值才是根本&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;坚持做有价值的事，时间会给你答案。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>AI写作为何一眼被识破？实战破解指南</title><link>https://blog.moewah.com/posts/ai-writing-detection-breakthrough-practical-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/ai-writing-detection-breakthrough-practical-guide/</guid><description>想知道为什么AI写的文章一眼就被看穿？本文深入分析AI创作常见痕迹，提供写作技巧与实战方法，教你如何剔除AI痕迹，提升内容可信度与用户体验并提升SEO排名与用户黏性。</description><pubDate>Sun, 25 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;满屏的破折号、此外、而且这些学术词，开头永远是”在一个……的世界里”，结尾必定”总而言之”。&lt;/p&gt;
&lt;p&gt;读者一看就知道：又是 AI 写的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;为什么你用 AI 写的东西，一眼就能被看穿？&lt;/strong&gt; 下面将介绍两种办法帮你剔除AI痕迹。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;在 ChatGPT 中使用提示词&lt;a href=&quot;#在-chatgpt-中使用提示词&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我在 Reddit 上发现个提示词，专门解决这个问题。&lt;/p&gt;&lt;p&gt;它给 AI 定了规则，强制 AI 按人类的方式写作。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;移除 8 种 AI 写作的”指纹”&lt;a href=&quot;#移除-8-种-ai-写作的指纹&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;破折号连接，AI 喜欢用破折号强行连接句子&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;delve 这类 AI 高频词&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;添加 5 种人类写作的特征&lt;a href=&quot;#添加-5-种人类写作的特征&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;/ul&gt;&lt;/section&gt;&lt;section&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;作者测试了几个月。LinkedIn 帖子互动量涨了 10 倍，博客文章排到 Google 首页，营销邮件打开率翻倍。&lt;/p&gt;&lt;p&gt;把用这个提示词的输出和普通 AI 输出放一起，差异明显。一个像人在说话，一个像机器在念稿。&lt;/p&gt;&lt;/section&gt;&lt;section&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;ol&gt;
&lt;li&gt;ChatGPT 自定义设置里粘贴&lt;/li&gt;
&lt;li&gt;对话开始时直接粘贴&lt;/li&gt;
&lt;li&gt;写完后用它重写一遍&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;遵循以下写作风格：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;使用清晰、简单的语言。使用简短、有冲击力的句子。使用主动语态。避免被动语态。尽可能使用数据和例子支持主张。使用&quot;你&quot;和&quot;你的&quot;直接称呼读者。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;禁止在回复中任何地方使用破折号。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;禁止使用隐喻和陈词滥调。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;禁止使用泛泛而谈。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;禁止使用设置性语言（总而言之、总结来说等）。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;禁止使用不必要的形容词和副词。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;禁止使用反问句。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;禁止使用表情符号。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;复制这段话试试看。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;调用 Humanizer-zh Skills 处理 AI 痕迹&lt;a href=&quot;#调用-humanizer-zh-skills-处理-ai-痕迹&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果你用的是 Claude、OpenCode、Codex 等 AI Agent，那还有更强大的工具 —— Humanizer-zh Skills。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;什么是 Humanizer-zh&lt;a href=&quot;#什么是-humanizer-zh&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Humanizer-zh 是 &lt;a href=&quot;https://github.com/blader/humanizer&quot; target=&quot;_blank&quot;&gt;blader/humanizer&lt;/a&gt; 项目的中文翻译版本，专为 Claude Code、OpenCode、Codex 等 AI Agent 设计的 Skills。它去除文本中 AI 生成痕迹，把 AI 生成的内容改写得更自然、更像人类书写的文本。&lt;/p&gt;&lt;p&gt;核心优势：识别并去除 21 种 AI 写作痕迹，基于维基百科的”AI 写作特征”指南，不仅去除痕迹还注入”灵魂”和个性，直接在 AI Agent 对话中调用，内置质量评分系统。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Humanizer-zh 能识别并修复哪些 AI 痕迹&lt;a href=&quot;#humanizer-zh-能识别并修复哪些-ai-痕迹&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;它比简单的提示词更专业。&lt;/p&gt;&lt;section&gt;&lt;h4&gt;内容模式（6种）&lt;a href=&quot;#内容模式6种&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;过度强调意义，比如”作为……的体现”、“凸显了……的重要性”&lt;/li&gt;
&lt;li&gt;过度强调知名度，反复列举媒体报道而不提供上下文&lt;/li&gt;
&lt;li&gt;以 -ing 结尾的肤浅分析&lt;/li&gt;
&lt;li&gt;宣传和广告式语言&lt;/li&gt;
&lt;li&gt;模糊归因，比如”专家认为”、“行业报告显示”&lt;/li&gt;
&lt;li&gt;提纲式的”挑战与未来展望”&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;语言和语法模式（6种）&lt;a href=&quot;#语言和语法模式6种&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;过度使用的”AI 词汇”，比如此外、至关重要、深入探讨&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;虚假范围，“从 X 到 Y”但 X 和 Y 无意义&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;风格模式（6种）&lt;a href=&quot;#风格模式6种&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&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;弯引号，ChatGPT 使用弯引号而非直引号&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;交流模式（3种）&lt;a href=&quot;#交流模式3种&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&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;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Humanizer-zh 的独特之处：注入灵魂&lt;a href=&quot;#humanizer-zh-的独特之处注入灵魂&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;大多数工具只能”去除”痕迹，但 Humanizer-zh 还能”添加”人性。它内置了”个性与灵魂”模块，帮你注入有观点、变化节奏、承认复杂性、适当使用”我”、允许一些混乱、对感受要具体。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;如何安装 Humanizer-zh&lt;a href=&quot;#如何安装-humanizer-zh&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;方法一：通过 npx 一键安装（推荐）&lt;a href=&quot;#方法一通过-npx-一键安装推荐&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;skills&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://github.com/op7418/Humanizer-zh.git&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这是最简单的安装方式。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;方法二：通过 Git 克隆&lt;a href=&quot;#方法二通过-git-克隆&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://github.com/op7418/Humanizer-zh.git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.claude/skills/humanizer-zh&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;方法三：手动安装&lt;a href=&quot;#方法三手动安装&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;下载 ZIP 文件或克隆到本地&lt;/li&gt;
&lt;li&gt;将 &lt;code&gt;Humanizer-zh&lt;/code&gt; 文件夹复制到 Claude Code 的 skills 目录&lt;/li&gt;
&lt;li&gt;macOS/Linux: &lt;code&gt;~/.claude/skills/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Windows: &lt;code&gt;%USERPROFILE%\.claude\skills\&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&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;重启 Claude Code 或重新加载 skills 后，在对话中输入 &lt;code&gt;/humanizer-zh&lt;/code&gt;。如果安装成功，该技能将被激活。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;如何使用 Humanizer-zh&lt;a href=&quot;#如何使用-humanizer-zh&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;使用场景 1：直接调用技能&lt;a href=&quot;#使用场景-1直接调用技能&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/humanizer-zh 请帮我人性化以下文本：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[粘贴你的 AI 生成文本]&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;使用场景 2：在对话中使用&lt;a href=&quot;#使用场景-2在对话中使用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;请用 humanizer 帮我改写这段话，让它更自然：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;这个项目作为我们团队致力于创新的证明。此外，它展示了我们在不断演变的技术格局中的关键作用。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;使用场景 3：处理文件内容&lt;a href=&quot;#使用场景-3处理文件内容&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/humanizer-zh 请人性化 article.md 文件中的内容&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;实际改写示例&lt;a href=&quot;#实际改写示例&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;改写前（AI 味道）&lt;a href=&quot;#改写前ai-味道&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;blockquote&gt;&lt;p&gt;新的软件更新作为公司致力于创新的证明。此外，它提供了无缝、直观和强大的用户体验——确保用户能够高效地完成目标。这不仅仅是一次更新，而是我们思考生产力方式的革命。行业专家认为这将对整个行业产生持久影响，彰显了公司在不断演变的技术格局中的关键作用。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;改写后（Humanizer-zh 处理）&lt;a href=&quot;#改写后humanizer-zh-处理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;blockquote&gt;&lt;p&gt;软件更新添加了批处理、键盘快捷键和离线模式。来自测试用户的早期反馈是积极的，大多数报告任务完成速度更快。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;所做更改&lt;a href=&quot;#所做更改&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&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;/section&gt;&lt;/section&gt;&lt;section&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;Humanizer-zh 内置了 1-50 分的质量评分系统，帮你量化改写效果：&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;直接陈述事实还是绕圈宣告？10 分：直截了当；1 分：充满铺垫&lt;/td&gt;&lt;td&gt;/10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;节奏&lt;/td&gt;&lt;td&gt;句子长度是否变化？10 分：长短交错；1 分：机械重复&lt;/td&gt;&lt;td&gt;/10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;信任度&lt;/td&gt;&lt;td&gt;是否尊重读者智慧？10 分：简洁明了；1 分：过度解释&lt;/td&gt;&lt;td&gt;/10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;真实性&lt;/td&gt;&lt;td&gt;听起来像真人说话吗？10 分：自然流畅；1 分：机械生硬&lt;/td&gt;&lt;td&gt;/10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;精炼度&lt;/td&gt;&lt;td&gt;还有可删减的内容吗？10 分：无冗余；1 分：大量废话&lt;/td&gt;&lt;td&gt;/10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;总分&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;/50&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;标准：45-50 分优秀，35-44 分良好，低于 35 分需要重新修订。&lt;/p&gt;&lt;/section&gt;&lt;section&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;Humanizer-zh 特别适合编辑和审阅 AI 生成的内容，提升文章的人性化程度，学习识别 AI 写作的常见模式，营销文案去机械化，博客文章自然化，技术文档人性化，社交媒体内容优化。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;选择建议&lt;a href=&quot;#选择建议&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;主要使用 ChatGPT，需要快速、简单的解决方案。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Humanizer-zh 适合&lt;a href=&quot;#humanizer-zh-适合&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;使用 Claude、OpenCode、Codex 等 AI Agent，需要更专业、更系统的去痕处理，需要质量评分和量化指标，想要注入”灵魂”和个性。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;AI 生成文本的”AI 味”是可以解决的。让文字有温度，有个性，有人味。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>《海蒂和爷爷》的治愈系成长启示</title><link>https://blog.moewah.com/posts/heidi-and-grandpa-movie-emotional-healing-growth-lessons/</link><guid isPermaLink="true">https://blog.moewah.com/posts/heidi-and-grandpa-movie-emotional-healing-growth-lessons/</guid><description>如何通过一部电影理解自由与束缚的冲突？本文深度解析《海蒂和爷爷》中自然疗愈、独立思考与人性善念的核心主题，揭示影片如何通过情感真挚的叙事传递成长的力量。</description><pubDate>Thu, 15 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;：阿兰·葛斯彭纳（Alain Gsponer）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;国籍&lt;/strong&gt;：德国/瑞士（本片为两国合拍）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代表作标注&lt;/strong&gt;：《海蒂和爷爷》是阿兰·葛斯彭纳执导的知名电影，改编自瑞士作家约翰娜·施皮里（Johanna Spyri）的同名经典儿童小说《海蒂》。影片类型被归类为剧情、家庭、冒险。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&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;ol&gt;
&lt;li&gt;&lt;strong&gt;回归自然与本真&lt;/strong&gt;：导演旨在通过阿尔卑斯山壮丽的自然风光，强调人与自然和谐共处的重要性，以及自然环境对个体心灵的治愈和滋养作用。影片多次使用空镜头展现阿尔卑斯山脉，极力渲染人物置身大山中的愉悦心境，表现人与自然和谐的主题。这与工业革命背景下人们对浪漫王国幻想的破灭形成对比，影片以现实主义手法却饱含温情。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;探讨自由与束缚&lt;/strong&gt;：影片通过海蒂在阿尔卑斯山与法兰克福两种截然不同生活环境的对比，探讨了自由天性与社会规训之间的冲突与平衡。导演意图展现个体如何挣脱束缚，追随内心所向，最终实现自我成长和救赎。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;弘扬纯粹的人性与情感&lt;/strong&gt;：导演着重展现了亲情、友情、善良等普世价值。无论是海蒂与爷爷之间从隔阂到深厚的祖孙情，还是她与克拉拉、彼得之间纯粹的友情，都体现了导演对人际间真挚情感的歌颂。影片致力于展现人性中“善的一面”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;传递积极的成长观念&lt;/strong&gt;：影片也探讨了教育、独立思考的重要性。海蒂从最初的抗拒学习到主动求知，以及爷爷教导海蒂“相信自己的眼睛和耳朵”的理念，都反映了导演对个体成长路径的思考和引导。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&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;以下是10条以上体现影片主题的核心台词及其对应场景和分析：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;“如果做某件事会让你开心，那你就只管去做，无论别人说了什么。”&lt;/strong&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;strong&gt;追随内心，坚持自我&lt;/strong&gt;。它鼓励人们勇敢追求自己的热爱，不被外界的流言蜚语或嘲笑所困扰，强调了内心的自由和选择的勇气。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“人们总爱说闲话，你必须决定是相信自己的眼睛和耳朵，还是相信其他人所说的话。”&lt;/strong&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;strong&gt;独立思考和批判性判断&lt;/strong&gt;的重要性。它教育海蒂（也启示观众）不要盲目听信传言，而要通过亲身观察和体验来形成自己的判断，这是海蒂成长的关键一课。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“你喜欢故事，不是吗？如果你现在会读书的话，就可以知道故事接下来发生了什么。”&lt;/strong&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;strong&gt;知识与阅读的力量&lt;/strong&gt;。它以一种温柔的方式激发了海蒂对知识的渴望，让她意识到读书能够打开一个更广阔的世界，获取更多快乐，从而推动了海蒂对学习态度的转变。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“大家知道的太少，因为他们只知道这个村子。但是你见过这个世界更多的东西不是吗？”&lt;/strong&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;strong&gt;视野与格局&lt;/strong&gt;，鼓励人们跳出狭隘的环境，去体验更广阔的世界。它暗示了见识的重要性，并为海蒂对写作的梦想提供了坚实的精神支持。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“如果生命中有某件事情让你开心，那你就尽管去做，不管别人说什么。”&lt;/strong&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;strong&gt;追求快乐和自我实现&lt;/strong&gt;。它传递了一种积极乐观的生活态度，鼓励人们勇敢地活出真实的自己。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“她需要什么？她的家。”&lt;/strong&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;strong&gt;家的重要性&lt;/strong&gt;和&lt;strong&gt;对自由的渴望&lt;/strong&gt;。它揭示了海蒂梦游的根本原因——思念阿尔卑斯山上的家和自由的生活，凸显了自然环境对她身心健康的关键作用。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“我不是来这儿玩乐的，我是来工作的。”&lt;/strong&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;strong&gt;纯真直接的性格&lt;/strong&gt;和对&lt;strong&gt;规则的懵懂认知&lt;/strong&gt;。同时也暗示了城市生活对她天性的压抑，以及她对自由生活本能的向往。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“你永远不要因为某件事结束了而哭泣，你应该为它曾经发生过而微笑。”&lt;/strong&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;strong&gt;积极面对离别与变化&lt;/strong&gt;的哲学。它教导海蒂（和观众）学会感恩过去的美好，而不是沉溺于失去的悲伤，展现了成熟豁达的人生态度。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“那是因为你和海蒂在一起，你很开心。”&lt;/strong&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;strong&gt;友情的力量与治愈作用&lt;/strong&gt;。海蒂的到来给克拉拉带来了欢乐和希望，印证了纯粹的友谊能够给人的身心带来积极影响。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“如果我必须写下所有我看过的美丽事物，那这本书可就太厚了。”&lt;/strong&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;strong&gt;对生活的热爱和对美的感知力&lt;/strong&gt;，也预示了她未来成为作家的潜质。它强调了用心感受生活，发现日常之美的重要性。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“她需要阳光和新鲜空气。”&lt;/strong&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;strong&gt;自然环境对健康的积极影响&lt;/strong&gt;。它不仅是克拉拉身体康复的关键，也象征着人类回归自然本真的重要性，与影片开篇对阿尔卑斯山景的描绘相呼应。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&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;&lt;strong&gt;现实主义与温情并存&lt;/strong&gt;：影片以现实主义的手法，细腻地描绘了19世纪末期瑞士和德国的生活图景，包括阿尔卑斯山区的简朴与法兰克福都市的严谨。同时，导演注入了充沛的温情，使得影片充满治愈感，避免了过度戏剧化的冲突，而是将重点放在人物情感的自然流露和成长上。这种风格让影片既有扎实的现实基础，又不失触动人心的温暖力量。&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;/section&gt;
&lt;section&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;ol&gt;
&lt;li&gt;&lt;strong&gt;经典文学改编的典范&lt;/strong&gt;：约翰娜·施皮里的《海蒂》作为世界儿童文学经典，已被多次影视化改编，其中不乏1937年秀兰·邓波儿版和宫崎骏工作室的动画《阿尔卑斯山的少女》等珠玉在前。2015年版的《海蒂和爷爷》在尊重原作纯真动人故事内核的基础上，通过卓越的电影语言，将文学之美成功转化为影像之美。影片在呈现自然风光、细腻刻画人物心理和捕捉生活化细节方面做得尤为出色，被认为是在如何呈现主旨方面“万分出彩”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;普世主题的现代回响&lt;/strong&gt;：影片超越了简单的儿童故事范畴，深入探讨了自由与规训、人与自然、亲情与友情、成长与自我实现等多个普世主题。这些主题在任何时代都具有深刻的社会意义。在当下快节奏、高压力的现代社会中，影片所传递的回归自然、追求内心自由、相信本真的价值观，为观众提供了宝贵的精神慰藉和治愈力量。它提醒人们关注心灵的富足而非物质的堆砌。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;治愈系电影的代表作&lt;/strong&gt;：影片被广泛认为是“治愈系电影”的代表，其纯净的画面、真挚的情感和温暖的结局，能够抚慰人心，带来积极向上的情绪体验。这种强大的治愈力，使其在众多影片中脱颖而出，赢得了全球观众的广泛赞誉和高分评价（如豆瓣评分9.3分）。它通过展现真实具象的生活美好，触动了观众心中最柔软的弦。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对比与参照&lt;/strong&gt;：与同类以儿童为主角、探讨成长的影片（如《小鞋子》、《我是山姆》、《菊次郎的夏天》等）相比，《海蒂和爷爷》以其独特的阿尔卑斯山背景和对自然环境的极致展现，构建了一种更为纯粹和远离尘嚣的治愈氛围。它没有《一个叫欧维的男人决定去死》中对老年人固执己见的幽默讽刺，也不同于《忠犬八公的故事》那般极致的悲情，而是以一种更加平和、自然的方式，将人性的光辉和生活的希望娓娓道来，形成其独有的艺术风格和市场定位。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&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;strong&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;/strong&gt; → &lt;strong&gt;社会意义（呼唤回归自然、关注儿童成长、重塑人际信任、反思现代生活）&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;通过这一链条，影片成功地将一个简单的儿童故事提升到对人类普遍价值和生存状态的深层思考，使其不仅是一部适合全家观看的影片，更是一部具有深刻社会启示和持久艺术魅力的作品。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>马斯克推荐的50个认知偏差陷阱，你中招了吗？</title><link>https://blog.moewah.com/posts/musk-50-cognitive-biases-pitfall-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/musk-50-cognitive-biases-pitfall-guide/</guid><description>为什么我们总是做出错误判断？本文揭秘马斯克推荐的50种认知偏差，解析从众效应、确认偏差等常见思维陷阱，教你如何识别并避开这些影响学习与决策的隐形障碍。</description><pubDate>Wed, 14 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;👋 你们有没有过这样的经历：明明觉得自己的决定超正确，结果却事与违？或者，为什么有时候会莫名其妙地相信一些事情，即使后来发现是错的？🤷‍♀️🤷‍♂️&lt;/p&gt;
&lt;p&gt;这背后可能藏着一些“小秘密”，心理学家们称之为&lt;strong&gt;认知偏差&lt;/strong&gt;。它们就像大脑里的“小捷径”，帮助我们快速处理信息，但有时也会让我们掉进思维的陷阱里。&lt;/p&gt;
&lt;p&gt;就连科技大佬埃隆·马斯克都曾在社交媒体上分享了一份包含50种认知偏差的列表，并强调这些知识“应该从小教给所有人”！✨ 这足以说明认识认知偏差有多重要。&lt;/p&gt;
&lt;p&gt;这份报告就是一份为你量身打造的“认知偏差避坑指南”！我们将一起揭开这些思维陷阱的面纱，了解它们是如何影响我们的学习、交友和生活的，并学习如何聪明地绕开它们，成为更理性、更强大的自己！💪&lt;/p&gt;
&lt;section&gt;&lt;h3&gt;马斯克推荐的50种认知偏差：从何而来？有哪些？&lt;a href=&quot;#马斯克推荐的50种认知偏差从何而来有哪些&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;马斯克在Twitter上分享的这份认知偏差列表，最初来源于 Carly Hallman 于2020年1月7日在 TitleMax.com 上发布的一篇文章。这份列表汇集了心理学和行为经济学领域中一些最常见、影响最广泛的认知偏差。&lt;/p&gt;&lt;p&gt;虽然我们无法在此列出完整的50个偏差（篇幅有限，且部分偏差名称可能存在不同翻译），但这份列表涵盖了许多我们日常生活中经常遇到的思维误区。它们提醒我们，人类的思维并非总是完全理性和客观的。&lt;/p&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;/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;/p&gt;&lt;/section&gt;
&lt;section&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;/p&gt;&lt;section&gt;&lt;h4&gt;1. 从众效应 (Bandwagon Effect) 🐑&lt;a href=&quot;#1-从众效应-bandwagon-effect-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指个体受群体影响，不考虑对错，将多数人的意见或行为作为自己的选择。就像羊群一样，一只羊动了，其他羊也会跟着动。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;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;/section&gt;&lt;section&gt;&lt;h4&gt;2. 确认偏差 (Confirmation Bias) 👀&lt;a href=&quot;#2-确认偏差-confirmation-bias-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们倾向于寻找、解释和记忆那些能够支持自己已有信念的信息，而忽略或低估那些与自己信念相悖的信息。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;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;/section&gt;&lt;section&gt;&lt;h4&gt;3. 光环效应 (Halo Effect) ✨&lt;a href=&quot;#3-光环效应-halo-effect-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们对他人的某个突出特点（如外貌、成就）形成好的或坏的整体印象，并以此推断其其他方面的品质。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;4. 幸存者偏差 (Survivorship Bias) 🏆&lt;a href=&quot;#4-幸存者偏差-survivorship-bias-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指我们只关注“幸存”下来的事物，而忽略了那些在过程中被淘汰或失败的事物，从而得出错误的结论。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;5. 基本归因错误 (Fundamental Attribution Error) 🤔➡️🏠&lt;a href=&quot;#5-基本归因错误-fundamental-attribution-error-️&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指在解释他人行为时，倾向于归因于其内在特质（性格、能力），而在解释自己的行为时，倾向于归因于外部情境因素。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;p&gt;&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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;6. 邓宁-克鲁格效应 (Dunning-Kruger Effect) ⛰️&lt;a href=&quot;#6-邓宁-克鲁格效应-dunning-kruger-effect-️&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指能力越差的人越倾向于高估自己的能力，而能力越强的人反而可能低估自己。就像爬山，刚开始爬的人觉得自己很快就能登顶，而爬得越高的人越知道山外有山。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;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;/section&gt;&lt;section&gt;&lt;h4&gt;7. 锚定偏差 (Anchoring Bias) ⚓&lt;a href=&quot;#7-锚定偏差-anchoring-bias-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们在做判断时，容易过度依赖最先获得的信息（“锚点”），即使这个信息可能与最终的判断无关。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;8. 乐观偏差 (Optimism Bias) 😊&lt;a href=&quot;#8-乐观偏差-optimism-bias-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指个体倾向于认为自己更可能经历积极事件，而他人更可能遭遇消极事件。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;9. 沉没成本偏差 (Sunk Cost Fallacy) 💸&lt;a href=&quot;#9-沉没成本偏差-sunk-cost-fallacy-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们在决定是否继续做一件事情时，会受到已经投入的成本（时间、金钱、精力）的影响，即使继续投入是不明智的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;10. 情绪预测偏差 (Affective Forecasting Error) 🎢&lt;a href=&quot;#10-情绪预测偏差-affective-forecasting-error-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们在预测未来事件会给自己带来何种情绪以及情绪的强度和持续时间时，常常出现偏差。青少年在这方面尤为突出，可能高估情绪的强度。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;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;/section&gt;&lt;section&gt;&lt;h4&gt;11. 可得性启发 (Availability Heuristic) 🧠💡&lt;a href=&quot;#11-可得性启发-availability-heuristic-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们在判断事件发生的可能性时，倾向于依赖脑海中最容易想到的信息或例子，即使这些信息并不具有代表性。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;12. 代表性启发 (Representativeness Heuristic) 👥&lt;a href=&quot;#12-代表性启发-representativeness-heuristic-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们在判断事物时，倾向于将其与某个原型或刻板印象进行比较，而不是考虑其真实的概率。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;13. 框架效应 (Framing Effect) 🖼️&lt;a href=&quot;#13-框架效应-framing-effect-️&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们对同一个问题的不同描述方式（不同的“框架”）会影响他们的选择，即使这些描述在本质上是等价的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;老师说“这次考试有70%的同学及格了”，你可能觉得还不错。如果老师说“这次考试有30%的同学不及格”，你可能就会觉得很糟糕，即使是同一场考试。&lt;/li&gt;
&lt;li&gt;家长说“少玩一小时手机，多看半小时书”，你可能觉得被限制了。如果家长说“每天多看半小时书，可以让你学到更多有趣的知识”，你可能更容易接受。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;为什么重要？&lt;/strong&gt; 框架效应说明我们的决策很容易受到信息呈现方式的影响，可能导致我们做出非理性的选择。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;如何避开？&lt;/strong&gt;&lt;/p&gt;&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;/section&gt;&lt;section&gt;&lt;h4&gt;14. 禀赋效应 (Endowment Effect) 🎁&lt;a href=&quot;#14-禀赋效应-endowment-effect-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们对自己拥有的东西赋予更高的价值，仅仅因为他们拥有它。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;p&gt;&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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;15. 锚定效应 (Anchoring Effect) ⚓️ (重复，但可以从不同角度阐述)&lt;a href=&quot;#15-锚定效应-anchoring-effect-️-重复但可以从不同角度阐述&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; （同上，强调初始信息的影响）&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;p&gt;&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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;16. 焦点效应 (Spotlight Effect) 💡👤&lt;a href=&quot;#16-焦点效应-spotlight-effect-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们倾向于高估自己被他人关注和注意的程度。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;17. 盲点偏差 (Bias Blind Spot) 🙈&lt;a href=&quot;#17-盲点偏差-bias-blind-spot-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们倾向于认为自己比他人更少受到认知偏差的影响。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;p&gt;&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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;18. 伪集体行动偏差 (False Consensus Effect) 🤝&lt;a href=&quot;#18-伪集体行动偏差-false-consensus-effect-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们倾向于高估他人与自己持有相同信念、价值观和行为方式的程度。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;19. 赌徒谬误 (Gambler’s Fallacy) 🎲&lt;a href=&quot;#19-赌徒谬误-gamblers-fallacy-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们认为独立随机事件的结果会受到之前结果的影响。比如，连续抛硬币出现几次正面后，就认为下一次出现反面的概率会更大。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;p&gt;&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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;20. 热手谬误 (Hot-Hand Fallacy) 🔥🏀&lt;a href=&quot;#20-热手谬误-hot-hand-fallacy-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 与赌徒谬误相反，指人们认为如果某人或某事连续成功，那么下一次成功的概率也会更高。比如，一个篮球运动员连续投中几个球后，就认为他“手热”，下一球更容易投中。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;p&gt;&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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;21. 宜家效应 (IKEA Effect) 🛠️&lt;a href=&quot;#21-宜家效应-ikea-effect-️&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们对自己亲手制作或组装的东西赋予更高的价值。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;p&gt;&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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;22. 峰终定律 (Peak-End Rule) 🎢➡️🔚&lt;a href=&quot;#22-峰终定律-peak-end-rule-️&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们对一段经历的记忆，主要取决于这段经历中“峰值”（最强烈的情绪体验）和“终点”时的感受，而对过程中的其他部分印象模糊。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;p&gt;&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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;23. 负面偏差 (Negativity Bias) 😠&lt;a href=&quot;#23-负面偏差-negativity-bias-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们倾向于更关注、记住和回想负面信息或经历，而不是正面信息或经历。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;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;/section&gt;&lt;section&gt;&lt;h4&gt;24. 计划谬误 (Planning Fallacy) ⏳&lt;a href=&quot;#24-计划谬误-planning-fallacy-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们在预测完成一项任务所需的时间时，倾向于低估实际所需的时间，即使他们知道过去类似任务都花费了更多时间。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;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;/section&gt;&lt;section&gt;&lt;h4&gt;25. 承诺升级 (Escalation of Commitment) 🎢💸&lt;a href=&quot;#25-承诺升级-escalation-of-commitment-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们在面对一个已经投入了大量资源（时间、金钱、精力）但前景不明的项目时，倾向于继续投入更多资源，而不是放弃。这与沉没成本偏差有关。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;p&gt;&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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;26. 现状偏差 (Status Quo Bias) 🛋️&lt;a href=&quot;#26-现状偏差-status-quo-bias-️&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们倾向于维持现状，即使改变可能带来更好的结果。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;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;/section&gt;&lt;section&gt;&lt;h4&gt;27. 控制错觉 (Illusion of Control) 🕹️&lt;a href=&quot;#27-控制错觉-illusion-of-control-️&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们倾向于高估自己对某些事件结果的控制程度，即使这些事件主要是随机的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;28. 后见之明偏差 (Hindsight Bias) 🤔🔙&lt;a href=&quot;#28-后见之明偏差-hindsight-bias-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们在得知事件结果后，倾向于认为自己早就预测到了这个结果，或者认为这个结果是显而易见的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;29. 晕轮效应 (Halo Effect) ✨ (重复，但可以从不同角度阐述)&lt;a href=&quot;#29-晕轮效应-halo-effect--重复但可以从不同角度阐述&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; （同上，强调对整体印象的影响）&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;p&gt;&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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;30. 道德运气 (Moral Luck) 🍀&lt;a href=&quot;#30-道德运气-moral-luck-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指在道德评价中，一个人的行为是否被认为是道德的，有时取决于他无法控制的外部因素或结果。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;p&gt;&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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;31. 焦点偏差 (Focusing Effect) 🎯&lt;a href=&quot;#31-焦点偏差-focusing-effect-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们在判断某个事物的价值或重要性时，会过度关注其中一个突出的方面，而忽略其他方面。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;p&gt;&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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;32. 组内偏爱 (In-group Bias) ❤️‍🩹&lt;a href=&quot;#32-组内偏爱-in-group-bias-️&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们倾向于对自己所属的群体（“自己人”）持有更积极的态度和评价，而对外部群体持有更消极的态度和评价。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;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;/section&gt;&lt;section&gt;&lt;h4&gt;33. 道德推脱 (Moral Disengagement) 🛡️&lt;a href=&quot;#33-道德推脱-moral-disengagement-️&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指个体通过一系列认知机制，使自己在做出伤害他人或违反道德规范的行为时，能够减轻内心的罪恶感和自责。这在网络欺凌等行为中尤为常见。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;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;/section&gt;&lt;section&gt;&lt;h4&gt;34. 朴素实在论 (Naive Realism) 🌍➡️👀&lt;a href=&quot;#34-朴素实在论-naive-realism-️&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们倾向于认为自己对世界的感知是客观和真实的，而那些与自己观点不同的人是因为他们没有看到事实，或者他们是无知、不理性的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;p&gt;&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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;35. 易得性层叠 (Availability Cascade) 📢&lt;a href=&quot;#35-易得性层叠-availability-cascade-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指一个观点或信念通过媒体或社交网络反复传播，变得越来越普遍和可信，即使它可能缺乏事实依据。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;p&gt;&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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;36. 虚假记忆 (False Memory) 🧠💭❌&lt;a href=&quot;#36-虚假记忆-false-memory-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们对过去的事情产生错误或扭曲的记忆。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;p&gt;&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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;37. 聚焦错觉 (Focusing Illusion) 🔍&lt;a href=&quot;#37-聚焦错觉-focusing-illusion-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们在判断某个因素对幸福或满意度的影响时，会过度关注这个因素，而忽略其他重要因素。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;p&gt;&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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;38. 损失厌恶 (Loss Aversion) 💔&lt;a href=&quot;#38-损失厌恶-loss-aversion-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们对损失的痛苦程度，大于获得同等收益的快乐程度。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;考试丢了5分，比考了95分更让你难过。&lt;/li&gt;
&lt;li&gt;丢了10块钱，比捡到10块钱更让你在意。&lt;/li&gt;
&lt;li&gt;害怕失败，因为失败带来的痛苦感更强烈。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;为什么重要？&lt;/strong&gt; 损失厌恶可能导致我们过于保守，不愿意冒险尝试，错失机会。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;如何避开？&lt;/strong&gt;&lt;/p&gt;&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;/section&gt;&lt;section&gt;&lt;h4&gt;39. 互惠式偏见 (Reciprocity Bias) 👋🔄&lt;a href=&quot;#39-互惠式偏见-reciprocity-bias-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们倾向于回报他人的好意或恶意。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;p&gt;&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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;40. 叙事谬误 (Narrative Fallacy) 📖&lt;a href=&quot;#40-叙事谬误-narrative-fallacy-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们倾向于将一系列事实或事件组织成一个有逻辑、有意义的故事，即使这些事件之间可能并没有真正的因果关系。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;p&gt;&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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;41. 乐观偏见 (Optimism Bias) 😊 (重复，但可以从不同角度阐述)&lt;a href=&quot;#41-乐观偏见-optimism-bias--重复但可以从不同角度阐述&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; （同上，强调对自身未来的非现实乐观）&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;p&gt;&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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;42. 规划谬误 (Planning Fallacy) ⏳ (重复，但可以从不同角度阐述)&lt;a href=&quot;#42-规划谬误-planning-fallacy--重复但可以从不同角度阐述&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; （同上，强调低估完成任务所需时间）&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;p&gt;&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;/section&gt;&lt;section&gt;&lt;h4&gt;43. 易得性偏差 (Availability Bias) 🧠💡 (重复，但可以从不同角度阐述)&lt;a href=&quot;#43-易得性偏差-availability-bias--重复但可以从不同角度阐述&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; （同上，强调依赖容易想到的信息）&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;p&gt;&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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;44. 确认偏差 (Confirmation Bias) 👀 (重复，但可以从不同角度阐述)&lt;a href=&quot;#44-确认偏差-confirmation-bias--重复但可以从不同角度阐述&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; （同上，强调寻找支持自己观点的信息）&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;p&gt;&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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;45. 锚定效应 (Anchoring Effect) ⚓️ (重复，但可以从不同角度阐述)&lt;a href=&quot;#45-锚定效应-anchoring-effect-️-重复但可以从不同角度阐述&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; （同上，强调初始信息的影响）&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;p&gt;&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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;46. 邓宁-克鲁格效应 (Dunning-Kruger Effect) ⛰️ (重复，但可以从不同角度阐述)&lt;a href=&quot;#46-邓宁-克鲁格效应-dunning-kruger-effect-️-重复但可以从不同角度阐述&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; （同上，强调能力与自信的反比关系）&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;p&gt;&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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;47. 基础比率忽略 (Base Rate Neglect) 📊&lt;a href=&quot;#47-基础比率忽略-base-rate-neglect-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们在做判断时，倾向于忽略统计学上的基础比率信息，而过度关注个别案例或描述性信息。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;p&gt;&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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;48. 情感启发 (Affect Heuristic) ❤️➡️🤔&lt;a href=&quot;#48-情感启发-affect-heuristic-️️&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们在做判断或决策时，过度依赖自己的情感反应，而不是理性分析。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;49. 熟悉度偏差 (Familiarity Bias) 👋😊&lt;a href=&quot;#49-熟悉度偏差-familiarity-bias-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们倾向于偏爱自己熟悉的事物，即使有更好的选择。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;50. 自我服务偏差 (Self-Serving Bias) 👍👎&lt;a href=&quot;#50-自我服务偏差-self-serving-bias-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;这是什么？&lt;/strong&gt; 指人们倾向于将自己的成功归因于内在因素（能力、努力），而将失败归因于外部因素（运气不好、环境不利）。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;青少年例子：&lt;/strong&gt;&lt;/p&gt;&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;p&gt;&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;/ul&gt;&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;💡 小贴士：&lt;/strong&gt; 这只是50种认知偏差中的一部分。了解更多偏差，可以帮助你更全面地认识人类思维的复杂性。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;section&gt;&lt;h4&gt;1. 影响学习与学业 📚&lt;a href=&quot;#1-影响学习与学业-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&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;/section&gt;&lt;section&gt;&lt;h4&gt;2. 影响社交与人际关系 👫👭👬&lt;a href=&quot;#2-影响社交与人际关系-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&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;/section&gt;&lt;section&gt;&lt;h4&gt;3. 影响决策与行为 🚦&lt;a href=&quot;#3-影响决策与行为-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&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;li&gt;&lt;strong&gt;“弱现实感”：&lt;/strong&gt; 过度依赖网络可能导致青少年在现实生活中缺乏意义感，不善于处理现实事务，表现出“弱现实感”，影响其行为和适应能力。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;4. 影响心理健康 🌱&lt;a href=&quot;#4-影响心理健康-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&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;hr /&gt;&lt;p&gt;&lt;strong&gt;📊 数据可视化建议：&lt;/strong&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;/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;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;社交&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;从众效应、组内偏爱、光环效应、基本归因错误、伪集体行动偏差、焦点效应、网络欺凌（道德推脱）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;决策&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;乐观偏差、沉没成本偏差、锚定偏差、基础比率忽略、情感启发、情绪预测偏差、控制错觉&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;section&gt;&lt;h4&gt;1. 培养批判性思维 🧐&lt;a href=&quot;#1-培养批判性思维-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&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;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;li&gt;&lt;strong&gt;参与讨论和辩论：&lt;/strong&gt; 在与他人交流中，倾听不同观点，锻炼自己的思考能力。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;2. 提升元认知能力 🤔➡️🧠&lt;a href=&quot;#2-提升元认知能力-️&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&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;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;/section&gt;&lt;section&gt;&lt;h4&gt;3. 寻求多元视角和信息来源 🌐&lt;a href=&quot;#3-寻求多元视角和信息来源-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&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;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;/section&gt;&lt;section&gt;&lt;h4&gt;4. 情绪管理与压力应对 ❤️‍🩹🧘‍♀️&lt;a href=&quot;#4-情绪管理与压力应对-️️&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&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;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;/section&gt;&lt;section&gt;&lt;h4&gt;5. 设定合理目标与行动计划 🎯🗓️&lt;a href=&quot;#5-设定合理目标与行动计划-️&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&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;strong&gt;SMART原则：&lt;/strong&gt; 设定具体（Specific）、可衡量（Measurable）、可达成（Achievable）、相关（Relevant）、有时限（Time-bound）的目标。&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;/section&gt;&lt;section&gt;&lt;h4&gt;6. 学习心理学知识 🧠📖&lt;a href=&quot;#6-学习心理学知识-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;了解一些基本的心理学原理，特别是关于认知偏差和决策的知识，可以帮助你更好地认识自己和他人。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;建议：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;阅读心理学科普书籍或文章。&lt;/li&gt;
&lt;li&gt;关注相关的心理健康教育资源。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;7. 寻求专业帮助 🤝👩‍⚕️&lt;a href=&quot;#7-寻求专业帮助-️&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;如果认知偏差导致了严重的心理困扰或行为问题，不要害怕寻求专业的心理咨询或治疗。认知行为疗法（CBT）等方法被证实对纠正不适应的认知模式有效。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;8. 利用新技术和创新方法 📱🎮&lt;a href=&quot;#8-利用新技术和创新方法-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;可以探索利用新技术来帮助识别和克服认知偏差。例如，一些教育应用或游戏可能融入了认知训练的元素。设计思维等方法也可以帮助培养创新和批判性思维能力。&lt;/p&gt;&lt;hr /&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;mindmap
  root((克服认知偏差))
    批判性思维
      多问为什么
      区分事实与观点
      评估信息来源
      逻辑推理
      参与讨论
    元认知能力
      反思思维过程
      写反思日记
      监控学习过程
    多元视角与信息
      拓宽阅读范围
      关注不同媒体
      与不同背景人交流
      媒介素养教育
    情绪管理与压力应对
      识别和表达情绪
      学习放松技巧
      寻求支持
    设定合理目标与计划
      SMART原则
      分解任务
      定期回顾调整
    学习心理学知识
      阅读科普书籍
      关注教育资源
    寻求专业帮助
      心理咨询
      认知行为疗法
    新技术与创新方法
      教育应用/游戏
      设计思维&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;/p&gt;&lt;p&gt;记住，成长是一个不断探索和完善自我的过程。了解认知偏差，就像拥有了一张“思维地图”，可以帮助你更好地驾驭复杂的外部世界和自己的内心世界。&lt;/p&gt;&lt;p&gt;希望这份报告能为你提供一些启发和帮助。从现在开始，做一个有意识的思考者，不断挑战自己的思维盲点，拥抱多元的视角，你将拥有更广阔的未来！🌟&lt;/p&gt;&lt;p&gt;&lt;strong&gt;加油吧，少年！未来可期！&lt;/strong&gt; 💪🌈&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Markdown SEO Frontmatter 批量生成器</title><link>https://blog.moewah.com/posts/markdown-seo-frontmatter-batch-generator/</link><guid isPermaLink="true">https://blog.moewah.com/posts/markdown-seo-frontmatter-batch-generator/</guid><description>如何高效将 Obsidian 笔记转换为 Astro 站点？本文详解增强版 Markdown SEO Frontmatter 批量生成器，支持智能分类、SEO 属性自动生成与文件整理，提升内容迁移效率。</description><pubDate>Tue, 13 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;Astro 框架&lt;/strong&gt; 正受到广泛关注，此脚本正是为那些 &lt;strong&gt;Obsidian、Typera 及本地 Markdown 文档&lt;/strong&gt; 用户设计的批量 SEO Frontmatter 生成与文章分类整理工具的增强版本。它能够将本地笔记批量转换为适配 &lt;strong&gt;Astro 静态网站&lt;/strong&gt; 并兼容 &lt;strong&gt;Firefly 主题&lt;/strong&gt; 的标准格式，实现从笔记到博客的无缝迁移。&lt;/p&gt;&lt;p&gt;脚本通过本地 AI 服务（支持 Ollama、LM Studio 等 OpenAI API 兼容服务）实现智能化文章分类和 SEO 属性生成，大幅提升内容整理效率。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;✨ 核心功能特性&lt;a href=&quot;#-核心功能特性&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;ul&gt;
&lt;li&gt;&lt;strong&gt;自动分类模式&lt;/strong&gt;：使用本地 AI 模型分析文章内容，自动归类到预定义目录&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;严谨分类逻辑&lt;/strong&gt;：采用专用的低温度配置（0.01）确保分类结果准确一致&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;格式严格校验&lt;/strong&gt;：增强提示词确保 AI 输出标准分类名称&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. SEO Frontmatter 自动生成&lt;a href=&quot;#2-seo-frontmatter-自动生成&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;title&lt;/code&gt;、&lt;code&gt;description&lt;/code&gt;、&lt;code&gt;tags&lt;/code&gt;、&lt;code&gt;slug&lt;/code&gt;、&lt;code&gt;image&lt;/code&gt;、&lt;code&gt;published&lt;/code&gt;、&lt;code&gt;updated&lt;/code&gt; 等必要字段。（&lt;code&gt;image&lt;/code&gt; 作为&lt;strong&gt;Astro Firefly 主题&lt;/strong&gt;的封面变量，可按需配置使用二次元随机API或自定义封面图片地址）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SEO 优化规则&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;标题：基于爆款标题公式，包含相关 Emoji&lt;/li&gt;
&lt;li&gt;描述：疑问句式 + 解决方案，80-100字，包含核心关键词&lt;/li&gt;
&lt;li&gt;标签：三层标签法（赛道/行业 + 内容深度/方法论 + 核心术语/SEO关键词）&lt;/li&gt;
&lt;li&gt;Slug：英文小写单词连接，14个单词以内，无中文字符&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;&lt;strong&gt;全局更新模式&lt;/strong&gt;：重写所有文件的 Frontmatter&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;增量更新模式&lt;/strong&gt;：仅补全缺失的 Frontmatter 字段&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;字段保留规则&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;智能保留有效的 &lt;code&gt;published&lt;/code&gt; 日期&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;强制更新 &lt;code&gt;updated&lt;/code&gt; 字段&lt;/strong&gt;为当前日期&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;符合格式要求的 &lt;code&gt;slug&lt;/code&gt; 字段默认保留&lt;/strong&gt;（避免 URL 变化）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;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;：支持 macOS、Windows、Linux 系统文件忽略&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. 高度可配置&lt;a href=&quot;#5-高度可配置&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;可调节 AI 温度参数（分类与 SEO 生成使用不同温度）&lt;/li&gt;
&lt;li&gt;多种日期模式选择&lt;/li&gt;
&lt;li&gt;灵活的更新策略配置&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;此脚本仅需 Python 标准库，&lt;strong&gt;无需额外安装任何第三方包&lt;/strong&gt;！&lt;/p&gt;&lt;section&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;Python 3.7+&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;网络连接（用于访问本地 AI 服务）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;ul&gt;
&lt;li&gt;&lt;strong&gt;本地 AI 服务&lt;/strong&gt;：Ollama、LM Studio 或其他兼容 OpenAI API 的服务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模型建议&lt;/strong&gt;：支持中文的模型，如 &lt;code&gt;qwen3-vl-30b-a3b-instruct-mlx&lt;/code&gt; （思考推理模型效果更好，但速度较慢。请按需配置模型，若笔记不敏感强烈建议还是使用平台的API 是更高效的方式。）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务地址&lt;/strong&gt;：&lt;code&gt;http://localhost:1234/v1/chat/completions&lt;/code&gt;（可自定义）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;✅ macOS&lt;/li&gt;
&lt;li&gt;✅ Windows&lt;/li&gt;
&lt;li&gt;✅ Linux&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;obsdian-seo-plus-enhanced.py&lt;/code&gt; 文件&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#!/usr/bin/env python3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;增强版 Obsidian SEO Frontmatter 生成与文章分类整理脚本&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;功能：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. 扫描指定目录下的所有Markdown文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. 可选模式：自动分类整理（使用AI分类并移动文件）或默认模式（使用目录名作为分类）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. 为文章生成SEO优化的Frontmatter属性（title, description, tags, slug, image, published等）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4. 支持全局更新和增量更新模式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;5. 自动清理空目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;配置说明：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 根据需求修改下面的配置区域&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- ORGANIZE_MODE 控制目录整理模式：&apos;auto&apos;（自动分类整理）或 &apos;default&apos;（使用目录名作为分类）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- UPDATE_MODE 控制Frontmatter更新模式：&apos;global&apos;（全局重写）或 &apos;incremental&apos;（增量补全）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;重要说明：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- updated字段强制更新：不管是增量更新还是全局更新，updated字段都会被更新为当前日期&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- slug字段默认保留：如果slug符合格式要求（只包含英文小写字母、数字和连字符），则保留原值&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; argparse&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; os&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; random&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; shutil&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt; urllib&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt; urllib&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; datetime &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt; datetime&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; timedelta&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# ==================== 配置区域 ====================&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 注意：以下配置项需要根据你的实际情况进行修改&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# --- AI API 配置 ---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;API_URL&lt;/span&gt;&lt;span&gt; &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;http://localhost:1234/v1/chat/completions&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 本地AI服务地址，支持Ollama、LM Studio等兼容OpenAI API的服务&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;MODEL_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;&quot;&lt;/span&gt;&lt;span&gt;qwen3-vl-30b-a3b-instruct-mlx&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;TEMPERATURE&lt;/span&gt;&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.3&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# SEO生成温度配置 (0.0 - 1.0)，值越高输出越随机，值越低输出越确定&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;CLASSIFY_TEMPERATURE&lt;/span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# --- 目录路径配置 ---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;SOURCE_DIR&lt;/span&gt;&lt;span&gt; &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;./WEBNOTE&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# --- 目录整理模式配置 ---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 可选模式：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 1. &quot;auto&quot;: 自动分类整理模式 - 使用AI对文章进行分类，并移动到对应分类目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 2. &quot;default&quot;: 默认模式 - 使用文件所在目录名作为分类，不移动文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;ORGANIZE_MODE&lt;/span&gt;&lt;span&gt; &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;auto&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 可切换为 &quot;auto&quot; 或 &quot;default&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 当 ORGANIZE_MODE 为 &quot;auto&quot; 时，需要配置以下分类列表&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;51&lt;/div&gt;&lt;/div&gt;&lt;div&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;52&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;53&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;AI实验室&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;54&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;NAS私有云&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;55&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;私有化部署&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;56&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;虚拟化与运维&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;57&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;网络与安全&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;58&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;硬件教程&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;59&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;增长与SEO&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;60&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;认知与成长&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;61&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;光影与生活&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;62&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;未分类&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;63&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;64&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;65&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 系统提示词：指导AI进行分类&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;66&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 提示词质量直接影响分类准确性&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;67&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 可以调整提示词以更好地适应你的分类需求&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;68&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;SYSTEM_PROMPT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;&quot;&quot;你是一位专业的数字内容管理专家（博客整理专家）。请分析文章内容，从下列分类列表中选出最匹配的一个目录。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;69&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;70&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**核心原则**：根据文章的主体、目的和最终交付物三个维度最终确定分类列表中最匹配的分类。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;71&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;72&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**模糊判断**：当有疑问时，问自己：“这篇文章让读者学到什么？”&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;73&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 想教会读者**做一件事** → 技术/工具类目录。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;74&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 想启发读者**思考一件事** → 内容/认知类目录。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;75&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;76&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**格式要求（严格遵守）**：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;77&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. 输出必须完全匹配分类列表中的完整名称，不能添加、删除或修改任何字符&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;78&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. 输出前后不能有任何空格、标点、引号、括号或其他字符&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;79&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. 只能输出单个分类名称，不能有&quot;分类：&quot;、&quot;目录：&quot;等前缀&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;80&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4. 如果文章内容无法匹配下列任何分类，必须严格输出&quot;未分类&quot;三个字&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;81&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;82&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**输出示例（正确格式）**：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;83&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;AI实验室&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;84&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;光影与生活&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;85&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Astro教程&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;86&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;87&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**错误格式示例（避免）**：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;88&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;分类：AI实验室 （错误：包含前缀）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;89&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;AI实验室。 （错误：包含标点）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;90&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;AI实验室   （错误：包含空格）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;91&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;AI实验室, 虚拟化与运维 （错误：多个分类）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;92&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;93&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**分类决策流程**：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;94&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. 阅读文章标题和内容&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;95&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. 对照分类列表，思考每个分类的定义&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;96&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. 选择最匹配的分类（即使不完全匹配，也选择最接近的）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;97&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4. 如果完全无法匹配，输出&quot;未分类&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;98&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;99&lt;/div&gt;&lt;/div&gt;&lt;div&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;, &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;join&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;&quot;&quot;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;100&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;101&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# --- 日期模式配置 ---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;102&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 可选模式：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;103&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 1. &quot;fixed&quot;: 使用固定的自定义日期（格式如2026-01-10）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;104&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 2. &quot;random_year&quot;: 使用当前日期近一年的随机任意一天（格式如2025-02-10）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;105&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 3. &quot;current&quot;: 使用当前日期&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;106&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;DATE_MODE&lt;/span&gt;&lt;span&gt; &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;current&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 可切换为 &quot;fixed&quot; 或 &quot;random_year&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;107&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;FIXED_DATE&lt;/span&gt;&lt;span&gt; &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;2026-01-10&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 当 DATE_MODE 为 &quot;fixed&quot; 时使用&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;108&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;109&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# --- 更新模式配置 ---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;110&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;UPDATE_MODE&lt;/span&gt;&lt;span&gt; &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;global&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 可切换为 &quot;global&quot; 或 &quot;incremental&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;111&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;112&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# --- 清理配置 ---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;113&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 忽略的文件模式：这些文件不会被计入目录是否为空的条件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;114&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 当清理空目录时，这些文件将被忽略，不会阻止目录被删除&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;115&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;IGNORE_PATTERNS&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;116&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# macOS 系统文件（访达自动生成）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;117&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;.DS_Store&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;118&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;._.DS_Store&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;119&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;.localized&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;120&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;.Spotlight-V100&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;121&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;.Trashes&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;122&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;.fseventsd&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;123&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;._*&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;124&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# Windows 系统文件（资源管理器自动生成）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;125&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Thumbs.db&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;126&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;ehthumbs.db&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;127&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;desktop.ini&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;128&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# Linux 系统文件（某些桌面环境自动生成）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;129&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;.directory&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;130&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;.Trash-*&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;131&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 通用临时文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;132&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;*~&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;133&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;*.tmp&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;134&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;*.temp&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;135&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;~*&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;136&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;*.bak&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;137&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 版本控制文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;138&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;.gitkeep&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;139&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;.gitignore&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;140&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;141&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;142&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 忽略的目录列表：这些目录及其子目录将被跳过，不进行处理&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;143&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;IGNORE_DIRS&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;144&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# Windows 系统目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;145&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$RECYCLE.BIN&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;146&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;System Volume Information&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;147&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# macOS 系统目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;148&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;.TemporaryItems&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;149&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;.DocumentRevisions-V100&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;150&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;.fseventsd&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;151&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;.Spotlight-V100&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;152&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;.Trashes&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;153&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# Linux 系统目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;154&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;.lost+found&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;155&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;.Trash-*&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;156&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;157&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;158&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 调试模式：控制清理过程中的详细输出&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;159&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;DEBUG_MODE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;False&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;160&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;161&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# ==================== 工具函数 ====================&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;162&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;163&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;164&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;should_ignore_file&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;filename&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;165&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;span&gt;检查文件是否应该被忽略（不参与空目录判断）&lt;/span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;166&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; fnmatch&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;167&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;168&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 转换为小写以进行不区分大小写的匹配&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;169&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;filename_lower &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; filename&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lower&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;170&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;171&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; pattern &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;IGNORE_PATTERNS&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;172&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 将模式转换为小写（保留通配符）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;173&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pattern_lower &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;lower&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;174&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;175&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 支持通配符匹配（不区分大小写）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;176&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; fnmatch&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;fnmatch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;filename_lower&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; pattern_lower&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;177&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;True&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;178&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 向后兼容：如果模式没有通配符，检查开头或结尾&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;179&lt;/div&gt;&lt;/div&gt;&lt;div&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;&quot;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;&lt;span&gt; pattern&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;180&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; filename_lower&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;startswith&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;pattern_lower&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;or&lt;/span&gt;&lt;span&gt;&lt;span&gt; filename_lower&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;endswith&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;181&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pattern_lower&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;182&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;183&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;True&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;184&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;False&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;185&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;186&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;187&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;should_ignore_directory&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dir_path&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;188&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;189&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;检查目录是否应该被忽略&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;190&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;191&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;参数:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;192&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;dir_path: 目录路径&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;193&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;194&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;返回:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;195&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;True如果目录在忽略列表中，否则False&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;196&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;197&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; fnmatch&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;198&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt; os&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;199&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;200&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;IGNORE_DIRS&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;201&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;False&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;202&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;203&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 获取目录的绝对路径&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;204&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;abs_dir &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; os&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;abspath&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dir_path&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;205&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 规范化路径大小写（Windows不区分大小写）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;206&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;abs_dir_norm &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; os&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;normcase&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;abs_dir&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;207&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;208&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; ignore_pattern &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;IGNORE_DIRS&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;209&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 处理绝对路径模式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;210&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; os&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;isabs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ignore_pattern&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;211&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;abs_ignore &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; ignore_pattern&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;212&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;213&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;# 相对路径是相对于SOURCE_DIR&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;214&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;abs_ignore &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; os&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;abspath&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;os&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;join&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;SOURCE_DIR&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; ignore_pattern&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;215&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;216&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 规范化忽略路径大小写&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;217&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;abs_ignore_norm &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; os&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;normcase&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;abs_ignore&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;218&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;219&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 检查模式是否包含通配符&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;220&lt;/div&gt;&lt;/div&gt;&lt;div&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;&quot;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; ignore_pattern &lt;/span&gt;&lt;span&gt;or&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; ignore_pattern &lt;/span&gt;&lt;span&gt;or&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;&lt;span&gt; ignore_pattern&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;221&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;# 使用通配符匹配&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;222&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; fnmatch&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;fnmatch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;abs_dir_norm&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; abs_ignore_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;223&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;True&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;224&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;# 也检查目录是否以模式开头（对于目录通配符）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;225&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; abs_ignore_norm&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;endswith&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;*&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;226&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pattern_base &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; abs_ignore_norm&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;rstrip&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;227&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; abs_dir_norm&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;startswith&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;pattern_base&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;228&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;True&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;229&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;230&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;# 无通配符，使用前缀匹配&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;231&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; abs_dir_norm&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;startswith&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;abs_ignore_norm&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;232&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;True&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;233&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;234&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;False&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;235&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;236&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;237&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get_current_date&lt;/span&gt;&lt;span&gt;():&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;238&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;span&gt;根据 DATE_MODE 配置获取当前日期&lt;/span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;239&lt;/div&gt;&lt;/div&gt;&lt;div&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;DATE_MODE&lt;/span&gt;&lt;span&gt; &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;fixed&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;240&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;FIXED_DATE&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;241&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;elif&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DATE_MODE&lt;/span&gt;&lt;span&gt; &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;random_year&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;242&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 生成当前日期近一年内的随机日期&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;243&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;end_date &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; datetime&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;244&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;start_date &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; end_date &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;timedelta&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;days&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;365&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;245&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;246&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 计算两个日期之间的天数差&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;247&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;days_diff &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;end_date &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; start_date&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;days&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;248&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;249&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 生成随机天数偏移&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;250&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;random_days &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; random&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;randint&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; days_diff&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;251&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;252&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 计算随机日期&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;253&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;random_date &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; start_date &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;timedelta&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;days&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;random_days&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;254&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;255&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 格式化为 YYYY-MM-DD&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;256&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; random_date&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;strftime&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;%Y-%m-&lt;/span&gt;&lt;/span&gt;&lt;span&gt;%d&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;257&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;elif&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DATE_MODE&lt;/span&gt;&lt;span&gt; &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;current&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;258&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 返回当前日期&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;259&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; datetime&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span&gt;().&lt;/span&gt;&lt;span&gt;strftime&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;%Y-%m-&lt;/span&gt;&lt;/span&gt;&lt;span&gt;%d&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;260&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;261&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 默认返回当前日期（兼容旧配置）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;262&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; datetime&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span&gt;().&lt;/span&gt;&lt;span&gt;strftime&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;%Y-%m-&lt;/span&gt;&lt;/span&gt;&lt;span&gt;%d&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;263&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;264&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;265&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;validate_published&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;published_str&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;266&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;span&gt;验证published字段格式是否符合YYYY-MM-DD规范&lt;/span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;267&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt;&lt;span&gt; published_str&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;268&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;False&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;269&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 正则匹配YYYY-MM-DD格式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;270&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;^\d&lt;/span&gt;&lt;/span&gt;&lt;span&gt;{4}&lt;/span&gt;&lt;span&gt;-\d&lt;/span&gt;&lt;span&gt;{2}&lt;/span&gt;&lt;span&gt;-\d&lt;/span&gt;&lt;span&gt;{2}&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;271&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bool&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;match&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; published_str&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;272&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;273&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;274&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clean_slug_text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;slug_value&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;275&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;span&gt;清理slug值，移除所有非字母数字字符，只保留英文、数字和连字符&lt;/span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;276&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt;&lt;span&gt; slug_value&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;277&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; slug_value&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;278&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;279&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;280&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;281&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 转换为小写&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;282&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cleaned &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; slug_value&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lower&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;283&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;284&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 将所有非字母数字字符（a-z0-9）替换为连字符&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;285&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cleaned &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;r&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;a-z0-9&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;&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;-&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; cleaned&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;286&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;287&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 移除重复的连字符&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;288&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cleaned &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&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;&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;&quot;&lt;/span&gt;&lt;span&gt;-&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; cleaned&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;289&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;290&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 移除开头和结尾的连字符&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;291&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cleaned &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; cleaned&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;strip&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;292&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;293&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; cleaned&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;294&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;295&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;296&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extract_and_clean_slug&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;frontmatter_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;filename&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;None&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;297&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;span&gt;从Frontmatter文本中提取并清理slug值，如果清理后的slug不理想则基于文件名生成后备slug&lt;/span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;298&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt;&lt;span&gt; frontmatter_text&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;299&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; frontmatter_text&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;300&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;301&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;302&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;303&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 查找slug: &quot;value&quot; 或 slug: value 格式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;304&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;(&lt;/span&gt;&lt;span&gt;slug:\s&lt;/span&gt;&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;\&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;&quot;&lt;/span&gt;&lt;span&gt;\&apos;\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;[&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\&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;)&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;305&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;match &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; re&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;pattern&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; frontmatter_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;IGNORECASE&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;306&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;307&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt;&lt;span&gt; match&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;308&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; frontmatter_text&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;309&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;310&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;full_match &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; match&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;0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;311&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;prefix &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; match&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;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;312&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;slug_value &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; match&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;2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;313&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;suffix &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; match&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;3&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;314&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;315&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 清理slug值&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;316&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cleaned_slug &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clean_slug_text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;slug_value&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;317&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;318&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 检查清理后的slug质量&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;319&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 如果slug太短（少于3个字符）或者不包含字母，则使用后备方案&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;320&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;321&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt; cleaned_slug&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;322&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;or&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;len&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;cleaned_slug&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;323&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;or&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt;&lt;span&gt; re&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;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;a-z&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; cleaned_slug&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;324&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;325&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 基于文件名生成后备slug&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;326&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; filename&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;327&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;base_name &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; os&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;splitext&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;filename&lt;/span&gt;&lt;span&gt;)[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;328&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cleaned_slug &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clean_slug_text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;base_name&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;329&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;# 如果文件名清理后仍然不理想，使用通用后备&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;330&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;331&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt; cleaned_slug&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;332&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;or&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;len&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;cleaned_slug&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;333&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;or&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt;&lt;span&gt; re&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;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;a-z&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; cleaned_slug&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;334&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;335&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cleaned_slug &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;article-&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; &lt;/span&gt;&lt;span&gt;clean_slug_text&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;base_name&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;336&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;337&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cleaned_slug &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;article-slug&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;338&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;339&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 如果清理后的slug与原始相同，返回原始文本&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;340&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; cleaned_slug &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; slug_value&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;341&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; frontmatter_text&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;342&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;343&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_slug_line &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&apos;slug: &quot;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;cleaned_slug&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;344&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cleaned_frontmatter &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; frontmatter_text&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;full_match&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; new_slug_line&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;345&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;346&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; cleaned_frontmatter&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;347&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;348&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;349&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extract_published_from_frontmatter&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;fm_text&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;350&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;span&gt;从Frontmatter文本中提取published值&lt;/span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;351&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt;&lt;span&gt; fm_text&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;352&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;None&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;353&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 匹配 published: YYYY-MM-DD 格式，支持前后空格和不同大小写&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;354&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;published:\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;^&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;\s&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;)&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;355&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;match &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; re&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;pattern&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; fm_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;IGNORECASE&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;356&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; match&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;357&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; match&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;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;strip&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;358&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;None&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;359&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;360&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;361&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extract_slug_from_frontmatter&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;fm_text&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;362&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;span&gt;从Frontmatter文本中提取slug值&lt;/span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;363&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt;&lt;span&gt; fm_text&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;364&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;None&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;365&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 匹配 slug: value 格式，支持引号&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;366&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;slug:\s&lt;/span&gt;&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;\&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;&quot;&lt;/span&gt;&lt;span&gt;\&apos;\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;[&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\&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;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;367&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;match &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; re&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;pattern&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; fm_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;IGNORECASE&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;368&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; match&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;369&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; match&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;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;strip&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;370&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;None&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;371&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;372&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;373&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;validate_slug&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;slug_value&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;374&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;span&gt;验证slug是否符合格式要求：只包含英文小写字母、数字和连字符&lt;/span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;375&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt;&lt;span&gt; slug_value&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;376&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;False&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;377&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 正则匹配：只允许小写字母、数字和连字符&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;378&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 格式要求：不能为空，不能以连字符开头或结尾，不能有连续连字符&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;379&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&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;a-z0-9&lt;/span&gt;&lt;span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;(?:&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;a-z0-9&lt;/span&gt;&lt;span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;/span&gt;&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;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;380&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bool&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;match&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; slug_value&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;381&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;382&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;383&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;call_classify_ai&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;content&lt;/span&gt;&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;384&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;385&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;调用本地AI API获取文章分类（用于自动分类模式）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;386&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;387&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;参数:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;388&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title: 文章标题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;389&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;content: 文章内容&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;390&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;391&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;返回:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;392&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;分类名称或None（调用失败时）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;393&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;394&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;payload &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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;395&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;model&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;MODEL_NAME&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;396&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;messages&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;[&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;397&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&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;role&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;system&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;content&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;SYSTEM_PROMPT&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;398&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&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;role&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;user&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;content&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;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;标题：&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&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;800&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;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;399&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;400&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;temperature&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;CLASSIFY_TEMPERATURE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;401&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;402&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;try&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;403&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;req &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; urllib&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;404&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;API_URL&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;405&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&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;dumps&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;payload&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;encode&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;utf-8&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;406&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;headers&lt;/span&gt;&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;Content-Type&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;application/json&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;407&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;408&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt;&lt;span&gt; urllib&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;urlopen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;req&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;timeout&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;&lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt;&lt;span&gt; response&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;409&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;res &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;loads&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;read&lt;/span&gt;&lt;span&gt;().&lt;/span&gt;&lt;span&gt;decode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;utf-8&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;410&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ans &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; res&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;choices&lt;/span&gt;&lt;span&gt;&quot;&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;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;message&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;&quot;&lt;/span&gt;&lt;span&gt;content&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;strip&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;411&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;# 确保返回的分类在预定义列表中&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;412&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; c &lt;/span&gt;&lt;span&gt;in&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;413&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; c &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;&lt;span&gt; ans&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;414&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; c&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;415&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;# 如果返回的分类不在列表中，返回None&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;416&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;None&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;417&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;except&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Exception&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt;&lt;span&gt; e&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;418&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;⚠️  分类AI调用失败: &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;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;419&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;None&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;420&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;421&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;422&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get_seo_frontmatter_ai&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;filename&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&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;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;423&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;span&gt;调用 AI 生成符合新规则的 Frontmatter&lt;/span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;424&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;clean_filename &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; filename&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;.md&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;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;425&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;current_date &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get_current_date&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;426&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;427&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 构造强化后的 Prompt&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;428&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;prompt &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;&quot;&quot;请为这篇文章生成 YAML Frontmatter 属性。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;429&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;430&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;【属性生成规则】&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;431&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;1. title:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;432&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 基于&quot;爆款标题公式&quot;生成。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;433&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 要求更吸引人、符合 SEO，30字以内。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;434&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 标题禁止包含 Emoji。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;435&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;2. description:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;436&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 基于&quot;用户关注点（疑问句式+解决方案）&quot;生成。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;437&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 长度在 80-100 字左右，单行文本。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;438&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 必须包含文章核心关键词（即下方的 tags）。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;439&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. tags:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;440&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 请阅读文章内容，并严格按照“三层标签法”生成 3 个准确、简洁且具备高检索权重的标签。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;441&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 第一层：所属赛道/行业（指明文章的宏观归属，如：自媒体运营、职场干货）。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;442&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 第二层：内容深度/方法论（提炼文章的交付属性，如：实战复盘、避坑指南、底层逻辑）。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;443&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 第三层：核心术语/SEO关键词（锁定高频搜索的专有名词，如：SEO优化、私域引流、AI绘画）。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;444&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 分析文章的核心受众和搜索意图，最终提取最符合上述三层定义的标签。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;445&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 每个标签必须确保有且只有一个唯一的标签词。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;446&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 每个标签的长度需控制在 **2-6个汉字** 或 **3个英文单词以内**。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;447&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 标签可以使用纯中文、纯英文或中英混合。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;448&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- **命名规则**：字符串内绝对禁止使用空格。所有特殊字符（包括空格）均用连字符“-”替换。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;449&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- **输出格式**：必须严格按照 YAML 列表格式输出。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;450&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 每个标签单独一行，并以“- ”开头。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;451&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 禁止：逗号分隔列表（如 &quot;标签1, 标签2&quot;）或井号标签（如 #标签 ）格式。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;452&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;4. slug:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;453&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 先读取文章标题，然后严格按要求使用14个以内的小写英文单词，来概括优化后的title（标题），词间用&quot;-&quot;连接，不允许空格。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;454&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- slug值必须只包含英文小写字母(a-z)、数字(0-9)和连字符(-)，绝对禁止使用任何中文字符、特殊字符或其他语言字符。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;455&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 绝对禁止使用中文字符，任何非英文字符都必须被转换为连字符或完全移除。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;456&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- slug必须描述文章核心内容，让读者从slug就能理解文章主题。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;457&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 示例：对于中文标题&quot;电影《垫底辣妹》的励志教育启示&quot;，slug应为：&quot;bottom-girl-movie-inspirational-education-insights&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;458&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 示例：对于标题&quot;0基础注册公众号避坑指南&quot;，slug应为：&quot;wechat-official-account-registration-beginner-guide-avoid-pitfalls&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;459&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;5. image:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;460&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 固定值为&quot;api&quot;。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;461&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;6. published:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;462&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 格式为 YYYY-MM-DD（例如：2025-01-14）。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;463&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;464&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;【格式示例】&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;465&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;title: &quot;独立开发者英文 SEO 站 0-1 变现全流程 SOP&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;466&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;description: &quot;如何通过SEO小站实现被动收入？本文详细拆解独立开发者Leo在9个月内从0赚到4万美金的实战SOP，提供从关键词挖掘到外链建设的全流程方案，助你快速跑通变现闭环。&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;467&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;category: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;category&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;468&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tags:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;469&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 自媒体运营&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;470&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 实战复盘&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;471&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- SEO优化&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;472&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;slug: &quot;leo-seo-site-0-to-40k-in-9-months&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;473&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;注意：这是正确的slug格式示例，必须严格遵守。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;474&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;注意：tags必须严格按照上述YAML列表格式输出，每个标签以&quot;- &quot;开头，禁止使用逗号分隔或井号标签格式。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;475&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;image: &quot;api&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;476&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;published: 2025-01-14&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;477&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;478&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;【当前任务】&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;479&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;文件名: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;clean_filename&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;480&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;所属分类: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;category&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;481&lt;/div&gt;&lt;/div&gt;&lt;div&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;1500&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;482&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;483&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;请严格按照属性生成规则和示例的顺序（title, description, category, tags, slug, image, published）只输出 YAML 键值对，严禁包含 ```yaml 或 ``` 等标记。&quot;&quot;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;484&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;485&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;payload &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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;486&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;model&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;MODEL_NAME&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;487&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;messages&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;[{&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;role&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;user&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;content&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; prompt&lt;/span&gt;&lt;span&gt;}],&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;488&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;temperature&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;TEMPERATURE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;489&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;490&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;491&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&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; json&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;dumps&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;payload&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;encode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;utf-8&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;492&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;req &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; urllib&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;API_URL&lt;/span&gt;&lt;span&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;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;493&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;req&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;add_header&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Content-Type&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;application/json&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;494&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;495&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;try&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;496&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt;&lt;span&gt; urllib&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;urlopen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;req&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;timeout&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;&lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt;&lt;span&gt; response&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;497&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;result &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;loads&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;response&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;read&lt;/span&gt;&lt;span&gt;().&lt;/span&gt;&lt;span&gt;decode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;utf-8&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;498&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;raw_content &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;choices&lt;/span&gt;&lt;span&gt;&quot;&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;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;message&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;&quot;&lt;/span&gt;&lt;span&gt;content&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;strip&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;499&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;# 过滤掉可能出现的 Markdown 包裹符&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;500&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; raw_content&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;replace&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;```yaml&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;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;replace&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;```&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;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;strip&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;501&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;except&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Exception&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt;&lt;span&gt; e&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;502&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;❌ SEO Frontmatter AI请求失败 (&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;filename&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;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;503&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;None&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;504&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;505&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;506&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# ==================== 目录整理相关函数 ====================&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;507&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;508&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;509&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;delete_ignore_files&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dir_path&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;remove_empty_subdirs&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;True&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;510&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;511&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;删除目录中的忽略文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;512&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;513&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;参数:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;514&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;dir_path: 目录路径&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;515&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;remove_empty_subdirs: 是否删除删除忽略文件后变成空的子目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;516&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;517&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;返回:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;518&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;删除的文件数量&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;519&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;520&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt;&lt;span&gt; os&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;isdir&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dir_path&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;521&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;522&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;523&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 检查目录是否在忽略列表中&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;524&lt;/div&gt;&lt;/div&gt;&lt;div&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;should_ignore_directory&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dir_path&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;525&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;526&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;527&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;deleted_count &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;528&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;try&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;529&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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; os&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;listdir&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dir_path&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;530&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; item &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;&lt;span&gt; items&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;531&lt;/div&gt;&lt;/div&gt;&lt;div&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;should_ignore_file&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;item&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;532&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;item_path &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; os&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;join&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dir_path&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; item&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;533&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;try&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;534&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; os&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;isfile&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;item_path&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;535&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;os&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;remove&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;item_path&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;536&lt;/div&gt;&lt;/div&gt;&lt;div&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;DEBUG_MODE&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;537&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;🗑️  删除忽略文件: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;item_path&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;538&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;deleted_count &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;539&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;elif&lt;/span&gt;&lt;span&gt;&lt;span&gt; os&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;isdir&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;item_path&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;540&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;# 如果是目录，递归处理忽略文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;541&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;deleted_count &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;delete_ignore_files&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;542&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;item_path&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; remove_empty_subdirs&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;543&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;544&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;# 删除空目录（如果删除忽略文件后目录变空）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;545&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; remove_empty_subdirs &lt;/span&gt;&lt;span&gt;and&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;is_directory_empty&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;item_path&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;546&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;try&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;547&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;os&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;rmdir&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;item_path&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;548&lt;/div&gt;&lt;/div&gt;&lt;div&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;DEBUG_MODE&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;549&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;🗑️  删除空子目录: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;item_path&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;550&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;except&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Exception&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt;&lt;span&gt; e&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;551&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;⚠️  无法删除空子目录 &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;item_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;e&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;552&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;except&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Exception&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt;&lt;span&gt; e&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;553&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;⚠️  无法删除 &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;item_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;e&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;554&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;except&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Exception&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt;&lt;span&gt; e&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;555&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;⚠️  无法访问目录 &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;dir_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;e&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;556&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;557&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; deleted_count&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;558&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;559&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;560&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;is_directory_empty&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dir_path&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;561&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;562&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;检查目录是否为空（包括只包含忽略文件的目录）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;563&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;564&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;参数:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;565&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;dir_path: 目录路径&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;566&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;567&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;返回:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;568&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;True如果目录为空或只包含忽略的文件/空子目录，否则False&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;569&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;570&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt;&lt;span&gt; os&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;isdir&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dir_path&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;571&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;False&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;572&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;573&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;try&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;574&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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; os&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;listdir&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dir_path&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;575&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 调试日志&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;576&lt;/div&gt;&lt;/div&gt;&lt;div&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;DEBUG_MODE&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;577&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;🔍 检查目录: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;dir_path&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;578&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;   目录内容: &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;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;579&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;580&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 过滤忽略的文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;581&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;filtered_items &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;item &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; item &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; items &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;should_ignore_file&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;item&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;582&lt;/div&gt;&lt;/div&gt;&lt;div&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;DEBUG_MODE&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;583&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;   过滤后内容: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;filtered_items&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;584&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;585&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 递归检查每个项目&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;586&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; item &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;&lt;span&gt; items&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;587&lt;/div&gt;&lt;/div&gt;&lt;div&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;should_ignore_file&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;item&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;588&lt;/div&gt;&lt;/div&gt;&lt;div&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;DEBUG_MODE&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;589&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;   忽略文件: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;item&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;590&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;continue&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;591&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;592&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;item_path &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; os&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;join&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dir_path&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; item&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;593&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; os&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;isdir&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;item_path&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;594&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;# 递归检查子目录是否为空&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;595&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;is_directory_empty&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;item_path&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;596&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;False&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;597&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;598&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;# 发现非忽略文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;599&lt;/div&gt;&lt;/div&gt;&lt;div&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;DEBUG_MODE&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;600&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;   发现非忽略文件: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;item&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;601&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;False&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;602&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;True&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;603&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;except&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;OSError&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;604&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;False&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;605&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;606&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;607&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;remove_empty_dirs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;root_path&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;608&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;609&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;深度优先递归清理空目录（包括只包含忽略文件的目录）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;610&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;611&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;参数:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;612&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;root_path: 起始目录路径&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;613&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;614&lt;/div&gt;&lt;/div&gt;&lt;div&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;DEBUG_MODE&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;615&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;&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;root_path&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;616&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;617&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 首先删除所有忽略文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;618&lt;/div&gt;&lt;/div&gt;&lt;div&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;DEBUG_MODE&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;619&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;🔍 搜索并删除忽略文件...&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;620&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;total_ignored_files &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;delete_ignore_files&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;root_path&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;True&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;621&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; total_ignored_files &lt;/span&gt;&lt;span&gt;&amp;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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;622&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;🗑️  删除了 &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;total_ignored_files&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; 个系统文件&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;623&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;624&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cleaned_dirs &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;625&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;errors &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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;626&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;627&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 使用后序遍历（深度优先）确保先处理子目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;628&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt;&lt;span&gt; dirpath&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; dirnames&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; filenames &lt;/span&gt;&lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;&lt;span&gt; os&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;walk&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;root_path&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;topdown&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;False&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;629&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 检查目录是否在忽略列表中&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;630&lt;/div&gt;&lt;/div&gt;&lt;div&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;should_ignore_directory&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dirpath&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;631&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;continue&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;632&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;633&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 再次删除该目录中的忽略文件（处理可能新发现的）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;634&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;deleted &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;delete_ignore_files&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dirpath&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;False&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;635&lt;/div&gt;&lt;/div&gt;&lt;div&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;DEBUG_MODE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;and&lt;/span&gt;&lt;span&gt;&lt;span&gt; deleted &lt;/span&gt;&lt;span&gt;&amp;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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;636&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;   在 &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;dirpath&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; 中删除了 &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;deleted&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; 个忽略文件&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;637&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;638&lt;/div&gt;&lt;/div&gt;&lt;div&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;DEBUG_MODE&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;639&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;# 调试日志&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;640&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;&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;dirpath&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;641&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;   子目录: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;dirnames&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;642&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;   文件: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;filenames&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;643&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;644&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 检查当前目录是否为空（考虑忽略的文件）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;645&lt;/div&gt;&lt;/div&gt;&lt;div&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;is_directory_empty&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dirpath&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;646&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;# 确保不是源目录本身&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;647&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; os&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;abspath&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dirpath&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;!=&lt;/span&gt;&lt;span&gt; os&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;abspath&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;root_path&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;648&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;# 重试机制：最多尝试3次&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;649&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;max_retries &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;650&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; attempt &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;range&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;max_retries&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;651&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;try&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;652&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;os&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;rmdir&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dirpath&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;653&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;🗑️  清理空目录: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;dirpath&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;654&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cleaned_dirs &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;655&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;break&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 成功则跳出重试循环&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;656&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;except&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;OSError&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt;&lt;span&gt; e&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;657&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; attempt &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; max_retries &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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;658&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;# 不是最后一次尝试，等待后重试&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;659&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; time&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;660&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;661&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;wait_time &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0.5&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;attempt &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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;662&lt;/div&gt;&lt;/div&gt;&lt;div&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;DEBUG_MODE&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;663&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;664&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;   重试 &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt;attempt &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;max_retries&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; - 等待 &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;wait_time&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;秒...&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;665&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;666&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;time&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;wait_time&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;667&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;# 再次检查目录是否仍然为空&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;668&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;is_directory_empty&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dirpath&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;669&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;# 目录不再为空，可能是新文件出现&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;670&lt;/div&gt;&lt;/div&gt;&lt;div&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;DEBUG_MODE&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;671&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;   目录 &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;dirpath&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; 在重试期间不再为空，跳过&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;672&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;break&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;673&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;674&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;# 最后一次尝试失败&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;675&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;error_msg &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;⚠️  无法删除目录 &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;dirpath&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;max_retries&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; 次)&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;676&lt;/div&gt;&lt;/div&gt;&lt;div&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;DEBUG_MODE&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;677&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;error_msg&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;678&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;errors&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;error_msg&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;679&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;elif&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DEBUG_MODE&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;680&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;   目录非空，跳过删除&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;681&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;682&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 二次清理：再次扫描整个目录树，确保没有遗漏&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;683&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; cleaned_dirs &lt;/span&gt;&lt;span&gt;&amp;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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;684&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&lt;span&gt;🔍 二次检查目录树...&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;685&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;additional_cleaned &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;686&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt;&lt;span&gt; dirpath&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; dirnames&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; filenames &lt;/span&gt;&lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;&lt;span&gt; os&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;walk&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;root_path&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;topdown&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;False&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;687&lt;/div&gt;&lt;/div&gt;&lt;div&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;should_ignore_directory&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dirpath&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;688&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;continue&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;689&lt;/div&gt;&lt;/div&gt;&lt;div&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;is_directory_empty&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dirpath&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;690&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; os&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;abspath&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dirpath&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;!=&lt;/span&gt;&lt;span&gt; os&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;abspath&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;root_path&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;691&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;try&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;692&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;os&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;rmdir&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dirpath&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;693&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;🗑️  二次清理空目录: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;dirpath&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;694&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;additional_cleaned &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;695&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cleaned_dirs &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;696&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;except&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;OSError&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt;&lt;span&gt; e&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;697&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;# 二次清理中的错误可以更宽容&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;698&lt;/div&gt;&lt;/div&gt;&lt;div&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;DEBUG_MODE&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;699&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;   二次清理跳过: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;dirpath&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;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;700&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; additional_cleaned &lt;/span&gt;&lt;span&gt;&amp;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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;701&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;   📁  二次清理额外清除了 &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;additional_cleaned&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; 个目录&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;702&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;703&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 显示清理摘要&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;704&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;summary &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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;705&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; total_ignored_files &lt;/span&gt;&lt;span&gt;&amp;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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;706&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;summary&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;🗑️  删除系统文件: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;total_ignored_files&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; 个&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;707&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; cleaned_dirs &lt;/span&gt;&lt;span&gt;&amp;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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;708&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;summary&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;📁  清理空目录: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;cleaned_dirs&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; 个&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;709&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; errors&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;710&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;summary&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;⚠️  遇到 &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;len&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;errors&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;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;711&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;712&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; summary&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;713&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&lt;span&gt;🧹 清理摘要:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;714&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; line &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;&lt;span&gt; summary&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;715&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;   &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;line&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;716&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;717&lt;/div&gt;&lt;/div&gt;&lt;div&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;DEBUG_MODE&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;718&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;✅ 空目录清理完成&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;719&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;720&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;721&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;organize_posts_by_ai&lt;/span&gt;&lt;span&gt;():&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;722&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;723&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;自动分类整理模式：使用AI对文章进行分类，并移动到对应分类目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;724&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;同时更新Frontmatter中的category字段&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;725&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;726&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt;&lt;span&gt; os&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;exists&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;SOURCE_DIR&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;727&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;❌ 目录不存在: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;SOURCE_DIR&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;728&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;729&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;730&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 1. 预存文件列表，避免移动导致遍历混乱&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;731&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;all_files &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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;732&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&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;,&lt;/span&gt;&lt;span&gt; files &lt;/span&gt;&lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;&lt;span&gt; os&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;walk&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;SOURCE_DIR&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;733&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 检查目录是否在忽略列表中&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;734&lt;/div&gt;&lt;/div&gt;&lt;div&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;should_ignore_directory&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;735&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;⏭️  跳过忽略目录: &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;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;736&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;continue&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;737&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;738&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;&lt;span&gt; files&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;739&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;# 修复：不区分大小写匹配 .md 扩展名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;740&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lower&lt;/span&gt;&lt;span&gt;().&lt;/span&gt;&lt;span&gt;endswith&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;.md&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;741&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;all_files&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;os&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;join&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;file&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;742&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;743&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;🚀 开始自动分类处理 &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;len&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;all_files&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;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;744&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;745&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;processed_count &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;746&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;skipped_count &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;747&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;error_count &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;748&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;749&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; old_path &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;&lt;span&gt; all_files&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;750&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;try&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;751&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;open&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;old_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;&quot;&lt;/span&gt;&lt;span&gt;r&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;&lt;span&gt;encoding&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;utf-8&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;&lt;span&gt;as&lt;/span&gt;&lt;span&gt;&lt;span&gt; f&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;752&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;raw_text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; f&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;read&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;753&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;754&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;# 提取标题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;755&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title_match &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; re&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;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;^title:\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; raw_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MULTILINE&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;756&lt;/div&gt;&lt;/div&gt;&lt;div&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;757&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title_match&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;1&lt;/span&gt;&lt;span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;strip&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;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;\&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;758&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; title_match&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;759&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt;&lt;span&gt; os&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;basename&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;old_path&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;760&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;761&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;762&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;# 获取分类&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;763&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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; &lt;/span&gt;&lt;span&gt;call_classify_ai&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; raw_text&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;764&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt;&lt;span&gt; category&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;765&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;⏭️  跳过（无法分类）: &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;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;766&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;skipped_count &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;767&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;continue&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;768&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;769&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fm_match &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;match&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;^---\s&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;\n&lt;/span&gt;&lt;span&gt;---\s&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;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; raw_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DOTALL&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;770&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;771&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; fm_match&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;772&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fm_text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; fm_match&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;0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;773&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;body_text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; raw_text&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;fm_match&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;end&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;774&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;775&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; re&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;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;^category:&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; fm_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MULTILINE&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;776&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;777&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;^category:.&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;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;778&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;category: &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;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;779&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fm_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;780&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;flags&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MULTILINE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;781&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;782&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;783&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;784&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;first_field_match &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; re&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;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;^\w&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;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; fm_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MULTILINE&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;785&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; first_field_match&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;786&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;insert_pos &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; first_field_match&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;end&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;787&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;line_end &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; fm_text&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;find&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; insert_pos&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;788&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; line_end &lt;/span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;789&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text &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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;790&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fm_text&lt;/span&gt;&lt;span&gt;[:&lt;/span&gt;&lt;span&gt;line_end&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;791&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;category: &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;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;792&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; fm_text&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;line_end&lt;/span&gt;&lt;span&gt;:]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;793&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;794&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;795&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text &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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;796&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fm_text&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;rstrip&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&lt;span&gt;-&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;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;category: &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;\n&lt;/span&gt;&lt;span&gt;---&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;797&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;798&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;799&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text &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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;800&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fm_text&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;rstrip&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;-&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;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;category: &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;\n&lt;/span&gt;&lt;span&gt;---&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;801&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;802&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;803&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; new_fm_text &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; body_text&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;804&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;805&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;---&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;category: &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;\n&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;raw_text&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;806&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;807&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;open&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;old_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;&quot;&lt;/span&gt;&lt;span&gt;w&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;&lt;span&gt;encoding&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;utf-8&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;&lt;span&gt;as&lt;/span&gt;&lt;span&gt;&lt;span&gt; f&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;808&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;write&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;new_text&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;809&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;810&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;# 准备目标目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;811&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;target_dir &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; os&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;join&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;SOURCE_DIR&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; category&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;812&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt;&lt;span&gt; os&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;exists&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;target_dir&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;813&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;os&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;makedirs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;target_dir&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;814&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;815&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;# 移动文件到分类目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;816&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_path &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; os&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;join&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;target_dir&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; os&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;basename&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;old_path&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;817&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; os&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;abspath&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;old_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; os&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;abspath&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;new_path&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;818&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;shutil&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;move&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;old_path&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; new_path&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;819&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;✅ 分类移动: &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; -&amp;gt; &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;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;820&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;processed_count &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;821&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;822&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;ℹ️ 文件已在目标目录: &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;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;823&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;processed_count &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;824&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;825&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;except&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Exception&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt;&lt;span&gt; e&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;826&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;❌ 出错: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;old_path&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;e&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;827&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;error_count &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;828&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;829&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 打印处理统计&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;830&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;📊 自动分类处理统计:&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;831&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;   ✅ 成功处理: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;processed_count&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;832&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;   ⏭️ 跳过: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;skipped_count&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;833&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;   ❌ 失败: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;error_count&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;834&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;835&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; processed_count &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; skipped_count &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; error_count &lt;/span&gt;&lt;span&gt;&amp;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;# 返回是否有文件被处理&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;836&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;837&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;838&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# ==================== 主处理函数 ====================&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;839&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;840&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;841&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;process_files&lt;/span&gt;&lt;span&gt;():&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;842&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;span&gt;主处理函数：根据配置模式处理所有文件&lt;/span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;843&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt;&lt;span&gt; os&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;exists&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;SOURCE_DIR&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;844&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;❌ 路径不存在: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;SOURCE_DIR&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;845&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;846&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;847&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 显示配置信息&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;848&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;=&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;60&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;849&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;📝 增强版 Obsidian SEO Frontmatter 生成器 - 配置信息&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;850&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;=&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;60&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;851&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;📁 源目录: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;SOURCE_DIR&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;852&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;📂 目录整理模式: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;ORGANIZE_MODE&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;853&lt;/div&gt;&lt;/div&gt;&lt;div&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;ORGANIZE_MODE&lt;/span&gt;&lt;span&gt; &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;auto&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;854&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;📊 分类数量: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;len&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;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;855&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;📅 日期模式: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;DATE_MODE&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;856&lt;/div&gt;&lt;/div&gt;&lt;div&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;DATE_MODE&lt;/span&gt;&lt;span&gt; &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;fixed&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;857&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;📅 固定日期: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;FIXED_DATE&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;858&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;elif&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DATE_MODE&lt;/span&gt;&lt;span&gt; &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;random_year&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;859&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;📅 模式: 近一年内的随机日期&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;860&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;elif&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DATE_MODE&lt;/span&gt;&lt;span&gt; &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;current&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;861&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;📅 模式: 当前日期&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;862&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;🔄 更新模式: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;UPDATE_MODE&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;863&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;🌡️ 温度配置: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;TEMPERATURE&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;864&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;🤖 模型名称: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;MODEL_NAME&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;865&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;=&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;60&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;866&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;867&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;868&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 步骤1: 如果启用自动分类模式，先进行文章分类和移动&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;869&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;files_organized &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;False&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;870&lt;/div&gt;&lt;/div&gt;&lt;div&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;ORGANIZE_MODE&lt;/span&gt;&lt;span&gt; &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;auto&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;871&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;📂 开始自动分类整理...&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;872&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;files_organized &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;organize_posts_by_ai&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;873&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;✅ 自动分类整理完成&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;874&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;875&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;876&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 步骤2: 处理所有文件的SEO Frontmatter&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;877&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;🚀 开始生成/更新SEO Frontmatter...&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;878&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;879&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 正则：匹配文件开头的 YAML Frontmatter 块&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;880&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fm_pattern &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;compile&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;^---\s&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;\n&lt;/span&gt;&lt;span&gt;---\s&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;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DOTALL&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;881&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;882&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;883&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt;&lt;span&gt; root&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; dirs&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; files &lt;/span&gt;&lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;&lt;span&gt; os&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;walk&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;SOURCE_DIR&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;884&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 检查目录是否在忽略列表中&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;885&lt;/div&gt;&lt;/div&gt;&lt;div&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;should_ignore_directory&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;886&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;⏭️  跳过忽略目录: &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;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;887&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;continue&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;888&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;889&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;&lt;span&gt; files&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;890&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lower&lt;/span&gt;&lt;span&gt;().&lt;/span&gt;&lt;span&gt;endswith&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;.md&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;891&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;file_path &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; os&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;join&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;file&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;892&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;893&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;# 1. 确定分类：根据整理模式选择&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;894&lt;/div&gt;&lt;/div&gt;&lt;div&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;ORGANIZE_MODE&lt;/span&gt;&lt;span&gt; &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;auto&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;895&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;# 自动模式：使用文件所在目录名（可能已经被移动）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;896&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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; os&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;basename&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;root&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;897&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;898&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;# 默认模式：使用文件所在目录名作为分类&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;899&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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; os&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;basename&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;root&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;900&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;901&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;open&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;file_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;&quot;&lt;/span&gt;&lt;span&gt;r&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;&lt;span&gt;encoding&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;utf-8&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;&lt;span&gt;as&lt;/span&gt;&lt;span&gt;&lt;span&gt; f&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;902&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;full_text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; f&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;read&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;903&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;904&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;# 2. 提取现有Frontmatter、published和slug（如果存在）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;905&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;existing_published &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;None&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;906&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;existing_slug &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;None&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;907&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;match_fm &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; fm_pattern&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;match&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;full_text&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;908&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; match_fm&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;909&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fm_text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; match_fm&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;0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;910&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;published_val &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extract_published_from_frontmatter&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;fm_text&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;911&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; published_val &lt;/span&gt;&lt;span&gt;and&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;validate_published&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;published_val&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;912&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;existing_published &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; published_val&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;913&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;# 提取并验证现有slug&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;914&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;slug_val &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extract_slug_from_frontmatter&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;fm_text&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;915&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; slug_val &lt;/span&gt;&lt;span&gt;and&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;validate_slug&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;slug_val&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;916&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;existing_slug &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; slug_val&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;917&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;918&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;# 3. 根据更新模式处理&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;919&lt;/div&gt;&lt;/div&gt;&lt;div&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;UPDATE_MODE&lt;/span&gt;&lt;span&gt; &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;global&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;920&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;# 全局模式：完全重写所有Frontmatter&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;921&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;# - 保留策略：published（如符合格式）和slug（如符合格式要求：只包含英文小写字母、数字和连字符）字段会保留原值&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;922&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;# - 强制更新：updated字段必定更新为当前日期，不管该字段是否已存在&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;923&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;body_content &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; fm_pattern&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sub&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; full_text&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;strip&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;924&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;🚀 全局模式处理: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; (分类: &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;)&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;925&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get_seo_frontmatter_ai&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&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; body_content&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;926&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; new_fm_text&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;927&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;# 如果存在有效的published，替换新生成的published&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;928&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; existing_published&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;929&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;# 将新Frontmatter中的published替换为existing_published&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;930&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;# 使用正则替换 published: 后面的值&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;931&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;932&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;(&lt;/span&gt;&lt;span&gt;published:\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;)&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;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;933&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\\&lt;/span&gt;&lt;span&gt;g&amp;lt;1&amp;gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;existing_published&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;934&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;935&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;flags&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;IGNORECASE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;936&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;937&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;📅 保留原published: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;existing_published&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;938&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;939&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;# 如果存在有效的slug，替换新生成的slug&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;940&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; existing_slug&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;941&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;942&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;(&lt;/span&gt;&lt;span&gt;slug:\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;)&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;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;943&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;\\&lt;/span&gt;&lt;span&gt;g&amp;lt;1&amp;gt;&quot;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;existing_slug&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;944&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;945&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;flags&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;IGNORECASE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;946&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;947&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&apos;🔗 保留原slug: &quot;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;existing_slug&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;948&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;949&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;# 没有有效的slug，清理slug值，确保没有中文字符&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;950&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extract_and_clean_slug&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;new_fm_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;951&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;952&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;# 强制添加或更新updated属性为当前日期&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;953&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;current_date &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get_current_date&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;954&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; re&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;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;updated:\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;\S&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; new_fm_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;IGNORECASE&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;955&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;956&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;(&lt;/span&gt;&lt;span&gt;updated:\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;)&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;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;957&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\\&lt;/span&gt;&lt;span&gt;g&amp;lt;1&amp;gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;current_date&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;958&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;959&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;flags&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;IGNORECASE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;960&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;961&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;962&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;# 在published后添加updated&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;963&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;964&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;(&lt;/span&gt;&lt;span&gt;published:\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;\S&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;)&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;965&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\\&lt;/span&gt;&lt;span&gt;g&amp;lt;1&amp;gt;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;updated: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;current_date&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;966&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;967&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;flags&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;IGNORECASE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;968&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;969&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;📅 更新updated: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;current_date&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;970&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;971&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;final_content &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;---&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;new_fm_text&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;\n\n&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;body_content&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;972&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;open&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;file_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;&quot;&lt;/span&gt;&lt;span&gt;w&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;&lt;span&gt;encoding&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;utf-8&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;&lt;span&gt;as&lt;/span&gt;&lt;span&gt;&lt;span&gt; f&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;973&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;write&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;final_content&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;974&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;✅ 属性已更新: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;975&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;976&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;elif&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UPDATE_MODE&lt;/span&gt;&lt;span&gt; &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;incremental&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;977&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;# 增量补全模式：只补充缺失的Frontmatter字段&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;978&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;# - 保留策略：published（如符合格式）和slug（如符合格式要求：只包含英文小写字母、数字和连字符）字段会保留原值&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;979&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;# - 强制更新：updated字段必定更新为当前日期，即使Frontmatter已完整&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;980&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; match_fm&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;981&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;# 有 Frontmatter，检查是否包含必需字段&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;982&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fm_text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; match_fm&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;0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;983&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;# 简单检查是否存在关键字段（这里简化，实际应解析YAML）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;984&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;required_keys &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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;985&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;986&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;987&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;tags&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;988&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;slug&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;989&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;990&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;991&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;992&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;missing_keys &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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;993&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; key &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;&lt;span&gt; required_keys&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;994&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;if&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;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;&lt;span&gt; fm_text&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;995&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;missing_keys&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;996&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;997&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; missing_keys&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;998&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;999&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;🔍 增量模式处理: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; (分类: &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;) - 缺失字段: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;missing_keys&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1000&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1001&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;body_content &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; fm_pattern&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sub&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; full_text&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;strip&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1002&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get_seo_frontmatter_ai&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1003&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&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; body_content&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1004&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1005&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; new_fm_text&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1006&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;# 如果存在有效的published，替换新生成的published&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1007&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; existing_published&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1008&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span&gt;# 替换published&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1009&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1010&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                        &lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;(&lt;/span&gt;&lt;span&gt;published:\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;)&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;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1011&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                        &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\\&lt;/span&gt;&lt;span&gt;g&amp;lt;1&amp;gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;existing_published&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1012&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1013&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                        &lt;/span&gt;&lt;span&gt;flags&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;IGNORECASE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1014&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1015&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;📅 保留原published: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;existing_published&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1016&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1017&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;# 如果存在有效的slug，替换新生成的slug&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1018&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; existing_slug&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1019&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1020&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                        &lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;(&lt;/span&gt;&lt;span&gt;slug:\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;)&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;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1021&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                        &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;\\&lt;/span&gt;&lt;span&gt;g&amp;lt;1&amp;gt;&quot;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;existing_slug&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1022&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1023&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                        &lt;/span&gt;&lt;span&gt;flags&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;IGNORECASE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1024&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1025&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&apos;🔗 保留原slug: &quot;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;existing_slug&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1026&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1027&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span&gt;# 没有有效的slug，清理slug值，确保没有中文字符&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1028&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extract_and_clean_slug&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1029&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1030&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1031&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1032&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;# 强制添加或更新updated属性为当前日期&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1033&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;current_date &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get_current_date&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1034&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; re&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;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1035&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;updated:\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;\S&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; new_fm_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;IGNORECASE&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1036&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1037&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1038&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                        &lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;(&lt;/span&gt;&lt;span&gt;updated:\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;)&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;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1039&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                        &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\\&lt;/span&gt;&lt;span&gt;g&amp;lt;1&amp;gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;current_date&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1040&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1041&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                        &lt;/span&gt;&lt;span&gt;flags&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;IGNORECASE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1042&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1043&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1044&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span&gt;# 在published后添加updated&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1045&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1046&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                        &lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;(&lt;/span&gt;&lt;span&gt;published:\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;\S&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;)&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1047&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                        &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\\&lt;/span&gt;&lt;span&gt;g&amp;lt;1&amp;gt;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;updated: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;current_date&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1048&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1049&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                        &lt;/span&gt;&lt;span&gt;flags&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;IGNORECASE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1050&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1051&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;📅 更新updated: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;current_date&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1052&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1053&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;final_content &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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1054&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;---&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;new_fm_text&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;\n\n&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;body_content&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1055&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1056&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;open&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;file_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;&quot;&lt;/span&gt;&lt;span&gt;w&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;&lt;span&gt;encoding&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;utf-8&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;&lt;span&gt;as&lt;/span&gt;&lt;span&gt;&lt;span&gt; f&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1057&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;write&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;final_content&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1058&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;✅ 属性已补全: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1059&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1060&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1061&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;# Frontmatter 已完整，但仍然需要强制更新updated&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1062&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1063&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;🔍 增量模式处理: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; (分类: &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;) - Frontmatter 已完整，强制更新updated&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1064&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1065&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;current_date &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get_current_date&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1066&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1067&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;# 检查是否存在updated属性&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1068&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; re&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;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;updated:\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;\S&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; fm_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;IGNORECASE&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1069&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;# 替换existing updated&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1070&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;updated_fm_text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1071&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;(&lt;/span&gt;&lt;span&gt;updated:\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;)&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;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1072&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\\&lt;/span&gt;&lt;span&gt;g&amp;lt;1&amp;gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;current_date&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1073&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fm_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1074&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span&gt;flags&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;IGNORECASE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1075&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1076&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;final_content &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; updated_fm_text &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; fm_pattern&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1077&lt;/div&gt;&lt;/div&gt;&lt;div&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; full_text&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1078&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1079&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1080&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;# 在published后添加updated&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1081&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;updated_fm_text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1082&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;(&lt;/span&gt;&lt;span&gt;published:\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;\S&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;)&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1083&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\\&lt;/span&gt;&lt;span&gt;g&amp;lt;1&amp;gt;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;updated: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;current_date&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1084&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fm_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1085&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span&gt;flags&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;IGNORECASE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1086&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1087&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;final_content &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; updated_fm_text &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; fm_pattern&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1088&lt;/div&gt;&lt;/div&gt;&lt;div&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; full_text&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1089&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1090&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1091&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;open&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;file_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;&quot;&lt;/span&gt;&lt;span&gt;w&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;&lt;span&gt;encoding&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;utf-8&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;&lt;span&gt;as&lt;/span&gt;&lt;span&gt;&lt;span&gt; f&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1092&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;write&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;final_content&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1093&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;📅 更新updated: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;current_date&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1094&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;✅ 属性已更新: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1095&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1096&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1097&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;# 没有 Frontmatter，生成完整属性&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1098&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1099&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;🔍 增量模式处理: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; (分类: &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;) - 无Frontmatter，生成完整属性&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1100&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1101&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get_seo_frontmatter_ai&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1102&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&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; full_text&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;strip&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1103&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1104&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; new_fm_text&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1105&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;# 无Frontmatter时直接清理slug，不检查existing_slug&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1106&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extract_and_clean_slug&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;new_fm_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1107&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;✨ 生成新slug（基于AI）&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1108&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1109&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;# 强制添加或更新updated属性为当前日期&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1110&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;current_date &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;get_current_date&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1111&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; re&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;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;updated:\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;\S&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; new_fm_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;IGNORECASE&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1112&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1113&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;(&lt;/span&gt;&lt;span&gt;updated:\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;)&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;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1114&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\\&lt;/span&gt;&lt;span&gt;g&amp;lt;1&amp;gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;current_date&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1115&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1116&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span&gt;flags&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;IGNORECASE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1117&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1118&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1119&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;# 在published后添加updated&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1120&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1121&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;(&lt;/span&gt;&lt;span&gt;published:\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;\S&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;)&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1122&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\\&lt;/span&gt;&lt;span&gt;g&amp;lt;1&amp;gt;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;updated: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;current_date&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1123&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new_fm_text&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1124&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;span&gt;flags&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;re&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;IGNORECASE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1125&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1126&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;📅 更新updated: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;current_date&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1127&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1128&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;final_content &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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1129&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;---&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;new_fm_text&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;\n\n&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt;full_text&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;strip&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1130&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1131&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;open&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;file_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;&quot;&lt;/span&gt;&lt;span&gt;w&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;&lt;span&gt;encoding&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;utf-8&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;&lt;span&gt;as&lt;/span&gt;&lt;span&gt;&lt;span&gt; f&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1132&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;write&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;final_content&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1133&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;✅ 属性已生成: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1134&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1135&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1136&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;❌ 未知更新模式: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;UPDATE_MODE&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1137&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1138&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1139&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;✨ SEO Frontmatter 处理完成！共覆盖更新 &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; 个文件。&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1140&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1141&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 步骤3: 清理空目录（如果进行了文件移动或希望保持整洁）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1142&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; files_organized &lt;/span&gt;&lt;span&gt;or&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DEBUG_MODE&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1143&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&lt;span&gt;🧹 开始清理空目录...&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1144&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;remove_empty_dirs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;SOURCE_DIR&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1145&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;✅ 目录清理完成&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1146&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1147&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&lt;span&gt;ℹ️  未进行文件移动，跳过空目录清理&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1148&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1149&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1150&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# ==================== 主程序入口 ====================&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1151&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;if&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;&quot;&lt;/span&gt;&lt;span&gt;__main__&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1152&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;process_files&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;section&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;AI分类+SEO&lt;/th&gt;&lt;th&gt;侧重AI分类&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;ORGANIZE_MODE&lt;/strong&gt; 配置&lt;/td&gt;&lt;td&gt;&lt;code&gt;&quot;auto&quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&quot;auto&quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&quot;default&quot;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;UPDATE_MODE&lt;/strong&gt; 配置&lt;/td&gt;&lt;td&gt;&lt;code&gt;&quot;global&quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&quot;incremental&quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&quot;incremental&quot;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;CATEGORIES&lt;/strong&gt; 列表配置&lt;/td&gt;&lt;td&gt;需完整配置&lt;/td&gt;&lt;td&gt;需完整配置&lt;/td&gt;&lt;td&gt;无需配置&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;🎯 场景说明&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AI分类+SEO&lt;/strong&gt;：智能分类 + SEO优化，适合新博客建立&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;侧重AI分类&lt;/strong&gt;：优先确保分类准确，适合内容整理需求&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保留当前分类&lt;/strong&gt;：保持现有目录结构，适合日常维护&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;🧠 &lt;strong&gt;关于预定义的分类列表的思路分享：&lt;/strong&gt;
将你尽可能多的文章名称以列表形式提交给 DeepSeek 让 AI 大模型帮你设计一个分类目录框架结构，此时可将分类目录填入到配置项中，使用脚本调用模型自动对文章进行分类匹配，这是一个有比较高目标导向的方案和思路，供大家参考。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;🚀 使用指南&lt;a href=&quot;#-使用指南&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;strong&gt;测试运行&lt;/strong&gt;：建议先在小型测试目录中运行，验证效果
⚠️ &lt;strong&gt;AI 服务稳定性&lt;/strong&gt;：确保本地 AI 服务稳定运行，避免处理中断&lt;/p&gt;&lt;/section&gt;&lt;section&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;确保 Python 3.7+ 已安装&lt;/li&gt;
&lt;li&gt;启动本地 AI 服务（如 Ollama/LMStudio 等兼容OpenAI API的服务）&lt;/li&gt;
&lt;li&gt;确认 AI 服务地址与脚本配置一致&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&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;obsdian-seo-plus-enhanced.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;根据你的需求参考配置说明修改配置项&lt;/li&gt;
&lt;li&gt;特别关注：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SOURCE_DIR&lt;/code&gt;：设置正确的笔记目录路径&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CATEGORIES&lt;/code&gt;：调整分类列表匹配你的内容领域&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ORGANIZE_MODE&lt;/code&gt;：选择合适的整理模式&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UPDATE_MODE&lt;/code&gt;：选择适合的更新策略&lt;/li&gt;
&lt;li&gt;&lt;code&gt;API_URL&lt;/code&gt;：正确填写本地AI服务地址，支持Ollama、LM Studio等兼容OpenAI API的服务&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MODEL_NAME&lt;/code&gt;：正确填写模型名称&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 直接运行&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;python3&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;obsdian-seo-plus-enhanced.py&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 或添加执行权限后运行&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod&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;obsdian-seo-plus-enhanced.py&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;./obsdian-seo-plus-enhanced.py&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;============================================================&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;📝 增强版 Obsidian SEO Frontmatter 生成器 - 配置信息&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;============================================================&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;📁 源目录: ./WEBNOTE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;📂 目录整理模式: auto&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;📊 分类数量: 11&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;📅 日期模式: current&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;📅 模式: 当前日期&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;🔄 更新模式: global&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;🌡️ 温度配置: 0.3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;🤖 模型名称: qwen3-vl-30b-a3b-instruct-mlx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;============================================================&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;📂 开始自动分类整理...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;🚀 开始自动分类处理 1 个文件...&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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 文件中的 Frontmatter 示例：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&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;&quot;&lt;/span&gt;&lt;span&gt;Markdown SEO Frontmatter 批量生成器&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&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;&quot;&lt;/span&gt;&lt;span&gt;如何高效将Obsidian笔记转换为Astro博客？本文提供自动化工具，支持AI智能分类与SEO属性生成，一键批量处理Markdown文件并适配Firefly主题，解决内容迁移痛点。&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;category&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Astro教程&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tags&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SEO优化&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;slug&lt;/span&gt;&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;markdown-seo-frontmatter-batch-generator&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;image&lt;/span&gt;&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;api&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;published&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;2026-01-13&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;updated&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;2026-01-15&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;检查文件是否按分类移动到正确目录&lt;/li&gt;
&lt;li&gt;验证 Frontmatter 是否完整生成&lt;/li&gt;
&lt;li&gt;查看生成的 SEO 属性是否符合预期&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;🔍 常见问题&lt;a href=&quot;#-常见问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;p&gt;&lt;strong&gt;🏷️ 如何提高文章分类的准确性？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;工具默认使用极低的AI温度参数（0.01），以保障分类结果稳定。若效果不佳，建议尝试优化 &lt;code&gt;SYSTEM_PROMPT&lt;/code&gt; 中的指令，并确保分类列表能覆盖所有文章类型，避免产生过多的“未分类”结果。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;🛠️ 如何优化生成的文章元数据（Frontmatter）？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;工具采用三层标签法生成标签，有助于提升SEO效果。同时，在增量更新文章时，工具会智能保留已有的有效发布日期。&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;工具支持数百个文件的批量处理。为提高效率，AI接口调用的超时时间设置为300秒，并且单个文件的处理失败不会影响其他文件的正常处理。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&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;p&gt;&lt;strong&gt;📝 工具支持什么样的文件格式？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;支持处理标准语法的Markdown文件，并会生成YAML格式的Frontmatter，确保与Astro等静态站点生成器完美兼容。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;🔤 生成的文件路径（Slug）和编码格式有要求吗？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;工具会自动清理Slug中的中文字符，确保其符合Astro的路径规范。所有文件均使用UTF-8编码，以保证中文及其他语言字符的正常显示。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&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;p&gt;&lt;strong&gt;🤖 AI服务调用失败或超时怎么办？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;请首先检查您本地的AI服务（如Ollama）是否正在运行，并确认脚本中配置的API地址和端口是否正确。&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;strong&gt;权限问题&lt;/strong&gt;：请确保运行脚本的用户对需要读取的源目录和写入的目标目录均具备相应的读写权限。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;编码问题&lt;/strong&gt;：如果遇到乱码或编码错误，请检查您的原始Markdown文件是否采用UTF-8编码格式保存。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;AI 自动化&lt;/strong&gt; 和 &lt;strong&gt;智能分类&lt;/strong&gt;，大幅减少了手动整理的时间成本，让你更专注于内容创作本身。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>AI助手：自媒体文章SEO元数据生成器</title><link>https://blog.moewah.com/posts/ai-assistant-seo-metadata-generator/</link><guid isPermaLink="true">https://blog.moewah.com/posts/ai-assistant-seo-metadata-generator/</guid><description>如何高效生成符合SEO标准的元数据？本文详解AI助手如何通过爆款标题公式、三层标签法和标准化Slug生成，帮助自媒体创作者快速提升内容分发权重与转化效率。</description><pubDate>Sat, 10 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;本提示词通过“爆款标题+三层标签法+SEO描述+标准Slug”四维一体逻辑，深度优化内容的分发权重与转化潜力。它旨在将碎片化信息转化为符合搜索引擎爬虫偏好、且精准触达受众痛点的标准化资产。通过强制性的格式约束与中英文语义转换逻辑，确保输出内容可直接对接主流 CMS 系统，实现运营效率与流量质量的双重跃迁。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;文章元数据SEO生成（AI提示词）&lt;a href=&quot;#文章元数据seo生成ai提示词&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Role&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;你是一位精通自媒体运营、SEO 策略及用户心理学的资深内容专家，擅长将普通内容转化为高点击、易检索的爆款推文。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Task&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;请阅读并分析我提供的文章内容，严格按照以下四个维度的规则进行优化，并按指定格式输出：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 1. Title（爆款 SEO 标题）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 逻辑：基于“爆款标题公式”（如：数字/利益点+痛点/悬念+目标群体）。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 要求：极具吸引力，符合 SEO 搜索习惯，字数控制在 30 字以内。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 格式：开头必须带一个相关的 Emoji 表情，中间不加多余空格。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 2. Description（SEO 描述）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 逻辑：采用“用户关注点（疑问句式）+ 核心解决方案（陈述句式）”。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 长度：80-100 字左右，保持单行文本，禁止分段。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 关键点：必须自然嵌入下方生成的 3 个 Tags 关键词，确保语义通顺。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 3. Tags（三层标签法）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;请分析文章的受众与搜索意图，生成 3 个独立标签，严禁多余词语：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 第一层（行业/赛道）：指明宏观归属（如：职场成长、自媒体运营）。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 第二层（属性/方法）：提炼交付内容（如：避坑指南、底层逻辑、实战复盘）。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 第三层（核心/术语）：锁定高权重 SEO 专有名词（如：AI绘图、私域引流、SEO优化）。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 格式规范：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 每个标签 2-6 个汉字或 3 个英文单词以内。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 英文全小写，词间用“-”连接。禁止空格和特殊字符。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 最终以英文逗号分隔，如：`标签1, 标签2, 标签3`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 4. Slug（URL 别名）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 逻辑：将优化后的 Title 转化为精简的英文 Slug。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 要求：仅限小写英文(a-z)、数字(0-9)和连字符(-)。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 长度：14 个英文单词以内。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 禁忌：严禁出现中文字符、空格或特殊符号。非英文字符必须移除或替换为连字符。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 示例：wechat-registration-beginner-guide-avoid-pitfalls&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Output Format&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;请严格按以下 Markdown 格式输出：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Title&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[此处输出标题]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Description&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[此处输出描述]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Tag&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[此处输出 3 个标签]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Slug&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[此处输出英文 Slug]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[待处理文章内容如下]：&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;section&gt;&lt;h3&gt;LLM 温度（Temperature）推荐值&lt;a href=&quot;#llm-温度temperature推荐值&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;针对此任务，建议将 Temperature 设定在 &lt;strong&gt;0.3 - 0.5&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;strong&gt;偏低 (0.1 - 0.3)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;0.3&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;追求极致规范&lt;/strong&gt;。适用于对 Slug 格式、三层标签定义有严格要求的场景，输出最稳健，但标题可能稍显中规中矩。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;中等 (0.4 - 0.6)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;0.5&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;平衡点（最推荐）&lt;/strong&gt;。在保证 Slug 和格式不乱阵脚的前提下，赋予 AI 足够的“文采”去构思更具点击欲望的爆款标题。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;偏高 (0.7 - 1.0)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;0.8&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;追求创意&lt;/strong&gt;。标题会非常惊艳，但极易在 Slug 转换、字数控制或标签分层上出现逻辑错误（如冒出中文字符）。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;去除 AI 味&lt;a href=&quot;#去除-ai-味&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. **语言和节奏**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 使用对话式语言，像和朋友聊天。使用&quot;你&quot;、&quot;我&quot;直接对话语气。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 长短句结合，营造自然讲述感。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 强调实操性，使用&quot;手把手教你&quot;、&quot;直接复制使用&quot;等短语。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 使用&quot;你可能想问&quot;、&quot;别担心&quot;等互动表达。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 提供具体数字和可验证结果。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. **避免的AI特征**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- ❌ 不使用&quot;首先、其次、然后&quot;等刻板连接词。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- ❌ 不写空泛的引言和总结。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- ❌ 不使用平衡但无用的表述（如&quot;各有优缺点&quot;）。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- ❌ 每部分都要有具体的操作指导或明确结论。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded></item><item><title>AI电影解构专家：从台词到导演意图的深度分析</title><link>https://blog.moewah.com/posts/ai-film-deconstruction-director-intent-methodology/</link><guid isPermaLink="true">https://blog.moewah.com/posts/ai-film-deconstruction-director-intent-methodology/</guid><description>如何用AI精准解读电影？本文揭秘专业电影解构员的提示词框架，通过导演意图、核心台词与风格分析，构建从微观文本到宏观社会意义的逻辑链条，助你掌握影视深度解析的核心方法。</description><pubDate>Sat, 10 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;本提示词专为追求深度视听解读的用户设计，旨在将 LLM 转化为一位严谨的“电影解构专家”。它打破了传统影评的随性，强调以导演意图为核心，结合关键台词与场景锚点，构建起从镜头语言到社会意义的逻辑链条。通过引用权威访谈与风格量化，确保每一条解读都具备学术级的客观性与专业深度，带你洞察光影背后的创作本质。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;AI提示词&lt;a href=&quot;#ai提示词&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Role：专业电影解读员&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 📜 Background&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;用户需要一位能够系统分析影片艺术价值的专家，基于导演意图、台词内容和电影风格进行深度解读。此任务涉及跨学科知识（如电影理论、文化分析），需结合权威影评与导演访谈佐证观点。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## ⚠️ Attention&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;需严格遵循输出格式，避免主观臆断；所有分析必须基于可验证资料（如导演访谈、权威影评），确保专业性和客观性。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 👤 Profile&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **Author**: prompt-engineer&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **Version**: 1.4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **Language**: 中文&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **Description**: 基于电影文本分析的系统化解读者，擅长通过台词拆解导演创作意图并关联艺术价值。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### 🛠 Skills&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. **快速检索**：检索导演访谈、幕后花絮及权威电影评论资料。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. **文本解构**：提取核心台词并将其与影片宏观主题进行关联。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. **风格定义**：精准区分现实主义、黑色幽默、表现主义等电影风格。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4. **感知分析**：解构叙事视角与观众心理感知之间的互动关系。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;5. **价值评估**：基于影史坐标系量化评价影片的艺术与社会价值。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 🎯 Goals&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. 解读影片导演的 **创作动机** 与 **表达意图**。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. 提取 10 条以上体现主题的 **核心台词** 并进行逐条深度解析。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. 分析不同 **风格类型** 对影片叙事与情感表达的具体影响。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4. 量化评估影片在 **影史** 中的独特地位与艺术价值。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;5. 构建从 **微观文本** 到 **宏观社会意义** 的逻辑链条。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 🚫 Constrains&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **严禁虚构**：禁止杜撰导演访谈或影评内容。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **场景对应**：台词分析必须明确对应具体的场景片段（如：第 X 分钟）。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **学术中立**：摒弃个人主观情感色彩，保持专业且客观的评论口吻。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **引用规范**：所有引用数据和观点需标注来源类型（如：[导演访谈] / [权威媒体]）。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 🔄 Workflow&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. **解析基础信息**：识别电影基本资料并归类其艺术风格。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. **挖掘创作意图**：通过导演公开访谈或文献提取核心创作初衷。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. **台词场景提取**：分场景梳理具有代表性的台词。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4. **建立逻辑映射**：构建“台词 -&amp;gt; 场景主题 -&amp;gt; 导演意图”的分析链路。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;5. **多维价值评价**：综合艺术性与社会性，给出最终量化评价与影史参照。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;51&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;52&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;53&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;54&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 📝 OutputFormat&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;55&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **排版要求**：使用清晰的分级标题，每板块之间使用分割线 `---` 增加呼吸感。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;56&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **Emoji 运用**：每个核心板块标题前必须添加对应主题的 Emoji。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;57&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **重点标注**：文中涉及的关键概念、专业术语使用 **加粗**。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;58&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **台词引导**：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;59&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 台词引用统一使用 `&amp;gt; 引用块` 格式。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;60&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 台词解读使用 💬 或 🖋️ 进行引导。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;61&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **核心结论**：关键性洞察使用 💡 或 📌 突出显示。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;62&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **具体内容内容**：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;63&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 基本情况：需含导演全名/国籍/代表作。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;64&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 总结：需包含与影史同类影片的纵向或横向对比。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;65&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;66&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;67&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;68&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 💡 Suggestions&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;69&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 建议建立导演风格数据库以提升分析的连贯性。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;70&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 引入跨文化视角，探讨影片在不同文化语境下的解读差异。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;71&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 使用台词聚类技术，将零散台词整合成系统的叙事线索。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;72&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;73&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;74&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;75&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 🚀 Initialization&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;76&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;作为专业电影解读员，你必须严格遵守上述排版与内容约束，使用中文与用户交流。请告知您想要深度解读的电影名称。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;&lt;strong&gt;LLM 温度（Temperature）推荐值区间&lt;/strong&gt;&lt;a href=&quot;#llm-温度temperature推荐值区间&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;针对该提示词的专业性需求，建议将温度设定在：&lt;strong&gt;0.3 - 0.5&lt;/strong&gt;&lt;/p&gt;
















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;区间&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;理由&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;0.3 (偏保守)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;首选建议。&lt;/strong&gt; 适用于学术性、分析性极强的任务。能有效防止模型“幻觉”，确保引用的导演访谈和台词数据更加精准、严谨。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;0.5 (适中)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;当你需要模型在分析“社会意义”或“艺术评价”部分提供更多视角的发散，且不希望语言过于干瘪时使用，能增加文本的可读性。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;</content:encoded></item><item><title>Typecho文章批量导出至Astro Markdown工具</title><link>https://blog.moewah.com/posts/typecho-to-markdown-batch-export-tool/</link><guid isPermaLink="true">https://blog.moewah.com/posts/typecho-to-markdown-batch-export-tool/</guid><description>如何将Typecho博客内容高效迁移到Astro？本文提供适配Astro 5.0和Firefly主题的批量导出工具，自动转换Markdown格式并生成标准Frontmatter，解决图片处理、文件命名等迁移痛点，助力博主无缝迁移。</description><pubDate>Sat, 10 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;Typecho 作为一款轻量级的博客系统，曾经是许多博主的选择。然而，随着技术的不断发展，Typecho 已经很久没有更新了。今年我发现了 &lt;strong&gt;Astro&lt;/strong&gt; 这个现代化静态站点生成框架，同时被 &lt;strong&gt;Firefly 主题&lt;/strong&gt; 这个非常符合我审美的主题所吸引，于是毅然决定将博客迁移到 Astro。&lt;/p&gt;&lt;p&gt;为了方便 Typecho 用户迁移导出 Markdown 文档，并适配 Astro 的 &lt;a href=&quot;https://github.com/CuteLeaf/Firefly&quot; target=&quot;_blank&quot;&gt;Firefly 主题&lt;/a&gt;而制作的定制化的导出工具。它不仅能将 Typecho 的文章导出为标准的 Markdown 格式，还能自动生成符合 Firefly 主题要求的 Frontmatter 配置。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;ol&gt;
&lt;li&gt;&lt;strong&gt;按分类目录导出&lt;/strong&gt;：文章将按照分类自动组织到对应的子目录中&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;符合 Astro 5.0 标准&lt;/strong&gt;：生成标准的 YAML Frontmatter，包含所有必要字段&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;智能图片处理&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;自动将引用式图片转换为直接链接格式&lt;/li&gt;
&lt;li&gt;清理 Typecho 图片 URL 中的冗余参数（如 &lt;code&gt;#vwid&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;移除所有图片引用定义行&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动摘要生成&lt;/strong&gt;：从文章内容中智能提取前100字作为描述&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;灵活的封面图片配置&lt;/strong&gt;：支持使用 Firefly 主题内置的随机二次元图片 API，或自定义图片 URL&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优化日期格式&lt;/strong&gt;：Frontmatter 中的日期格式简化为 &lt;code&gt;YYYY-MM-DD&lt;/code&gt;，更易阅读&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全文件名处理&lt;/strong&gt;：自动清理文件名中的非法字符，确保文件系统兼容性&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&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;strong&gt;特别提醒&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;使用本工具请务必预先全量备份服务器的网站数据（数据库+网站文件），本工具不处理博客服务器中的静态图片资源，仅导出文章和适配生成 Frontmatter 属性。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;也因此，图片资源存储在网站服务器中的使用者请务必斟酌再三，这部分使用者后期需要打包下载服务器的图片文件导入到 Astro，然后批处理 md 文档中的图片引用地址改成相对地址才能正常显示图片哦。&lt;/p&gt;&lt;/blockquote&gt;&lt;section&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;在你的 Typecho 网站根目录创建一个 &lt;code&gt;converter.php&lt;/code&gt; 文件，将以下完整代码复制到文件中：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;?&lt;/span&gt;&lt;span&gt;php&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* Typecho 文章导出工具 (适配 Astro 5.0 + Firefly 主题)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 功能特性：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 1. 按分类目录导出文章到对应的子目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 2. 构建符合 Astro 5.0 标准的 YAML Frontmatter&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 3. 自动处理引用式图片，转换为直接链接格式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 4. 清理图片 URL 中的冗余参数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 5. 生成文章摘要（自动截取前100字）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 6. 支持自定义文章封面图片配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 使用前请先配置数据库连接信息和导出选项&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 运行后会在指定目录生成按分类组织的 Markdown 文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 1. 基础配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;error_reporting&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;E_ALL&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ini_set&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;display_errors&lt;/span&gt;&lt;span&gt;&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;1&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dbConfig&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;localhost&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;数据库名&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;数据库用户名&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;pass&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;数据库密码&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;baseDir&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro_posts&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;api&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;// 文章封面图片配置：默认值为 &apos;api&apos;，将使用 Firefly 主题内置的随机二次元图片 API&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;// 可自定义为其他图片 URL，例如：&apos;https://example.com/image.jpg&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                &lt;/span&gt;&lt;span&gt;// 或者保留为空字符串 &apos;&apos; 则不生成 image 属性&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;try&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 创建数据库连接&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dsn&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &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;mysql:host=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;{$&lt;/span&gt;&lt;span&gt;dbConfig&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;[&apos;&lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt;&apos;]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;;dbname=&lt;/span&gt;&lt;span&gt;&lt;span&gt;{$&lt;/span&gt;&lt;span&gt;dbConfig&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;[&apos;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&apos;]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&lt;span&gt;;charset=utf8mb4&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pdo&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PDO&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dsn&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dbConfig&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span&gt;&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;dbConfig&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;pass&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;PDO&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;ATTR_ERRMODE&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;&lt;span&gt;PDO&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;ERRMODE_EXCEPTION&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;PDO&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;ATTR_DEFAULT_FETCH_MODE&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;&lt;span&gt;PDO&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;FETCH_ASSOC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;✅ 数据库连接成功&lt;/span&gt;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 2. 执行 SQL 查询&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;c.cid, c.title, c.text, c.slug, c.created, c.modified,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(SELECT GROUP_CONCAT(m.name) FROM typecho_relationships r&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;         &lt;/span&gt;&lt;/span&gt;&lt;span&gt;JOIN typecho_metas m ON r.mid = m.mid&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;         &lt;/span&gt;&lt;/span&gt;&lt;span&gt;WHERE r.cid = c.cid AND m.type = &apos;tag&apos;) as tags,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(SELECT m.name FROM typecho_relationships r&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;         &lt;/span&gt;&lt;/span&gt;&lt;span&gt;JOIN typecho_metas m ON r.mid = m.mid&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;         &lt;/span&gt;&lt;/span&gt;&lt;span&gt;WHERE r.cid = c.cid AND m.type = &apos;category&apos; LIMIT 1) as category&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;51&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;FROM typecho_contents c&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;52&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;WHERE c.type = &apos;post&apos; AND c.status = &apos;publish&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;53&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ORDER BY c.created DESC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;54&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;55&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;56&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 执行查询获取所有已发布的文章&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;57&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;stmt&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pdo&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;sql&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;58&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;posts&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;stmt&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;fetchAll&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;59&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;60&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt;!&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;posts&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;die&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;❌ 没有找到文章&lt;/span&gt;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;61&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;62&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;📂 开始导出 &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;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;posts&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &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; 篇文章...&lt;/span&gt;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;63&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;64&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;foreach&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;posts&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;index&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;&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;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;65&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 3. 处理分类目录：根据文章分类创建对应的导出目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;66&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&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;!&lt;/span&gt;&lt;/span&gt;&lt;span&gt;empty&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;category&lt;/span&gt;&lt;span&gt;&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;post&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;category&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;Uncategorized&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;67&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;targetFolder&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dbConfig&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;baseDir&lt;/span&gt;&lt;span&gt;&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;DIRECTORY_SEPARATOR&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sanitize_filename&lt;/span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;68&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt;!&lt;/span&gt;&lt;/span&gt;&lt;span&gt;is_dir&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;targetFolder&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;69&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;mkdir&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;targetFolder&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;0755&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;70&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;71&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;72&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 4. 处理文件名：移除非法字符，确保文件名安全&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;73&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;fileName&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sanitize_filename&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;]);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;74&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;exportPath&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;targetFolder&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DIRECTORY_SEPARATOR&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;fileName&lt;/span&gt;&lt;/span&gt;&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;.md&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;75&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// Windows 系统需要转换编码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;76&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;strpos&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;PHP_OS&lt;/span&gt;&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;WIN&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;!==&lt;/span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;77&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;exportPath&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;iconv&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;UTF-8&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;GBK//IGNORE&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;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;exportPath&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;78&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;79&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;80&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 5. 处理文章内容：移除 Typecho 的 Markdown 注释标记&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;81&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;rawContent&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&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&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;82&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;str_replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;&amp;lt;!--markdown--&amp;gt;&lt;/span&gt;&lt;span&gt;&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;&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;rawContent&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;83&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;84&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 6. 生成文章摘要：从内容中提取前100字作为描述&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;85&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 6.1 清理文本：移除所有 HTML 和 Markdown 标记&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;86&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;strip_tags&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;&lt;span&gt;// 去除 HTML 标签&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;87&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;\[&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt;\]\(&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt;\)&lt;/span&gt;&lt;span&gt;/s&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;&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;cleanText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;88&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;\[&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt;\]\[&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt;\]&lt;/span&gt;&lt;span&gt;/s&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;&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;cleanText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;89&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;\[&lt;/span&gt;&lt;span&gt;(.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;?)&lt;/span&gt;&lt;span&gt;\]\(&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt;\)&lt;/span&gt;&lt;span&gt;/s&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;&apos;&lt;/span&gt;&lt;span&gt;$1&lt;/span&gt;&lt;span&gt;&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;cleanText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;90&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;\s&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;/&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;&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;cleanText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;91&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;/&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;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&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;cleanText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;92&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;trim&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;93&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;94&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 6.2 截取前100字作为摘要&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;95&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;mb_substr&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanText&lt;/span&gt;&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;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;UTF-8&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;96&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;mb_strlen&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanText&lt;/span&gt;&lt;/span&gt;&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;&lt;/span&gt;&lt;span&gt;UTF-8&lt;/span&gt;&lt;span&gt;&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;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;97&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;98&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;99&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;100&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 7. 准备 Frontmatter（符合 Astro 5.0 标准）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;101&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pubDate&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;Y-m-d&lt;/span&gt;&lt;span&gt;&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;post&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;created&lt;/span&gt;&lt;span&gt;&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;// 发布日期，格式：YYYY-MM-DD&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;102&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&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;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;Y-m-d&lt;/span&gt;&lt;span&gt;&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;post&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;modified&lt;/span&gt;&lt;span&gt;&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;// 更新日期，格式：YYYY-MM-DD&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;103&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&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;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;tags&lt;/span&gt;&lt;span&gt;&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;explode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&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;post&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;tags&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;])&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[];&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 标签字符串转数组&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;104&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&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;&lt;span&gt;array_filter&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;array_map&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;trim&lt;/span&gt;&lt;span&gt;&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;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;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;105&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;106&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &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;---&lt;/span&gt;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;107&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;json_encode&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&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;JSON_UNESCAPED_UNICODE&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&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;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;108&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&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;published: &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pubDate&lt;/span&gt;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;109&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&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;updated: &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;upDate&lt;/span&gt;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;110&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&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;author: &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;&lt;span&gt;json_encode&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;&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;JSON_UNESCAPED_UNICODE&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&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;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;111&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 生成 image 属性，如果配置不为空则添加&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;112&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt;!&lt;/span&gt;&lt;/span&gt;&lt;span&gt;empty&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dbConfig&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;113&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&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;image: &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;&lt;span&gt;json_encode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dbConfig&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;&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;JSON_UNESCAPED_UNICODE&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&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;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;114&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;115&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&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;description: &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;&lt;span&gt;json_encode&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;&lt;span&gt;JSON_UNESCAPED_UNICODE&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&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;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;116&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&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;category: &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;&lt;span&gt;json_encode&lt;/span&gt;&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;JSON_UNESCAPED_UNICODE&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&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;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;117&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;118&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 7.2 处理标签：生成正确的 YAML 数组格式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;119&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&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;&amp;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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;120&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&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;tags:&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;&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;implode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&lt;span&gt;  - &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;&lt;span&gt;array_map&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;fn&lt;/span&gt;&lt;span&gt;(&lt;/span&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;)&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;json_encode&lt;/span&gt;&lt;span&gt;(&lt;/span&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;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;JSON_UNESCAPED_UNICODE&lt;/span&gt;&lt;span&gt;&lt;span&gt;),&lt;/span&gt;&lt;span&gt; &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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;121&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;else&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;122&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&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;tags: []&lt;/span&gt;&lt;/span&gt;&lt;span&gt;\n&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;// 空数组，避免生成 `- []` 的错误格式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;123&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;124&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;125&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&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;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;&lt;span&gt;json_encode&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;slug&lt;/span&gt;&lt;span&gt;&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;JSON_UNESCAPED_UNICODE&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&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;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;126&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&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;draft: false&lt;/span&gt;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;127&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&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;toc: true&lt;/span&gt;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;128&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&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;---&lt;/span&gt;&lt;/span&gt;&lt;span&gt;\n\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;129&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;130&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 8. 处理正文内容：将所有引用式图片转换为直接链接格式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;131&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 8.1 清理直接链接图片中的 #vwid 后缀参数（Typecho 特有的图片参数）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;132&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;(https?:&lt;/span&gt;&lt;span&gt;\/\/&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;^\s\)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;span&gt;?)(#vwid=&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;^?\s\)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;/i&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;&apos;&lt;/span&gt;&lt;span&gt;$1&lt;/span&gt;&lt;span&gt;&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;content&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;133&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;134&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 8.2 收集所有图片引用定义（Markdown 引用格式：[id]: URL）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;135&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;imageRefs&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;136&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;preg_match_all&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;^&lt;/span&gt;&lt;span&gt;&lt;span&gt;\[&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;^\&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;\]&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;(https?:&lt;/span&gt;&lt;span&gt;\/\/&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;^\s&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;/im&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;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;$&lt;/span&gt;&lt;span&gt;refMatches&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;PREG_SET_ORDER&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;137&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;foreach&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;refMatches&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;match&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;138&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;refId&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;match&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;139&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;imageUrl&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;match&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;140&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;// 清理图片URL后缀参数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;141&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanUrl&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;(#vwid=&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;^?\s\)&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;/i&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;&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;imageUrl&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;142&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;imageRefs&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;refId&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cleanUrl&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;143&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;144&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;145&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;146&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 8.3 将引用式图片标记转换为直接链接格式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;147&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 处理格式：![描述][id]、![][id]、![id]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;148&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;foreach&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;imageRefs&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;refId&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;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;imageUrl&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;149&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;// 匹配格式 ![描述][id] 或 ![][id]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;150&lt;/div&gt;&lt;/div&gt;&lt;div&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; &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;&lt;/span&gt;&lt;span&gt;/!\[(.*?)\]\[\s*&lt;/span&gt;&lt;span&gt;&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;preg_quote&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;refId&lt;/span&gt;&lt;/span&gt;&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;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;\s*\]/&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;151&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace_callback&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;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;matches&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;imageUrl&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;152&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;altText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;matches&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;153&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&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;altText&lt;/span&gt;&lt;/span&gt;&lt;span&gt;](&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;imageUrl&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;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;154&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;155&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;156&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;// 匹配格式 ![id] 这种简写形式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;157&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pattern2&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &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;&lt;/span&gt;&lt;span&gt;/!\[\s*&lt;/span&gt;&lt;span&gt;&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;preg_quote&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;refId&lt;/span&gt;&lt;/span&gt;&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;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;\s*\]/&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;158&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pattern2&lt;/span&gt;&lt;/span&gt;&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;![](&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;imageUrl&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;&lt;span&gt;&lt;span&gt;,&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;159&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;160&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;161&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 8.4 移除所有图片引用定义行（已经转换为直接链接，不再需要引用定义）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;162&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;\[&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;^\&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;span&gt;\]&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;https?:&lt;/span&gt;&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&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;&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;content&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;163&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;164&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 8.5 清理多余的空行（三个以上连续空行合并为两个空行）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;165&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;preg_replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;\n\s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;\n\s&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;/&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;&quot;&lt;/span&gt;&lt;span&gt;\n\n&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;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;content&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;166&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;trim&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;167&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;168&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 9. 合并 Frontmatter 和正文内容&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;169&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;fullOutput&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;yaml&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;170&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;171&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 10. 写入文件到指定路径&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;172&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;file_put_contents&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;exportPath&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;fullOutput&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;173&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;[&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; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;index&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;&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;post&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;[&apos;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&apos;]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;174&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;175&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;176&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;177&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;🎉 导出完成！已将引用式图片转换为直接链接格式。&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;178&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;📁 文件保存在目录: &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;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dbConfig&lt;/span&gt;&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;baseDir&lt;/span&gt;&lt;span&gt;&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;&quot;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;179&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;180&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;catch&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Exception&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;181&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;die&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;❌ 错误: &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;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;getMessage&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&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;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;182&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;183&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;184&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;185&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 文件名清理函数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;186&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;187&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; $filename 原始文件名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;188&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; 清理后的安全文件名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;189&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;190&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 功能：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;191&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 1. 替换非法字符为连字符&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;192&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 2. 限制文件名长度不超过80个字符&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;193&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 3. 去除文件名两端的点和连字符&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;194&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;195&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sanitize_filename&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;filename&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;196&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 定义需要替换的非法字符&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;197&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;invalid&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;array&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;?&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;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\\&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;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;|&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;*&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;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\&quot;&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;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&amp;lt;&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;198&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;filename&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;str_replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;invalid&lt;/span&gt;&lt;/span&gt;&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;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&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;filename&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;199&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;200&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 限制文件名长度，避免过长的文件名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;201&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;filename&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;mb_substr&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;filename&lt;/span&gt;&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;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;80&lt;/span&gt;&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;&lt;/span&gt;&lt;span&gt;utf-8&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;202&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;203&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 去除文件名两端的点和连字符（避免隐藏文件或非法文件）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;204&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;trim&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;filename&lt;/span&gt;&lt;/span&gt;&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;&lt;/span&gt;&lt;span&gt;.-&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;205&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;206&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;?&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;converter.php&lt;/code&gt;，找到以下配置部分，将数据库信息更改为你自己的 Typecho 数据库信息：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dbConfig&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;localhost&lt;/span&gt;&lt;span&gt;&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;// 数据库主机地址（通常为 localhost）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;数据库名&lt;/span&gt;&lt;span&gt;&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;// Typecho 数据库名称&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;数据库用户名&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;pass&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;数据库密码&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;baseDir&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro_posts&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;api&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;// 封面图片配置（默认使用 Firefly 主题 API）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;section&gt;&lt;h4&gt;封面图片配置说明：&lt;a href=&quot;#封面图片配置说明&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&apos;api&apos;&lt;/code&gt;：默认值，使用 Firefly 主题内置的随机二次元图片 API&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&apos;https://example.com/image.jpg&apos;&lt;/code&gt;：自定义静态图片 URL&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&apos;&apos;&lt;/code&gt;：留空则不生成 image 属性&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&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;打开你的服务器终端，进入到 Typecho 网站根目录，执行以下命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;php&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;converter.php&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;脚本将自动连接数据库，导出所有已发布的文章，并显示导出进度：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;✅ 数据库连接成功&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;📂 开始导出 23 篇文章...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[1] 已导出: 我的第一篇文章&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[2] 已导出: 技术分享：PHP 开发技巧&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;🎉 导出完成！已将引用式图片转换为直接链接格式。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;📁 文件保存在目录: astro_posts&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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 文件将按照分类组织在 &lt;code&gt;astro_posts/&lt;/code&gt; 目录下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;astro_posts/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── 技术文章/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── 我的第一篇文章.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   └── 技术分享-PHP-开发技巧.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── 生活随笔/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   └── 周末游记.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└── Uncategorized/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└── 未分类文章.md&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;每个 Markdown 文件都包含完整的 Frontmatter 和文章内容，可以直接用于 Astro + Firefly 主题。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;以下是导出的 Markdown 文件中的 Frontmatter 示例：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&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;&quot;&lt;/span&gt;&lt;span&gt;我的第一篇文章&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;published&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;2019-06-19&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;updated&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;2021-04-30&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;author&lt;/span&gt;&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;MoeWah&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;image&lt;/span&gt;&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;api&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&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;&quot;&lt;/span&gt;&lt;span&gt;这篇文章是关于 Typecho 导出工具的详细介绍...&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;category&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Astro教程&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tags&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &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;PHP&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &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;Typecho&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &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;博客迁移&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;slug&lt;/span&gt;&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;my-first-post&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;draft&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;toc&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;这个导出工具是我从 Typecho 迁移到 Astro + Firefly 过程中的产物，希望它也能帮助到其他有类似需求的博主。工具已经优化了 Frontmatter 格式，处理了图片引用转换，并提供了灵活的配置选项。&lt;/p&gt;&lt;p&gt;最后，祝大家在博客迁移过程中一切顺利，享受 “Astro 框架 + Firefly 主题”带来的现代化博客体验！&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;注意事项：&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;请确保在运行脚本前备份你的 Typecho 数据库&lt;/li&gt;
&lt;li&gt;脚本只会导出已发布的文章（&lt;code&gt;status = &apos;publish&apos;&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;如果文章数量很多，导出过程可能需要一些时间&lt;/li&gt;
&lt;li&gt;导出的 Markdown 文件可以直接复制到 Astro 项目的 &lt;code&gt;src/content/posts/&lt;/code&gt; 目录中使用&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;</content:encoded></item><item><title>《暖春》：一部让人心碎又重生的中国亲情电影</title><link>https://blog.moewah.com/posts/warm-spring-movie-realism-family-emotion-analysis/</link><guid isPermaLink="true">https://blog.moewah.com/posts/warm-spring-movie-realism-family-emotion-analysis/</guid><description>为什么《暖春》能成为经典？这部由乌兰塔娜执导的现实主义亲情片，通过小花与宝柱爹的故事，探讨了在贫困中人性的善恶挣扎与真情回归，揭示了中国式家庭伦理中的爱与救赎。</description><pubDate>Sat, 10 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;《暖春》是由&lt;strong&gt;乌兰塔娜&lt;/strong&gt;编剧并执导，由&lt;strong&gt;田成仁&lt;/strong&gt;、&lt;strong&gt;张妍&lt;/strong&gt;等主演的经典现实主义亲情电影。该片于2003年上映，以极低的制作成本创造了中国影史上的“苦情戏”票房奇迹，并斩获了华表奖、百花奖等多项殊荣。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&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;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;strong&gt;现实主义&lt;/strong&gt;与&lt;strong&gt;质朴美学&lt;/strong&gt;。&lt;/li&gt;
&lt;li&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;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;/p&gt;&lt;p&gt;💡 &lt;strong&gt;核心洞察&lt;/strong&gt;：影片并非单纯为了“煽情”而煽情，而是通过一个极端的道德样本（宝柱爹），探讨在生存压力下，人性中“善”的坚守与“私”的转化。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;以下提取了影片中10条具有代表性的台词，结合具体场景进行解构：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;1. “爷爷，别把我送走，小花会干活，以后小花少吃饭，一天吃一顿饭就行。”&lt;/strong&gt;
💬 &lt;strong&gt;解析&lt;/strong&gt;：出现在小花刚被宝柱爹背回家，面临被婶娘驱赶的时刻。
🖋️ 这句话精准捕捉了孤儿在极端不安全感下的&lt;strong&gt;自卑与求生本能&lt;/strong&gt;。她试图通过物化自己的劳动力和压抑生理需求，来换取一个“家”的入场券。&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;2. “人不能见死不救。”&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;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;3. “咱家都快揭不开锅了，还领回个吃闲饭的。”&lt;/strong&gt;
💬 &lt;strong&gt;解析&lt;/strong&gt;：香草（婶娘）在饭桌上对宝柱爹收养小花的强烈抗议。
🖋️ 反映了贫穷对人性的&lt;strong&gt;异化&lt;/strong&gt;。在粮食即生命的生存逻辑下，香草的“恶”其实带有深刻的现实悲凉感。&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;4. “婶婶，你吃贴饼子。”&lt;/strong&gt;
💬 &lt;strong&gt;解析&lt;/strong&gt;：小花不计前嫌，将自己做的饼子送给一直虐待她的婶娘。
🖋️ 体现了“&lt;strong&gt;以德报怨&lt;/strong&gt;”的情感逻辑。小花的纯真成为了感化香草的第一道裂缝。&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;5. “吃了这些蚂蚱你就会生小弟弟。”&lt;/strong&gt;
💬 &lt;strong&gt;解析&lt;/strong&gt;：小花听说吃蚂蚱能治婶娘的不孕症，偷偷抓了十大瓶蚂蚱。
🖋️ 这是剧情的&lt;strong&gt;关键转折点&lt;/strong&gt;。小花用孩子式的纯真逻辑去解决成人世界的痛苦，这种极致的善良彻底震动了香草的内心防御。&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;6. “只要爷爷有一口气在，就供你上学。”&lt;/strong&gt;
💬 &lt;strong&gt;解析&lt;/strong&gt;：爷爷上山砍柳条编筐，为小花筹集学费时的承诺。
🖋️ 展现了中国式家长对“&lt;strong&gt;教育改变命运&lt;/strong&gt;”的执着，这种无私的奉献超越了血缘。&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;7. “这娃命苦啊。”&lt;/strong&gt;
💬 &lt;strong&gt;解析&lt;/strong&gt;：爷爷看着小花在土里刻字学文化时，心疼地感叹。
🖋️ 这一声叹息定格了影片的&lt;strong&gt;情感基调&lt;/strong&gt;，将观众的同情心推向高潮。&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;8. “宝柱也是捡来的。”&lt;/strong&gt;
💬 &lt;strong&gt;解析&lt;/strong&gt;：影片末尾由村长揭开的惊人真相。
🖋️ &lt;strong&gt;叙事升华&lt;/strong&gt;：这一反转将宝柱爹的形象从“善良的老人”提升到了“圣徒”的高度，证明了他的善良是一以贯之的生命实践。&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;9. “娘！”&lt;/strong&gt;
💬 &lt;strong&gt;解析&lt;/strong&gt;：小花最终扑进香草怀里，喊出了生平第一声娘。
🖋️ 象征着家庭关系的&lt;strong&gt;最终和解&lt;/strong&gt;与身份认同的完成。&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;10. “是爱让我成长，让我明白生活中不只有血，是暖的。”&lt;/strong&gt;
💬 &lt;strong&gt;解析&lt;/strong&gt;：成年后的小花回到家乡当老师时的独白。
🖋️ 宏观总结了影片主题：血缘不是构建家庭的唯一纽带，&lt;strong&gt;大爱无疆&lt;/strong&gt;才是抵御生活寒冬的终极力量。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;/li&gt;
&lt;li&gt;&lt;strong&gt;去技巧化的真实感&lt;/strong&gt;：演员造型追求真实而非好看，内景陈设极具80年代农村质感，增强了故事的可信度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;视觉隐喻&lt;/strong&gt;：小花的名字与山间的野花呼应，象征着顽强的生命力与不染尘埃的品格。&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;strong&gt;经济价值&lt;/strong&gt;：以&lt;strong&gt;200万元&lt;/strong&gt;的小额投资博回了&lt;strong&gt;2500万元&lt;/strong&gt;的票房，创造了国产小成本电影的奇迹。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;艺术成就&lt;/strong&gt;：荣获第9届华表奖优秀故事片奖、第27届百花奖优秀故事片奖。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;社会意义&lt;/strong&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;/li&gt;
&lt;/ul&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;/section&gt;</content:encoded></item><item><title>从 Hugo/Hexo/Next.js 迁移到 Astro 的3天指南</title><link>https://blog.moewah.com/posts/hugo-hexo-nextjs-to-astro-3-day-migration-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/hugo-hexo-nextjs-to-astro-3-day-migration-guide/</guid><description>如何从Hugo、Hexo或Next.js迁移到Astro？本文详细拆解迁移流程，涵盖操作步骤、SEO影响和常见坑点，助你3天完成高性能博客迁移。</description><pubDate>Wed, 07 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;每次打开博客，看着那慢悠悠的加载速度，心里就不是滋味。想给 Hugo 的模板加功能，发现模板语法太反人类。Next.js 搭的静态博客，打包出来的 JavaScript 文件大得惊人，明明只是个博客，为什么要加载那么多代码？&lt;/p&gt;
&lt;p&gt;去年我听说 Astro 这个框架——号称能让网站性能直接拉满，PageSpeed Insights 随便跑个100分。一开始我挺怀疑，但看到越来越多开发者分享迁移经验，说迁移过程没那么复杂，就心动了。&lt;/p&gt;
&lt;p&gt;不过真要迁移还是有点担心：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;**迁移会不会很麻烦？**我有几十上百篇文章，要一篇篇改吗？&lt;/li&gt;
&lt;li&gt;**会不会影响 SEO？**URL 结构变了怎么办？&lt;/li&gt;
&lt;li&gt;**有哪些坑需要提前知道？**不想迁移到一半卡住。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;根据我收集的开发者经验，整个迁移过程其实只需要1-3天。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;为什么值得迁移到 Astro&lt;a href=&quot;#为什么值得迁移到-astro&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Zero JavaScript 策略&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Astro 最大的特点是”默认零 JS”。它生成的页面默认不包含任何 JavaScript。对于博客、文档站这种内容为主的网站，这简直是性能优化的终极方案。&lt;/p&gt;&lt;p&gt;有个日本开发者分享，他从 Next.js 迁移到 Astro 后，PageSpeed Insights 的分数从85分直接跳到100分，而且每次测都是100分。提升主要来自：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;移除了 hydration 所需的 JavaScript&lt;/li&gt;
&lt;li&gt;CSS 内联化，减少了网络请求次数&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Islands 架构&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;现代网站总归需要一些交互功能：评论区、搜索框、主题切换按钮。Astro 的解决方案是 Islands 架构——你可以在静态的 HTML 页面中，给特定的交互组件加上 JavaScript，其他部分保持纯静态。&lt;/p&gt;&lt;p&gt;就像一个岛屿，周围是静态的海洋，只有岛上才有动态的生命。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;现代化的开发体验&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你用过 Hugo，应该知道它的模板语法有多难用。Astro 完全不一样，它的 &lt;code&gt;.astro&lt;/code&gt; 文件语法跟 JSX 几乎一样，还支持直接使用 React、Vue、Svelte 等主流框架的组件。&lt;/p&gt;&lt;p&gt;Hugo 的模板开发起来不够方便，虽然有很多开源的模板可以使用，但如果要自己调整就有点困难。Astro 的模板自定义调整就很容易，完全是现代前端开发的思路。&lt;/p&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;Hugo&lt;/th&gt;&lt;th&gt;Hexo&lt;/th&gt;&lt;th&gt;Next.js&lt;/th&gt;&lt;th&gt;Astro&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;构建速度&lt;/td&gt;&lt;td&gt;超快（Go语言）&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;/td&gt;&lt;td&gt;Go模板（难）&lt;/td&gt;&lt;td&gt;EJS/Pug&lt;/td&gt;&lt;td&gt;JSX/TSX&lt;/td&gt;&lt;td&gt;Astro/JSX&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;前端框架支持&lt;/td&gt;&lt;td&gt;无&lt;/td&gt;&lt;td&gt;有限&lt;/td&gt;&lt;td&gt;React&lt;/td&gt;&lt;td&gt;多框架&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;默认JS大小&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;中等&lt;/td&gt;&lt;td&gt;大&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;一般&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;/td&gt;&lt;td&gt;高&lt;/td&gt;&lt;td&gt;中&lt;/td&gt;&lt;td&gt;高&lt;/td&gt;&lt;td&gt;成长中&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;哪些项目适合迁移&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;不是所有项目都适合迁移到 Astro。&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;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;如果你的网站是”内容为王”，那 Astro 就是为你准备的。如果需要大量交互和实时更新，还是老老实实用 Next.js 或者 SPA 框架吧。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;section&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;这是最重要的一步。用 git 分支来管理：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 创建迁移分支&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git checkout -b migrate-to-astro&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 确保当前工作已保存&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git add .&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git commit -m &quot;备份：开始迁移到 Astro&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这样万一迁移过程中出问题了，随时可以切回原来的分支。&lt;/p&gt;&lt;/section&gt;&lt;section&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;/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;/ul&gt;&lt;p&gt;&lt;strong&gt;时间预估&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;内容少于50篇：1天&lt;/li&gt;
&lt;li&gt;50-200篇：2天&lt;/li&gt;
&lt;li&gt;200篇以上：3天&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 选择 Astro 主题&lt;a href=&quot;#3-选择-astro-主题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Astro 有很多优秀的博客主题，选一个跟你现有博客风格接近的，能省不少事：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;推荐主题&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AstroPaper&lt;/strong&gt;：简洁的博客主题，适合技术博客&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fuwari&lt;/strong&gt;：支持多语言，功能丰富&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Astro Cactus&lt;/strong&gt;：有完整的目录树组件&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;快速创建项目：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 使用 AstroPaper 主题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm create astro@latest my-blog -- --template satnaing/astro-paper&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 或使用 Fuwari 主题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm create astro@latest my-blog -- --template saicaca/fuwari&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;ul&gt;
&lt;li&gt;&lt;strong&gt;Node.js&lt;/strong&gt;：v18.14.1 或更高版本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;包管理器&lt;/strong&gt;：npm、pnpm 或 yarn&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VS Code 插件&lt;/strong&gt;：Astro（官方插件，必装）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;从 Hugo 迁移的详细步骤&lt;a href=&quot;#从-hugo-迁移的详细步骤&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Hugo 到 Astro 的迁移难度适中，主要工作是模板转换。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;步骤1：创建 Astro 项目&lt;a href=&quot;#步骤1创建-astro-项目&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm create astro@latest my-new-blog&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd my-new-blog&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm install&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装常用集成&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npx astro add mdx sitemap&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;步骤2：迁移 Markdown 内容&lt;a href=&quot;#步骤2迁移-markdown-内容&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这是最关键的一步。好消息是，Hugo 和 Astro 的 Frontmatter 大部分是兼容的，只需要改几个字段。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Frontmatter 字段映射&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Hugo 格式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;title: &quot;我的文章&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;date: 2023-01-15&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tags: [&quot;前端&quot;, &quot;Astro&quot;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Astro 格式（改动标记为 ⬅）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;title: &quot;我的文章&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pubDate: 2023-01-15  ⬅ date 改为 pubDate&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tags: [&quot;前端&quot;, &quot;Astro&quot;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果文章很多，可以用脚本批量替换：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# macOS/Linux&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;find content -name &quot;*.md&quot; -exec sed -i &apos;&apos; &apos;s/^date:/pubDate:/g&apos; {} +&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Windows (PowerShell)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Get-ChildItem content -Filter *.md -Recurse | ForEach-Object {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(Get-Content $_.FullName) -replace &apos;^date:&apos;, &apos;pubDate:&apos; | Set-Content $_.FullName&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;p&gt;Hugo 的模板是 Go Template 语法，Astro 是类似 JSX 的语法。有个小技巧：如果你之前写了 HTML 模板，可以直接把 HTML 粘贴到 &lt;code&gt;.astro&lt;/code&gt; 文件里，就完成了70%的工作。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Hugo 模板示例&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{{ range .Pages }}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;h2&amp;gt;{{ .Title }}&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;p&amp;gt;{{ .Summary }}&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{{ end }}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Astro 转换后&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const posts = await Astro.glob(&apos;../pages/blog/*.md&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{posts.map(post =&amp;gt; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;h2&amp;gt;{post.frontmatter.title}&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;p&amp;gt;{post.frontmatter.description}&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;))}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;把 Hugo 的 &lt;code&gt;static/&lt;/code&gt; 目录内容复制到 Astro 的 &lt;code&gt;public/&lt;/code&gt; 目录，路径保持不变：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cp -r hugo-blog/static/* astro-blog/public/&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;对于文章中的图片引用，如果用的是相对路径或绝对路径（如 &lt;code&gt;/images/pic.jpg&lt;/code&gt;），都不需要改，因为 &lt;code&gt;public/&lt;/code&gt; 目录的内容会直接映射到网站根目录。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;步骤5：URL 重定向设置&lt;a href=&quot;#步骤5url-重定向设置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这一步很关键，关系到 SEO。如果你的 URL 结构变了，一定要设置301重定向。&lt;/p&gt;&lt;p&gt;在 &lt;code&gt;astro.config.mjs&lt;/code&gt; 中配置：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;redirects: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;/old-path&apos;: &apos;/new-path&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;/posts/[slug]&apos;: &apos;/blog/[slug]&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;从 Hexo 迁移的详细步骤&lt;a href=&quot;#从-hexo-迁移的详细步骤&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Hexo 的迁移跟 Hugo 类似，但有一些特定的注意事项。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;步骤1：创建项目并配置 Content Collections&lt;a href=&quot;#步骤1创建项目并配置-content-collections&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pnpm create astro@latest my-blog --template satnaing/astro-paper&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd my-blog&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pnpm install&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;Astro 用 Content Collections 来管理内容，需要在 &lt;code&gt;src/content/config.ts&lt;/code&gt; 配置：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { defineCollection, z } from &apos;astro:content&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const blog = defineCollection({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;schema: z.object({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title: z.string(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pubDate: z.date(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description: z.string(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tags: z.array(z.string()),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export const collections = { blog };&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这个配置会对 Frontmatter 进行类型检查，如果字段不匹配会报错。&lt;/p&gt;&lt;/section&gt;&lt;section&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;把 Hexo 的 &lt;code&gt;source/_posts/&lt;/code&gt; 目录下的文章复制到 Astro 的 &lt;code&gt;src/content/blog/&lt;/code&gt;，然后批量替换 &lt;code&gt;date&lt;/code&gt; 为 &lt;code&gt;pubDate&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;find src/content/blog -name &quot;*.md&quot; -exec sed -i &apos;s/^date:/pubDate:/g&apos; {} +&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;图片处理有两种方式：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;方式1：放在 public/ 目录&lt;/strong&gt;（简单，推荐）&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cp -r hexo-blog/source/images astro-blog/public/images&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;文章里的图片路径不需要改。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;方式2：使用 Astro Image 组件&lt;/strong&gt;（性能更好）&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { Image } from &apos;astro:assets&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import myImage from &apos;../assets/pic.jpg&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;Image src={myImage} alt=&quot;描述&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;步骤3：URL 路径重定向&lt;a href=&quot;#步骤3url-路径重定向&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Hexo 默认路径是 &lt;code&gt;/YYYY/MM/DD/post-name/&lt;/code&gt;，Astro 默认是 &lt;code&gt;/blog/post-name/&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;如果想保持原来的路径格式，在 &lt;code&gt;astro.config.ts&lt;/code&gt; 中配置重定向：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;redirects: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;/:year/:month/:day/:slug&apos;: &apos;/blog/:slug&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;步骤4：RSS 全文输出配置&lt;a href=&quot;#步骤4rss-全文输出配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Hexo 默认输出全文 RSS，Astro 需要手动配置。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npx astro add rss&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;在 &lt;code&gt;src/pages/rss.xml.js&lt;/code&gt; 中配置：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import rss from &apos;@astrojs/rss&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { getCollection } from &apos;astro:content&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { marked } from &apos;marked&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export async function GET(context) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const posts = await getCollection(&apos;blog&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return rss({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title: &apos;我的博客&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description: &apos;博客描述&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;site: context.site,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;items: posts.map(post =&amp;gt; ({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title: post.data.title,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pubDate: post.data.pubDate,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;link: `/blog/${post.slug}/`,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;content: marked.parse(post.body), // 输出全文&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;从 Next.js 迁移的详细步骤&lt;a href=&quot;#从-nextjs-迁移的详细步骤&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Next.js 迁移到 Astro 稍微复杂一点，因为架构差异比较大。如果你用的是 Next.js 的 SSG 模式，迁移难度会小很多。&lt;/p&gt;&lt;section&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;strong&gt;关键差异&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Next.js 是单页应用（SPA），有一个全局的 &lt;code&gt;_app.js&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Astro 是多页网站（MPA），每个页面独立&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;相似之处&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;都支持 JSX 语法&lt;/li&gt;
&lt;li&gt;都使用文件系统路由&lt;/li&gt;
&lt;li&gt;都支持 SSG 和 SSR&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;从心理上做好准备：你不是在”迁移”一个 Next.js 应用，而是在用 Astro”重建”一个内容网站。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;步骤2：创建项目并安装 React 集成&lt;a href=&quot;#步骤2创建项目并安装-react-集成&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm create astro@latest my-blog&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd my-blog&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npx astro add react&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;安装 React 集成后，你可以继续使用现有的 React 组件。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;Astro 支持直接使用 &lt;code&gt;.jsx&lt;/code&gt; 和 &lt;code&gt;.tsx&lt;/code&gt; 文件，所以你的 React 组件可以直接复制过来。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Next.js 组件&lt;/strong&gt;（保持不变）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;components/Button.jsx&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default function Button({ children, onClick }) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return &amp;lt;button onClick={onClick}&amp;gt;{children}&amp;lt;/button&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;在 Astro 中使用&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import Button from &apos;../components/Button.jsx&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;Button client:load&amp;gt;点击我&amp;lt;/Button&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;注意 &lt;code&gt;client:load&lt;/code&gt; 指令，这告诉 Astro 这个组件需要 JavaScript（默认组件是静态的）。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;步骤4：从 React 组件转换为 Astro 组件&lt;a href=&quot;#步骤4从-react-组件转换为-astro-组件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;对于不需要交互的组件，建议转换为 Astro 组件，性能会更好。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Next.js/React 组件&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default function Card({ title, description }) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const formattedDate = new Date().toLocaleDateString();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;div className=&quot;card&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;h2&amp;gt;{title}&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;p&amp;gt;{description}&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;span&amp;gt;{formattedDate}&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Astro 组件&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const { title, description } = Astro.props;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const formattedDate = new Date().toLocaleDateString();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;div class=&quot;card&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;h2&amp;gt;{title}&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;p&amp;gt;{description}&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;span&amp;gt;{formattedDate}&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;主要区别：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;className&lt;/code&gt; → &lt;code&gt;class&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Props 从 &lt;code&gt;Astro.props&lt;/code&gt; 获取&lt;/li&gt;
&lt;li&gt;JavaScript 代码放在 &lt;code&gt;---&lt;/code&gt; 之间&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;步骤5：Hydration 策略调整&lt;a href=&quot;#步骤5hydration-策略调整&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Next.js 默认会给所有组件加 hydration（加载 JavaScript 使其可交互），Astro 默认不加。&lt;/p&gt;&lt;p&gt;你需要手动指定哪些组件需要交互：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Hydration 指令&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;client:load&lt;/code&gt; - 页面加载时立即 hydrate&lt;/li&gt;
&lt;li&gt;&lt;code&gt;client:idle&lt;/code&gt; - 页面空闲时 hydrate&lt;/li&gt;
&lt;li&gt;&lt;code&gt;client:visible&lt;/code&gt; - 组件进入视口时 hydrate&lt;/li&gt;
&lt;li&gt;&lt;code&gt;client:only&lt;/code&gt; - 只在客户端渲染&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import Counter from &apos;../components/Counter.jsx&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import HeavyChart from &apos;../components/HeavyChart.jsx&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- 立即交互 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;Counter client:load /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- 延迟加载，性能更好 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;HeavyChart client:visible /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这个策略非常重要，用好了能大幅提升性能。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;步骤6：动态路由处理&lt;a href=&quot;#步骤6动态路由处理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Next.js 的 &lt;code&gt;getStaticPaths&lt;/code&gt; 在 Astro 中也有对应的实现，语法几乎一样：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/pages/blog/[slug].astro&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { getCollection } from &apos;astro:content&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export async function getStaticPaths() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const posts = await getCollection(&apos;blog&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return posts.map(post =&amp;gt; ({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;params: { slug: post.slug },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;props: { post },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const { post } = Astro.props;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;h1&amp;gt;{post.data.title}&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;div set:html={post.body} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;步骤7：性能优化效果对比&lt;a href=&quot;#步骤7性能优化效果对比&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;迁移前（Next.js SSG）&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;PageSpeed Insights：85分&lt;/li&gt;
&lt;li&gt;首次加载 JS：~200KB&lt;/li&gt;
&lt;li&gt;Lighthouse Performance：80-90分&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;迁移后（Astro）&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;PageSpeed Insights：100分（每次都是）&lt;/li&gt;
&lt;li&gt;首次加载 JS：~10KB（如果没有交互组件，可以是0KB）&lt;/li&gt;
&lt;li&gt;Lighthouse Performance：95-100分&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;性能提升主要来自：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;移除了 React hydration 的开销&lt;/li&gt;
&lt;li&gt;CSS 内联化，减少网络请求&lt;/li&gt;
&lt;li&gt;按需加载 JavaScript&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;section&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;p&gt;&lt;strong&gt;阶段1：试点迁移&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;选择5-10篇文章试试水&lt;/li&gt;
&lt;li&gt;验证迁移流程是否顺畅&lt;/li&gt;
&lt;li&gt;测试性能提升效果&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;阶段2：全量迁移&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;阶段3：完善优化&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;添加缺失的功能&lt;/li&gt;
&lt;li&gt;性能优化&lt;/li&gt;
&lt;li&gt;SEO 检查&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;有位博主分享说，他一开始只将部分新文章用 Astro 写，旧文章保持不动。这种渐进式迁移的方式风险更小。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. SEO 保护措施&lt;a href=&quot;#2-seo-保护措施&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;迁移最怕的就是 SEO 受影响，这几点一定要做好：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;设置 301 重定向&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果 URL 结构变了，必须设置301重定向：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;vercel.json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;redirects&quot;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ &quot;source&quot;: &quot;/old-path/:slug&quot;, &quot;destination&quot;: &quot;/new-path/:slug&quot;, &quot;permanent&quot;: true }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// Cloudflare Pages: _redirects&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/old-path/:splat /new-path/:splat 301&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;更新 Sitemap&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npx astro add sitemap&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;在 &lt;code&gt;astro.config.mjs&lt;/code&gt; 配置：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { defineConfig } from &apos;astro/config&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import sitemap from &apos;@astrojs/sitemap&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;site: &apos;https://yourdomain.com&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;integrations: [sitemap()],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;提交给搜索引擎&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;迁移完成后，去 Google Search Console 和 Bing Webmaster Tools 提交新的 sitemap。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;Astro 有专门的图片优化组件，建议用起来：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npx astro add image&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;使用示例：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { Image } from &apos;astro:assets&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import cover from &apos;../assets/cover.jpg&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;Image src={cover} alt=&quot;封面图&quot; width={800} height={600} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;好处：自动生成多种尺寸、自动转换为 WebP 格式、懒加载。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;&lt;strong&gt;内容检查&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt; 所有文章都正常显示&lt;/li&gt;
&lt;li&gt; Frontmatter 字段完整&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; CSS 样式正确应用&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; RSS 订阅可用&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;SEO 检查&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt; Sitemap 正常生成&lt;/li&gt;
&lt;li&gt; robots.txt 正确&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;ul&gt;
&lt;li&gt; PageSpeed Insights 跑分&lt;/li&gt;
&lt;li&gt; Lighthouse 检查&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;常见问题和解决方案&lt;a href=&quot;#常见问题和解决方案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;strong&gt;问题：Could not find Sharp&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这是 Astro 图片优化的依赖问题。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 解决方案&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm install sharp&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果还是不行，在 &lt;code&gt;astro.config.mjs&lt;/code&gt; 中禁用图片优化：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;image: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;service: { entrypoint: &apos;astro/assets/services/noop&apos; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;问题：MDX 版本不兼容&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你用的是 Astro 5.0，必须升级 &lt;code&gt;@astrojs/mdx&lt;/code&gt; 到 v4.0.0：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm install @astrojs/mdx@latest&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;strong&gt;问题：CSS 作用域导致样式不生效&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Astro 的 &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; 标签默认是作用域样式（scoped），只对当前组件生效。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- 局部样式 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;style&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.card { color: blue; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- 全局样式 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;style is:global&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.card { color: blue; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;问题：Markdown 内容样式丢失&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Markdown 渲染的 HTML 需要全局样式：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;style is:global&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.prose h1 { font-size: 2rem; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.prose h2 { font-size: 1.5rem; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.prose p { margin: 1rem 0; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.prose code { background: #f4f4f4; padding: 0.2rem 0.4rem; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;article class=&quot;prose&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;Content /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;p&gt;&lt;strong&gt;Vercel 部署&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;直接连接 GitHub 仓库，Vercel 会自动识别 Astro 项目。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Cloudflare Pages 部署&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;构建配置：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Build command: &lt;code&gt;npm run build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Build output directory: &lt;code&gt;dist&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Node.js version: 18 或更高&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;迁移到 Astro 真没那么可怕。根据我收集的开发者经验，大部分人都能在1-3天内完成迁移，而且效果都很满意。&lt;/p&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;：创建 git 分支，确保随时可以回退&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;渐进式迁移&lt;/strong&gt;：先试点几篇文章，验证流程后再全量迁移&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重视 SEO&lt;/strong&gt;：设置301重定向，更新sitemap，保护搜索排名&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;测试充分&lt;/strong&gt;：上线前检查链接、图片、功能是否正常&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;享受收益&lt;/strong&gt;：迁移后的性能提升是实打实的，PageSpeed Insights 轻松100分&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;如果你现在正在犹豫要不要迁移，不妨先创建一个测试分支试试。挑几篇文章迁移过去，跑个性能测试，看看效果。如果满意，再全量迁移；如果不满意，也没有任何损失。&lt;/p&gt;&lt;p&gt;资源：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.astro.build/&quot; target=&quot;_blank&quot;&gt;Astro 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://astro.build/chat&quot; target=&quot;_blank&quot;&gt;Astro Discord 社区&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://astro.build/themes/&quot; target=&quot;_blank&quot;&gt;Astro 主题库&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Astro i18n 多语言配置 30分钟实战指南</title><link>https://blog.moewah.com/posts/astro-i18n-multilingual-setup-30-minute-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/astro-i18n-multilingual-setup-30-minute-guide/</guid><description>如何在 Astro 中快速实现多语言支持？本文详解 i18n 配置、路由策略和语言切换器开发，手把手教你30分钟搭建支持中英日的多语言网站，解决 Content Collections 和路径前缀等核心问题。</description><pubDate>Sun, 28 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;第一次配 Astro i18n 的时候，花了整整一下午研究 &lt;code&gt;prefixDefaultLocale&lt;/code&gt; 到底该选 true 还是 false。后来才发现，Astro 的 i18n 配置其实没那么复杂，只是官方文档写得太技术化了。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;Astro i18n 基础配置&lt;a href=&quot;#astro-i18n-基础配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;astro.config.mjs 配置&lt;a href=&quot;#astroconfigmjs-配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Astro v4.0 开始内置了 i18n 支持。打开你的 &lt;code&gt;astro.config.mjs&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;astro.config.mjs&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&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;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro/config&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 告诉 Astro 你的网站支持哪些语言&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&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;&apos;&lt;/span&gt;&lt;span&gt;en&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;zh-cn&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;ja&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 默认语言（必须是 locales 里的某一个）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;en&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;// 是否给默认语言加路径前缀&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;prefixDefaultLocale&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;locales&lt;/strong&gt; - 网站支持的所有语言。用标准的语言代码，比如 &lt;code&gt;&apos;en&apos;&lt;/code&gt;（英文）、&lt;code&gt;&apos;zh-cn&apos;&lt;/code&gt;（简体中文）、&lt;code&gt;&apos;ja&apos;&lt;/code&gt;（日文）。如果想做更细的语言区分，也可以写成 &lt;code&gt;&apos;en-US&apos;&lt;/code&gt;、&lt;code&gt;&apos;en-GB&apos;&lt;/code&gt; 这样。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;defaultLocale&lt;/strong&gt; - 默认语言，访客第一次来你网站时看到的语言。这个值必须是 locales 数组里的某一个，不然 Astro 会报错。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;prefixDefaultLocale&lt;/strong&gt; - 设置成 &lt;code&gt;false&lt;/code&gt; 的话，默认语言的 URL 不带语言前缀（比如 &lt;code&gt;/about&lt;/code&gt;），其他语言才带（比如 &lt;code&gt;/zh-cn/about&lt;/code&gt;、&lt;code&gt;/ja/about&lt;/code&gt;）。设置成 &lt;code&gt;true&lt;/code&gt; 的话，所有语言都带前缀（&lt;code&gt;/en/about&lt;/code&gt;、&lt;code&gt;/zh-cn/about&lt;/code&gt;）。&lt;/p&gt;&lt;p&gt;大多数情况下用 &lt;code&gt;false&lt;/code&gt; 就够了，这样默认语言的 URL 更简洁。&lt;/p&gt;&lt;/section&gt;&lt;section&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;URL 形式示例&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;策略 1：默认语言不带前缀&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;prefixDefaultLocale: false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/about&lt;/code&gt;  &lt;br /&gt;&lt;code&gt;/zh-cn/about&lt;/code&gt;  &lt;br /&gt;&lt;code&gt;/ja/about&lt;/code&gt;&lt;/td&gt;&lt;td&gt;大多数网站（推荐）&lt;/td&gt;&lt;td&gt;✅ 默认语言 URL 简洁  &lt;br /&gt;❌ URL 格式不统一&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;策略 2：所有语言都带前缀&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;prefixDefaultLocale: true&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/en/about&lt;/code&gt;  &lt;br /&gt;&lt;code&gt;/zh-cn/about&lt;/code&gt;  &lt;br /&gt;&lt;code&gt;/ja/about&lt;/code&gt;&lt;/td&gt;&lt;td&gt;需要 URL 统一性  &lt;br /&gt;或特殊 SEO 需求&lt;/td&gt;&lt;td&gt;✅ URL 格式统一  &lt;br /&gt;✅ 语言切换逻辑简单  &lt;br /&gt;❌ 默认语言 URL 略长&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;策略 3：手动模式&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;routing: &apos;manual&apos;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;完全自定义&lt;/td&gt;&lt;td&gt;复杂的多语言需求  &lt;br /&gt;需要完全控制路由&lt;/td&gt;&lt;td&gt;✅ 灵活度高  &lt;br /&gt;❌ 配置复杂，需要自己处理很多逻辑&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;如果你的项目比较简单（比如博客、文档站），直接用策略 1 就好。想要 URL 整齐一点就用策略 2。策略 3 是给那些有特殊需求的项目准备的。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;多语言内容组织&lt;a href=&quot;#多语言内容组织&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;src/pages/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── about.astro        # 默认语言（假设是中文）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── blog.astro&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── index.astro&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── en/                # 英文版本&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── about.astro&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── blog.astro&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   └── index.astro&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└── ja/                # 日文版本&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├── about.astro&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├── blog.astro&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└── index.astro&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果你用的是 &lt;code&gt;prefixDefaultLocale: false&lt;/code&gt;，默认语言的文件就直接放在 &lt;code&gt;pages&lt;/code&gt; 根目录下。其他语言才需要创建对应的子文件夹。&lt;/p&gt;&lt;p&gt;这种方案的好处是结构清晰，每个语言的页面独立，改起来不会互相影响。缺点是如果页面多了，会有大量重复的文件和代码。比如你有 20 个页面、支持 5 种语言，那就得维护 100 个文件。&lt;/p&gt;&lt;/section&gt;&lt;section&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;如果你觉得方案 1 太繁琐，可以试试动态路由：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;src/pages/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└── [lang]/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└── [...slug].astro&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后在 &lt;code&gt;[...slug].astro&lt;/code&gt; 里根据 &lt;code&gt;lang&lt;/code&gt; 参数动态渲染内容：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/pages/[lang]/[...slug].astro&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getStaticPaths&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&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;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;zh-cn&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;en&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;ja&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;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;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;about&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;blog&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;contact&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&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;flatMap&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;slugs&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;&lt;span&gt;slug&lt;/span&gt;&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt;{&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; &lt;/span&gt;&lt;span&gt;slug&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&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;lang&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;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Astro&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 根据 lang 和 slug 加载对应的内容&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这种方案代码复用性高，维护成本低，但需要你理解 Astro 的动态路由逻辑。如果你是 Astro 新手，建议先用方案 1。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Content Collections 多语言方案&lt;a href=&quot;#content-collections-多语言方案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;对博客来说，Content Collections 才是重点。&lt;/p&gt;&lt;p&gt;目录结构：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;src/content/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└── blog/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├── en/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│   ├── post-1.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│   └── post-2.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├── zh-cn/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│   ├── post-1.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│   └── post-2.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└── ja/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├── post-1.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└── post-2.md&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;在 &lt;code&gt;src/content/config.ts&lt;/code&gt; 里定义 schema：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/content/config.ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&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;z&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro:content&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;blogCollection&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&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;z&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;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&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;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&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;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;enum&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;en&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;zh-cn&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;ja&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&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;collections&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;blog&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;blogCollection&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;在页面里获取对应语言的文章：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/pages/blog/index.astro&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;getCollection&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro:content&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;currentLang&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Astro&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;currentLocale&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;posts&lt;/span&gt;&lt;span&gt; &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; &lt;/span&gt;&lt;span&gt;getCollection&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;blog&lt;/span&gt;&lt;span&gt;&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;data&lt;/span&gt;&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;gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&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;&lt;span&gt;lang&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;currentLang&lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;UI 翻译文件管理&lt;a href=&quot;#ui-翻译文件管理&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/i18n/ui.ts&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&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;ui&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;en&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;nav.home&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;Home&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;nav.about&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;About&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;nav.blog&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;Blog&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;btn.readMore&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;Read More&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;zh-cn&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;nav.home&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;首页&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;nav.about&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;关于&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;nav.blog&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;博客&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;btn.readMore&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;阅读更多&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;ja&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;nav.home&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;ホーム&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;nav.about&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;概要&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;nav.blog&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;ブログ&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;btn.readMore&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;続きを読む&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&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;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;两个辅助函数：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/i18n/utils.ts&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ui&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;./ui&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 从 URL 获取当前语言&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getLangFromUrl&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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;URL&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&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;lang&lt;/span&gt;&lt;span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;pathname&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;split&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&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;lang&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ui&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&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;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;keyof&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;typeof&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ui&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;zh-cn&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 获取翻译函数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;useTranslations&lt;/span&gt;&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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;keyof&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;typeof&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ui&lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&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;&lt;span&gt;key&lt;/span&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;keyof&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;typeof&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ui&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span&gt;typeof&lt;/span&gt;&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;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ui&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;key&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ui&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;zh-cn&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;在组件里用：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 某个组件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;getLangFromUrl&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;useTranslations&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;@/i18n/utils&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&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;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getLangFromUrl&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Astro&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;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&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;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;useTranslations&lt;/span&gt;&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;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;nav&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&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; &lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&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;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;nav.home&lt;/span&gt;&lt;span&gt;&apos;&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;a&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&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; &lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/about&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&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;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;nav.about&lt;/span&gt;&lt;span&gt;&apos;&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;a&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&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; &lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/blog&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&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;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;nav.blog&lt;/span&gt;&lt;span&gt;&apos;&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;a&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;nav&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;实现语言切换器&lt;a href=&quot;#实现语言切换器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Astro i18n helper 函数&lt;a href=&quot;#astro-i18n-helper-函数&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;getRelativeLocaleUrl(locale, path)&lt;/strong&gt; - 获取某个语言的相对路径：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;getRelativeLocaleUrl&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro:i18n&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&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;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getRelativeLocaleUrl&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;en&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;about&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 返回：&apos;/en/about&apos; 或 &apos;/about&apos;（取决于你的配置）&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;getAbsoluteLocaleUrl(locale, path)&lt;/strong&gt; - 获取绝对路径：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;getAbsoluteLocaleUrl&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro:i18n&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&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;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getAbsoluteLocaleUrl&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;en&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;about&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 返回：&apos;https://example.com/en/about&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Astro.currentLocale&lt;/strong&gt; - 获取当前页面的语言：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;currentLang&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Astro&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;currentLocale&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 返回：&apos;zh-cn&apos;、&apos;en&apos; 等&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Astro.preferredLocale&lt;/strong&gt; - 获取用户浏览器的首选语言：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;browserLang&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Astro&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;preferredLocale&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 返回：用户浏览器设置的语言（如果在你的 locales 里）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/components/LanguageSwitcher.astro&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;getRelativeLocaleUrl&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro:i18n&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;zh-cn&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;简体中文&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;en&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;English&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;ja&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;日本語&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;currentLang&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Astro&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;currentLocale&lt;/span&gt;&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;&lt;/span&gt;&lt;span&gt;zh-cn&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;currentPath&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Astro&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;pathname&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;currentLang&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&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;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;^&lt;/span&gt;&lt;span&gt;&lt;span&gt;\/&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&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;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;language-switcher&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;lang-button&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&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;currentLang&lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;lang-dropdown&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&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;entries&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;map&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&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; &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;=&amp;gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;const&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;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getRelativeLocaleUrl&lt;/span&gt;&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; &lt;/span&gt;&lt;span&gt;currentPath&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;          &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;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&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;===&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;currentLang&lt;/span&gt;&lt;span&gt; &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;&lt;/span&gt;&lt;span&gt;active&lt;/span&gt;&lt;span&gt;&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;&apos;&apos;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&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;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;language-switcher&lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;position&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;relative&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;inline-block&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lang-button&lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;padding&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;8&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;16&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;background&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;f3f4f6&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;border&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;px&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;solid&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;d1d5db&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;border-radius&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;px&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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; &lt;/span&gt;&lt;span&gt;pointer&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lang-button&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;hover&lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;background&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;e5e7eb&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;51&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;52&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;53&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lang-dropdown&lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;54&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;none&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;55&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;position&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;absolute&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;56&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;top&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;57&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;right&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;58&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;margin-top&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;px&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;59&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;background&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;white&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;60&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;border&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;px&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;solid&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;d1d5db&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;61&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;border-radius&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;px&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;62&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;box-shadow&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;&lt;span&gt;4&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;6&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rgba&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;0.1&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;63&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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; &lt;/span&gt;&lt;span&gt;&lt;span&gt;150&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;64&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;65&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;66&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;language-switcher&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;hover&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lang-dropdown&lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;67&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;block&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;68&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;69&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;70&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lang-dropdown&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;71&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;block&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;72&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;padding&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;10&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;16&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;73&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;374151&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;74&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;text-decoration&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;none&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;75&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;transition&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;background&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;0.2&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;76&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;77&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;78&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lang-dropdown&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;hover&lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;79&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;background&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;f3f4f6&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;80&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;81&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;82&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lang-dropdown&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;active&lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;83&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;background&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;dbeafe&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;84&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;1e40af&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;85&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;font-weight&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;500&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;86&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;87&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;88&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;89&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;90&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;document&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;querySelector&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;.lang-button&lt;/span&gt;&lt;span&gt;&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;addEventListener&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;click&lt;/span&gt;&lt;span&gt;&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;e&lt;/span&gt;&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;91&lt;/div&gt;&lt;/div&gt;&lt;div&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;stopPropagation&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;92&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dropdown&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;document&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;querySelector&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;.lang-dropdown&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;93&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;dropdown&lt;/span&gt;&lt;span&gt;?.&lt;/span&gt;&lt;span&gt;classList&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toggle&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;show&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;94&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;95&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;96&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;document&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;addEventListener&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;click&lt;/span&gt;&lt;span&gt;&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;=&amp;gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;97&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;document&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;querySelector&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;.lang-dropdown&lt;/span&gt;&lt;span&gt;&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;classList&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;remove&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;show&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;98&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;99&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;使用的时候，在你的 Layout 或导航栏里引入：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/layouts/Layout.astro&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;LanguageSwitcher&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;@/components/LanguageSwitcher.astro&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;header&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;nav&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;LanguageSwitcher&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;nav&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;header&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这个组件的核心逻辑是：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;获取当前语言和当前路径&lt;/li&gt;
&lt;li&gt;为每种支持的语言生成对应的 URL&lt;/li&gt;
&lt;li&gt;高亮显示当前语言&lt;/li&gt;
&lt;li&gt;点击切换到对应语言的页面&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/middleware.ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;defineMiddleware&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro:middleware&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&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;onRequest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineMiddleware&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;next&lt;/span&gt;&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&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;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;context&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;currentLocale&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;currentLocale&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;preferredLocale&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;preferredLocale&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&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;url&lt;/span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;preferredLocale&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;preferredLocale&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;!==&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;currentLocale&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;redirect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;preferredLocale&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;next&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;更好的方式是结合 Cookie 记住用户的选择：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&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;onRequest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;defineMiddleware&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;next&lt;/span&gt;&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&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;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;context&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;currentLocale&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;currentLocale&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;preferredLocale&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;preferredLocale&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;savedLang&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;cookies&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;user-lang&lt;/span&gt;&lt;span&gt;&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;value&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&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;savedLang&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;savedLang&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;!==&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;currentLocale&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&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;&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;&apos;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;redirect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;savedLang&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt;savedLang&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&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;&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;&apos;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;preferredLocale&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;preferredLocale&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;!==&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;currentLocale&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;cookies&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;user-lang&lt;/span&gt;&lt;span&gt;&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;preferredLocale&lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&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;&apos;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;maxAge&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;31536000&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;redirect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;preferredLocale&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;next&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;然后在语言切换器里，切换语言时也更新 Cookie：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;document&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;querySelectorAll&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;.lang-dropdown a&lt;/span&gt;&lt;span&gt;&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;forEach&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; &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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&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;addEventListener&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;click&lt;/span&gt;&lt;span&gt;&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;e&lt;/span&gt;&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;const&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;=&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;target&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getAttribute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;data-lang&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;document&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;cookie&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;user-lang=&lt;/span&gt;&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;&lt;span&gt;; path=/; max-age=31536000&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;进阶技巧&lt;a href=&quot;#进阶技巧&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Fallback 策略配置&lt;a href=&quot;#fallback-策略配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;假设你在逐步翻译网站内容，有些页面的日文版还没翻译完：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;astro.config.mjs&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&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;&apos;&lt;/span&gt;&lt;span&gt;en&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;zh-cn&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;ja&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;en&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fallback&lt;/span&gt;&lt;span&gt;:&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&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;&apos;&lt;/span&gt;&lt;span&gt;en&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;zh-cn&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;en&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这样配置后，如果 &lt;code&gt;/ja/some-page&lt;/code&gt; 不存在，Astro 会自动显示 &lt;code&gt;/en/some-page&lt;/code&gt; 的内容，而不是 404 页面。&lt;/p&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;astro.config.mjs&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt;&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;// 必须启用 SSR&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;adapter&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;node&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&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;&apos;&lt;/span&gt;&lt;span&gt;en&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;zh-cn&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;ja&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;en&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;domains&lt;/span&gt;&lt;span&gt;:&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;zh-cn&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;https://example.cn&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&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;&apos;&lt;/span&gt;&lt;span&gt;https://example.jp&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;域名映射只在 SSR 模式下可用。静态网站用不了这个功能。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;SEO 优化要点&lt;a href=&quot;#seo-优化要点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;在 Layout 中添加 hreflang 标签&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/layouts/Layout.astro&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;getAbsoluteLocaleUrl&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro:i18n&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&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;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;en&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;zh-cn&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;ja&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;currentPath&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Astro&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;pathname&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&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&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;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;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;replace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;^&lt;/span&gt;&lt;span&gt;&lt;span&gt;\/&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&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;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;html&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;head&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&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;map&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&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; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;rel&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;alternate&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;hreflang&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&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;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &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;&lt;/span&gt;&lt;span&gt;getAbsoluteLocaleUrl&lt;/span&gt;&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; &lt;/span&gt;&lt;span&gt;currentPath&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;rel&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;alternate&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;hreflang&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;x-default&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &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;getAbsoluteLocaleUrl&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;en&lt;/span&gt;&lt;span&gt;&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;currentPath&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rel&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;canonical&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &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;getAbsoluteLocaleUrl&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;currentLang&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;currentPath&lt;/span&gt;&lt;span&gt;)&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;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;head&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;html&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;sitemap.xml 多语言配置&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sitemap&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;@astrojs/sitemap&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;https://example.com&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;integrations&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;sitemap&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;本地化 meta 信息&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&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;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;en&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&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;&apos;&lt;/span&gt;&lt;span&gt;Welcome to My Blog&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&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;&apos;&lt;/span&gt;&lt;span&gt;A blog about web development&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;zh-cn&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&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;&apos;&lt;/span&gt;&lt;span&gt;欢迎来到我的博客&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&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;&apos;&lt;/span&gt;&lt;span&gt;一个关于 Web 开发的博客&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;currentLang&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Astro&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;currentLocale&lt;/span&gt;&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;&lt;/span&gt;&lt;span&gt;en&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;head&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&amp;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;currentLang&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;&amp;lt;/&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;meta&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;&quot;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&quot;&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;meta&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;currentLang&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;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;head&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;prefixDefaultLocale&lt;/code&gt; 设置错了，导致默认语言的 URL 变成了 &lt;code&gt;/en/about&lt;/code&gt; 而不是 &lt;code&gt;/about&lt;/code&gt;。后来才发现应该设成 &lt;code&gt;false&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;还有一次忘记在 Content Collections 的 schema 里加 &lt;code&gt;lang&lt;/code&gt; 字段，结果 &lt;code&gt;getCollection&lt;/code&gt; 取不到当前语言的文章。排查了半天才发现 schema 没定义好。&lt;/p&gt;&lt;p&gt;语言切换器也踩过坑。一开始用的是硬编码的路径，切换语言后总是跳回首页。后来才改用 &lt;code&gt;getRelativeLocaleUrl(lang, currentPath)&lt;/code&gt;，这样就能保持在同一个页面切换语言了。&lt;/p&gt;&lt;p&gt;SEO 这块也容易忘。加了多语言但忘记加 &lt;code&gt;hreflang&lt;/code&gt; 标签，Google 搜不同语言时总会显示错误的语言版本。后来记得在每个页面的 &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 里加上完整的 &lt;code&gt;hreflang&lt;/code&gt; 标签就好了。&lt;/p&gt;&lt;p&gt;Astro 的 i18n 配置其实挺方便的，配置简单，helper 函数好用，性能也不错（所有语言的路由都会在构建时预生成）。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Python 虚拟环境 venv 创建保姆级教程</title><link>https://blog.moewah.com/posts/python-venv-virtual-environment-tutorial/</link><guid isPermaLink="true">https://blog.moewah.com/posts/python-venv-virtual-environment-tutorial/</guid><description>如何避免Python包版本冲突？本文详细讲解使用venv创建隔离环境的完整流程，涵盖环境搭建、激活、依赖管理及清理，帮助开发者高效管理项目环境。</description><pubDate>Sun, 07 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;既然我们要开始聊 Python 开发，有一个痛点我们肯定都会遇到：系统里通常只装了一个 Python 3 版本，所有的第三方包都会被 &lt;code&gt;pip&lt;/code&gt; 塞进同一个 &lt;code&gt;site-packages&lt;/code&gt; 目录下。&lt;/p&gt;
&lt;p&gt;想象一下，如果我们同时开发两个项目，应用 A 必须用 Jinja 2.7，而应用 B 却依赖老旧的 Jinja 2.6，这时候系统里的 Python 就会左右为难。为了解决这种版本打架的问题，我们必须为每个应用创建一套“隔离”的 Python 运行环境。&lt;/p&gt;
&lt;p&gt;今天我们就以创建一个 &lt;code&gt;newproject&lt;/code&gt; 为例，看看我们如何利用内置的 &lt;code&gt;venv&lt;/code&gt; 模块来打造这个独立的小世界。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;1. 建立项目阵地&lt;a href=&quot;#1-建立项目阵地&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;首先，我们先创建一个存放代码的文件夹。打开终端或命令行，执行以下操作：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir newproject&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd newproject&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;2. 搭建隔离环境&lt;a href=&quot;#2-搭建隔离环境&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在 &lt;code&gt;newproject&lt;/code&gt; 目录下，我们直接调用 Python 的 &lt;code&gt;venv&lt;/code&gt; 模块来初始化环境。我们习惯把这个环境起名叫 &lt;code&gt;.venv&lt;/code&gt;，这样它在项目里就是一个隐藏文件夹。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 执行这条命令后，Python 会把一套完整的运行环境拷贝到 .venv 文件夹里&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;python -m venv .venv&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;3. “进入”我们的虚拟环境&lt;a href=&quot;#3-进入我们的虚拟环境&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;环境建好了，但我们还没进去。我们需要通过“激活（activate）”脚本，让当前的终端识别这个隔离环境。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;如果我们在 Windows 平台上：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CMD:&lt;/strong&gt; &lt;code&gt;.venv\Scripts\activate&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;PowerShell:&lt;/strong&gt; &lt;code&gt;.\.venv\Scripts\Activate.ps1&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;如果我们在 macOS 或 Linux 上：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;source .venv/bin/activate&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;重点观察：&lt;/strong&gt; 激活成功后，我们的命令行提示符前会多出一个 &lt;code&gt;(.venv)&lt;/code&gt; 字样。这意味着从现在起，我们所有的 &lt;code&gt;pip install&lt;/code&gt; 操作都只会影响这个 &lt;code&gt;newproject&lt;/code&gt;，而不会动系统全局的 Python。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;4. 管理依赖包&lt;a href=&quot;#4-管理依赖包&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;p&gt;&lt;strong&gt;定向安装：&lt;/strong&gt; &lt;code&gt;pip install jinja2==2.7&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;导出清单：&lt;/strong&gt; 当我们把环境配好后，记得运行 &lt;code&gt;pip freeze &amp;gt; requirements.txt&lt;/code&gt;。这份清单就是我们项目的“配方”，别人拿到代码后，只需 &lt;code&gt;pip install -r requirements.txt&lt;/code&gt; 就能完美复刻我们的环境。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;5. 退出与销毁&lt;a href=&quot;#5-退出与销毁&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;当我们忙完 &lt;code&gt;newproject&lt;/code&gt; 的活儿，想切换回系统环境或者去干别的，流程也非常简单。&lt;/p&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;deactivate&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;你会发现前面的 &lt;code&gt;(.venv)&lt;/code&gt; 消失了，一切恢复如初。&lt;/p&gt;&lt;/section&gt;&lt;section&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;code&gt;venv&lt;/code&gt; 没有任何系统残留，它就是一个纯粹的文件夹。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;手动：&lt;/strong&gt; 在文件管理器里右键删除 &lt;code&gt;.venv&lt;/code&gt; 文件夹。&lt;/p&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;p&gt;&lt;strong&gt;Windows:&lt;/strong&gt; &lt;code&gt;rd /s /q .venv&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;macOS/Linux:&lt;/strong&gt; &lt;code&gt;rm -rf .venv&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;venv&lt;/code&gt;为应用提供了隔离的Python运行环境，解决了不同应用间安装多版本的冲突问题。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>告别信息噪音：我的高效笔记整理术</title><link>https://blog.moewah.com/posts/efficient-note-organization-method/</link><guid isPermaLink="true">https://blog.moewah.com/posts/efficient-note-organization-method/</guid><description>如何摆脱每日笔记的信息噪音？本文分享通过月度整理，将碎片化记录转化为结构化知识体系的实战方法，帮助你建立高效笔记系统，提升个人认知与信息管理能力。</description><pubDate>Mon, 01 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在信息爆炸的时代，如何有效管理个人知识变得尤为重要。最近，我撰写了一篇文章，探讨了&lt;strong&gt;不再将每日笔记视为永久记录&lt;/strong&gt;的理念。受此启发，我开始着手回顾并系统地整理我以往的每日笔记。以下，我将详细分享我的整理方法及其带来的深远益处。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;一、我的笔记整理实践流程 🔄&lt;a href=&quot;#一我的笔记整理实践流程-&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;ul&gt;
&lt;li&gt;首先，我为每个月创建一份专属的&lt;strong&gt;月度笔记&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;这份模板设计简洁，仅包含三个核心标题：&lt;strong&gt;“发生了什么”&lt;/strong&gt;、&lt;strong&gt;“主题”&lt;strong&gt;和&lt;/strong&gt;“跟踪”&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;ul&gt;
&lt;li&gt;我采用分屏视图：左侧显示当月的第一份每日笔记，右侧显示月度笔记。&lt;/li&gt;
&lt;li&gt;我会逐条审阅每日笔记中的每一项要点，评估其价值。&lt;/li&gt;
&lt;li&gt;对于那些仅是随手记录的观察、简短的状态更新，或已失去关联性的内容，我会果断&lt;strong&gt;删除&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;如果每日笔记中记录了&lt;strong&gt;值得珍藏的重要事件&lt;/strong&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;/section&gt;&lt;section&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;ul&gt;
&lt;li&gt;当每日笔记记录的并非事件本身，而是&lt;strong&gt;富有价值的想法或独到见解&lt;/strong&gt;时，我会为这些想法&lt;strong&gt;创建新的原子笔记&lt;/strong&gt;，或将其&lt;strong&gt;整合&lt;/strong&gt;到已有的相关原子笔记中。&lt;/li&gt;
&lt;li&gt;随后，我只需将这些原子笔记的链接放置在月度笔记的**“主题”**标题下，方便日后查阅和发展。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. 📚 统一归档“追踪器”内容&lt;a href=&quot;#5--统一归档追踪器内容&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;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6. ✅ 完成与循环&lt;a href=&quot;#6--完成与循环&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;/li&gt;
&lt;li&gt;接着，我打开下一条每日笔记，&lt;strong&gt;重复&lt;/strong&gt;上述所有步骤，直到当月的所有每日笔记都被整理完毕。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;section&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;ul&gt;
&lt;li&gt;每日笔记在捕捉即时想法时效率很高，但若不加整理，长此以往便会堆积成巨大的信息噪音。&lt;/li&gt;
&lt;li&gt;通过月度整理，我的信息库变得&lt;strong&gt;更加简洁、条理清晰&lt;/strong&gt;。它不仅提升了信息检索效率，还为我保留了一份清晰的时间线，作为珍贵的&lt;strong&gt;历史记录&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;ul&gt;
&lt;li&gt;这个过程极大地促进了我&lt;strong&gt;创建有价值的“原子笔记”&lt;/strong&gt;。在此之前，我在这方面做得远远不够。&lt;/li&gt;
&lt;li&gt;在接触“原子笔记”概念的两年间，我发现过去很多笔记仅仅是记录了现实世界中的“概念”或“事物”，而非真正源于我自身的洞察。我曾过于安于现状，只是将所有好的见解或转瞬即逝的想法记在日常笔记中，未能进一步发展。&lt;/li&gt;
&lt;li&gt;现在，我投入时间为这些想法&lt;strong&gt;创建独立的笔记&lt;/strong&gt;，赋予它们合适的标题，并根据需要添加标签和链接，使其成为真正可复用、可连接的知识单元。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;回顾并整理旧笔记，让我深刻意识到&lt;strong&gt;带着对未来的憧憬去记笔记&lt;/strong&gt;是多么重要。&lt;/li&gt;
&lt;li&gt;我发现过去很多笔记是这样的：“读了一篇关于某某的超棒文章，太鼓舞人心了。”然后附上文章链接。几个月后，这些笔记对我而言几乎毫无价值，它们只是一个指向我可能已不记得内容的“书签”。&lt;/li&gt;
&lt;li&gt;我意识到，当时我应该花几分钟&lt;strong&gt;记录下文章的精髓、引发我共鸣的观点以及激发我的新想法&lt;/strong&gt;。我希望通过这种整理实践，能激励我养成更&lt;strong&gt;自律且更具前瞻性&lt;/strong&gt;的笔记习惯，让未来的我能从今天的知识积累中持续受益。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;/section&gt;</content:encoded></item><item><title>Astro页面过渡2行代码实现APP级丝滑体验</title><link>https://blog.moewah.com/posts/astro-view-transitions-2-line-code-smooth-experience/</link><guid isPermaLink="true">https://blog.moewah.com/posts/astro-view-transitions-2-line-code-smooth-experience/</guid><description>如何让Astro网站像App一样流畅？本文详解View Transitions API在Astro中的3种实现方法，从2行代码到高级自定义，手把手教你打造平滑页面切换效果，解决白屏跳转痛点。</description><pubDate>Wed, 26 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;你是不是也遇到过这样的尴尬：辛辛苦苦用 Astro 搭了个博客，设计、排版都挺用心，但点击链接的时候，整个页面突然白屏一闪，然后才加载出新页面。这种感觉就像从 iPhone 的流畅动画突然切换到 Windows 98 的生硬跳转。&lt;/p&gt;
&lt;p&gt;去年帮朋友做网站的时候，他看了别人的作品集网站后问我：“为啥人家点击项目的时候，图片会平滑地放大过渡？咱们这个怎么就是生硬地刷新一下？“我当时有点尴尬，心想难道得重写成 React SPA 吗？那 Astro 的静态生成优势不就没了？&lt;/p&gt;
&lt;p&gt;直到我发现了 &lt;strong&gt;View Transitions API&lt;/strong&gt; + Astro 的组合。第一次用的时候我真的惊呆了——只需要在 Layout 组件的 &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 里加2行代码，页面切换瞬间就变成了丝滑的过渡动画。不需要 React、不需要 Vue，甚至连 JavaScript 库都不用装。&lt;/p&gt;
&lt;p&gt;这篇文章我会手把手教你：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;View Transitions API 是什么，为什么2025年它突然火了（浏览器支持率超过85%）&lt;/li&gt;
&lt;li&gt;在 Astro 里启用页面过渡的3种方法（从最简单的2行代码到高级自定义）&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;section&gt;&lt;h2&gt;什么是 View Transitions API？为什么它这么香？&lt;a href=&quot;#什么是-view-transitions-api为什么它这么香&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;View Transitions API 是浏览器提供的原生功能，简单来说就是：你告诉浏览器”我要换内容了”，它会自动帮你拍两张”照片”（旧页面一张，新页面一张），然后自动生成从旧照片到新照片的平滑动画。&lt;/p&gt;&lt;p&gt;举个例子：假设你的博客首页有篇文章标题叫”Astro 教程”，点击后跳转到文章详情页。传统的跳转是：首页消失 → 白屏 → 详情页出现。而用了 View Transitions 之后，浏览器会识别出首页和详情页的标题是”同一个元素”，然后让标题平滑地从列表位置移动到详情页顶部，同时其他内容淡入淡出。&lt;/p&gt;&lt;p&gt;最香的点是：&lt;strong&gt;这些动画都是浏览器自动生成的&lt;/strong&gt;，你不需要写复杂的 CSS 动画或者引入什么 GSAP、Framer Motion 之类的库。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;为什么不用 React/Vue 也能做出 SPA 的效果？&lt;a href=&quot;#为什么不用-reactvue-也能做出-spa-的效果&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;说到页面切换动画，很多人第一反应是”那得用 React Router 啊”或者”得上 Vue Router 配合 transition 组件”。但这些方案有个共同的缺点：&lt;strong&gt;重&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;传统 SPA 框架要实现页面过渡，需要：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;整个应用变成单页面，所有路由由 JavaScript 控制&lt;/li&gt;
&lt;li&gt;打包体积变大，首屏加载变慢&lt;/li&gt;
&lt;li&gt;SEO 要单独处理（虽然现在好多了）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;而 Astro + View Transitions 的组合就优雅多了：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;保持多页面架构（MPA）&lt;/strong&gt;：每个页面都是独立的 HTML，SEO 天然友好&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;按需加载&lt;/strong&gt;：只加载当前页面需要的 JS 和 CSS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;原生 API&lt;/strong&gt;：性能开销极小，不增加打包体积&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;渐进增强&lt;/strong&gt;：不支持的浏览器自动降级到普通跳转，不影响功能&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我之前做过测试，同样一个博客网站，React SPA 版本打包后 300KB+，Astro 版本只有 50KB 左右，而且加上 View Transitions 之后体积基本没变。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2025年的浏览器支持情况：可以放心用了&lt;a href=&quot;#2025年的浏览器支持情况可以放心用了&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;2025年，View Transitions API 的浏览器支持率已经超过 85%&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;具体来说：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Chrome 111+&lt;/strong&gt;：支持同文档过渡（在同一个页面内切换状态）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chrome 126+&lt;/strong&gt;：支持跨文档过渡（在不同页面之间跳转）——这就是我们在 Astro 里用的&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Safari&lt;/strong&gt;：已经支持&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Edge&lt;/strong&gt;：基于 Chromium，完全支持&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Firefox 144+&lt;/strong&gt;（2025年10月发布）：View Transitions 是 Interop 2025 的重点项目，Firefox 终于跟上了&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;连 React 团队都在 2025 年把 View Transitions 集成到核心库里了（react@canary 已经支持）。这说明这个 API 已经是前端界的”标配”了。&lt;/p&gt;&lt;p&gt;那 15% 不支持的浏览器怎么办？Astro 会自动做降级处理——在不支持的浏览器里就是普通的页面跳转，功能完全不受影响，只是少了动画而已。这就是&lt;strong&gt;渐进增强&lt;/strong&gt;的魅力。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Astro 中启用 View Transitions 的3种方法&lt;a href=&quot;#astro-中启用-view-transitions-的3种方法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;好了，理论讲完了，咱们直接上手。我会从最简单的方法开始。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;方法1：全局启用（最推荐，2行代码搞定）&lt;a href=&quot;#方法1全局启用最推荐2行代码搞定&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果你的整个网站都想要页面过渡效果，这是最简单的方法。打开你的 Layout 组件（一般是 &lt;code&gt;src/layouts/BaseLayout.astro&lt;/code&gt; 或者 &lt;code&gt;src/layouts/Layout.astro&lt;/code&gt;），在 &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 标签里加这两行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { ViewTransitions } from &apos;astro:transitions&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;title&amp;gt;My Astro Site&amp;lt;/title&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;ViewTransitions /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;slot /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;就这么简单！现在启动开发服务器（&lt;code&gt;npm run dev&lt;/code&gt;），点击任何链接试试，你会发现页面切换变成了平滑的淡入淡出动画。&lt;/p&gt;&lt;p&gt;我第一次用的时候甚至怀疑是不是浏览器缓存的原因，因为效果来得太容易了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：博客、文档站、作品集等整站都需要过渡效果的网站。&lt;/p&gt;&lt;/section&gt;&lt;section&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;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 里添加：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { ClientRouter } from &apos;astro:transitions&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;title&amp;gt;About Page&amp;lt;/title&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;ClientRouter /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;!-- 页面内容 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;ClientRouter&lt;/code&gt; 是新名字，之前叫 &lt;code&gt;ViewTransitions&lt;/code&gt;。Astro 团队改名是为了更准确描述它的作用——它不只是做视图过渡，还拦截了页面导航，把 MPA 变成了”伪 SPA”。不过旧名字也还能用，不会报错。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：混合应用，部分页面需要特殊处理的网站。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;如果你只是想快速体验一下效果，不想动项目代码，可以用 Astro 官方的 Demo 网站：&lt;/p&gt;&lt;p&gt;👉 &lt;a href=&quot;https://live-transitions.pages.dev/&quot; target=&quot;_blank&quot;&gt;View Transitions Demo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;这个 Demo 展示了各种过渡效果：列表到详情、图片画廊、音乐播放器等。我建议你先玩一玩这个，找到你喜欢的效果，再回来实现到自己项目里。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;温馨提示&lt;/strong&gt;：记得用支持 View Transitions 的浏览器打开（Chrome 126+、Safari、或者最新版 Firefox）。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;加完代码后，怎么确认 View Transitions 已经启用了呢？看这几个标志：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;页面切换时不再有白屏闪烁&lt;/strong&gt;：点击链接后内容平滑过渡，没有”白屏→新页面”的跳动感&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;导航栏等公共元素不重新渲染&lt;/strong&gt;：注意看导航栏，它不会消失再出现，而是保持在原位（这个后面会讲到 &lt;code&gt;transition:persist&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;浏览器控制台没有报错&lt;/strong&gt;：如果有报错，可能是 Astro 版本太旧或者配置有问题&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;第一次看到导航栏不闪烁的时候，我还以为是我眼花了。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;默认的淡入淡出效果虽然简洁，但有时候你可能想要更有个性的动画。这章我会教你4个自定义技巧。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;技巧1：用 transition 改变动画类型&lt;a href=&quot;#技巧1用-transition-改变动画类型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Astro 内置了4种动画效果，通过 &lt;code&gt;transition:animate&lt;/code&gt; 指令就能用。比如你想让文章内容从右边滑入：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;article transition:animate=&quot;slide&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;h1&amp;gt;文章标题&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;p&amp;gt;文章内容...&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;4种内置动画分别是：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;fade&lt;/strong&gt;（默认）：淡入淡出，最通用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;slide&lt;/strong&gt;：滑动效果，内容从右边滑入，适合文章详情页&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;initial&lt;/strong&gt;：使用浏览器默认样式，基本等于没动画&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;none&lt;/strong&gt;：完全禁用动画，适合某些不希望有过渡的元素&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;我个人最常用的组合是：主体内容用 &lt;code&gt;slide&lt;/code&gt;，侧边栏用 &lt;code&gt;fade&lt;/code&gt;，感觉层次感更强。&lt;/p&gt;&lt;p&gt;你还可以调整动画持续时间。Astro 提供了 &lt;code&gt;fade()&lt;/code&gt; 和 &lt;code&gt;slide()&lt;/code&gt; 函数：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { fade, slide } from &apos;astro:transitions&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;article transition:animate={slide({ duration: &apos;0.5s&apos; })}&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;!-- 滑动持续 0.5 秒 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;aside transition:animate={fade({ duration: &apos;0.2s&apos; })}&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;!-- 淡入淡出持续 0.2 秒 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/aside&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;技巧2：用 transition 让元素”变形”&lt;a href=&quot;#技巧2用-transition-让元素变形&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这是最有意思的功能。&lt;code&gt;transition:name&lt;/code&gt; 可以告诉浏览器：“这两个页面的元素其实是同一个东西，你帮我做个变形动画吧。”&lt;/p&gt;&lt;p&gt;经典案例：文章列表到详情页的标题过渡。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;列表页（index.astro）：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;li&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;a href=&quot;/posts/astro-guide&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;h2 transition:name=&quot;post-title-astro-guide&quot;&amp;gt;Astro 完全指南&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;详情页（posts/astro-guide.astro）：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;h1 transition:name=&quot;post-title-astro-guide&quot;&amp;gt;Astro 完全指南&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;p&amp;gt;文章内容...&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;两个页面的标题都用了 &lt;code&gt;transition:name=&quot;post-title-astro-guide&quot;&lt;/code&gt;。这样点击列表项的时候，浏览器会让标题从列表位置平滑移动到详情页顶部，同时调整字体大小和颜色。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;重要提示&lt;/strong&gt;：&lt;code&gt;transition:name&lt;/code&gt; 的值在每个页面上必须是唯一的。如果你有多篇文章，可以用动态值：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{posts.map(post =&amp;gt; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;h2 transition:name={`post-title-${post.slug}`}&amp;gt;{post.title}&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;))}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;第一次用这个功能的时候，看到标题”飞”到详情页顶部，真的有种”黑科技”的感觉。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;技巧3：用 transition 保持元素状态&lt;a href=&quot;#技巧3用-transition-保持元素状态&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;/li&gt;
&lt;li&gt;导航栏（避免重新渲染）&lt;/li&gt;
&lt;li&gt;购物车图标（保持数量显示）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这时候用 &lt;code&gt;transition:persist&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;MusicPlayer client:load transition:persist /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;导航到其他页面时，&lt;code&gt;MusicPlayer&lt;/code&gt; 组件不会被销毁重建，而是直接”搬”到新页面。内部状态（比如播放进度）完全保留。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;进阶用法&lt;/strong&gt;：配合 &lt;code&gt;transition:persist-props&lt;/code&gt;&lt;/p&gt;&lt;p&gt;默认情况下，&lt;code&gt;transition:persist&lt;/code&gt; 会让组件在导航时用新 props 重新渲染。但如果你连 props 都不想更新（比如导航栏的搜索框，你不希望用户输入的内容被清空），可以加上 &lt;code&gt;transition:persist-props&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;SearchBar&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;client:load&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;transition:persist&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;transition:persist-props&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;我在做文档站的时候用过这个，效果确实好——用户在搜索框输入了一半，点击了某个链接，搜索框内容还在，体验提升很明显。&lt;/p&gt;&lt;/section&gt;&lt;section&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;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; 元素上设置：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;html transition:animate=&quot;slide&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;ViewTransitions /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;!-- 所有内容默认使用 slide 动画 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后在子元素上按需覆盖：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;nav transition:animate=&quot;fade&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;!-- 导航栏单独用 fade --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;!-- 文章使用继承的 slide --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这种分层控制的方式很灵活，适合大型项目。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;section&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;&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;/p&gt;&lt;ol&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;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;步骤1：在 Layout 中启用 View Transitions&lt;a href=&quot;#步骤1在-layout-中启用-view-transitions&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;首先在你的 &lt;code&gt;src/layouts/BaseLayout.astro&lt;/code&gt; 中加入 ViewTransitions：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { ViewTransitions } from &apos;astro:transitions&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;interface Props {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title: string;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const { title } = Astro.props;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;html lang=&quot;zh-CN&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;title&amp;gt;{title}&amp;lt;/title&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;ViewTransitions /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;nav transition:persist transition:name=&quot;main-nav&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;a href=&quot;/&quot;&amp;gt;首页&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;a href=&quot;/about&quot;&amp;gt;关于&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;main&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;slot /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;导航栏加了 &lt;code&gt;transition:persist&lt;/code&gt; 和 &lt;code&gt;transition:name=&quot;main-nav&quot;&lt;/code&gt;，这样导航栏在页面切换时不会闪烁。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;步骤2：文章列表页 - 为标题和封面添加 transition&lt;a href=&quot;#步骤2文章列表页---为标题和封面添加-transition&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在 &lt;code&gt;src/pages/index.astro&lt;/code&gt; 中：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import BaseLayout from &apos;../layouts/BaseLayout.astro&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const posts = await Astro.glob(&apos;./posts/*.md&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;BaseLayout title=&quot;我的博客&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;h1&amp;gt;最新文章&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;div class=&quot;post-list&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{posts.map(post =&amp;gt; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;article class=&quot;post-card&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;a href={post.url}&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;img&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;src={post.frontmatter.cover}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;alt={post.frontmatter.title}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;transition:name={`cover-${post.frontmatter.slug}`}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;h2 transition:name={`title-${post.frontmatter.slug}`}&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{post.frontmatter.title}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;p&amp;gt;{post.frontmatter.excerpt}&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;))}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/BaseLayout&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;关键点：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;封面图用了 &lt;code&gt;transition:name={&apos;cover-${post.frontmatter.slug}&apos;}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;标题用了 &lt;code&gt;transition:name={&apos;title-${post.frontmatter.slug}&apos;}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;slug&lt;/code&gt; 确保每篇文章的 transition name 都是唯一的&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;步骤3：文章详情页 - 使用相同的 transition&lt;a href=&quot;#步骤3文章详情页---使用相同的-transition&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在你的文章 Markdown 模板（通常是 &lt;code&gt;src/layouts/PostLayout.astro&lt;/code&gt;）中：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import BaseLayout from &apos;./BaseLayout.astro&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const { frontmatter } = Astro.props;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;BaseLayout title={frontmatter.title}&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;article class=&quot;post-detail&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;img&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;src={frontmatter.cover}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;alt={frontmatter.title}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;transition:name={`cover-${frontmatter.slug}`}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;class=&quot;cover-image&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;h1 transition:name={`title-${frontmatter.slug}`}&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{frontmatter.title}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;div class=&quot;post-meta&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;time&amp;gt;{frontmatter.date}&amp;lt;/time&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;span&amp;gt;{frontmatter.author}&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;div class=&quot;post-content&quot; transition:animate=&quot;slide&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;slot /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/BaseLayout&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;注意：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;封面和标题的 &lt;code&gt;transition:name&lt;/code&gt; 和列表页保持一致&lt;/li&gt;
&lt;li&gt;正文内容用了 &lt;code&gt;transition:animate=&quot;slide&quot;&lt;/code&gt; 增加滑入效果&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;步骤4：添加一些 CSS 让效果更流畅&lt;a href=&quot;#步骤4添加一些-css-让效果更流畅&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在 Layout 或全局样式中加入：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/* 优化过渡性能 */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[transition:name] {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;will-change: transform;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/* 封面图在列表和详情页的样式 */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;.post-card img {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;width: 100%;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;height: 200px;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;object-fit: cover;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;border-radius: 8px;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;.post-detail .cover-image {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;width: 100%;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;max-height: 400px;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;object-fit: cover;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;border-radius: 12px;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/* 标题样式 */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;.post-card h2 {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;font-size: 1.5rem;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;color: #333;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;.post-detail h1 {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;font-size: 2.5rem;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;color: #111;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;margin-top: 1rem;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;will-change: transform&lt;/code&gt; 这一行很重要，它告诉浏览器这个元素会有变换动画，浏览器会提前做优化。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;步骤5：测试效果&lt;a href=&quot;#步骤5测试效果&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;启动开发服务器：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm run dev&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&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;li&gt;其他内容（摘要、发布日期等）平滑淡入&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;第一次看到这个效果的时候，真的有种”这就是我想要的”满足感。&lt;/p&gt;&lt;/section&gt;&lt;section&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 提供了加载状态的钩子：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;script&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;document.addEventListener(&apos;astro:before-preparation&apos;, () =&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 显示加载动画&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;document.body.classList.add(&apos;loading&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;document.addEventListener(&apos;astro:page-load&apos;, () =&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 隐藏加载动画&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;document.body.classList.remove(&apos;loading&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;style&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;body.loading::after {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;content: &apos;&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;position: fixed;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;top: 50%;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;left: 50%;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;width: 40px;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;height: 40px;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;border: 4px solid #f3f3f3;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;border-top: 4px solid #3498db;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;border-radius: 50%;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;animation: spin 1s linear infinite;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@keyframes spin {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;0% { transform: rotate(0deg); }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;100% { transform: rotate(360deg); }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这样在内容加载时会显示一个旋转的加载图标，体验更完整。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;section&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;p&gt;Astro 和浏览器都会自动处理这个，但你也可以手动控制。在 CSS 中：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@media (prefers-reduced-motion: reduce) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;animation-duration: 0.01ms !important;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;animation-iteration-count: 1 !important;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;transition-duration: 0.01ms !important;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;或者在 Astro 组件中禁用某些动画：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;div transition:animate={&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;typeof window !== &apos;undefined&apos; &amp;amp;&amp;amp;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;window.matchMedia(&apos;(prefers-reduced-motion: reduce)&apos;).matches&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;? &apos;none&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;: &apos;slide&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;内容&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这是个很容易被忽略的细节，但对一部分用户来说真的很重要。&lt;/p&gt;&lt;/section&gt;&lt;section&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;在传统 MPA 中，每次页面跳转都会重新执行脚本。但用了 View Transitions 后，页面导航变成了”伪 SPA”，脚本的行为会有点不同。&lt;/p&gt;&lt;p&gt;Astro 提供了几个生命周期事件：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 页面加载完成（包括首次加载和导航后）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;document.addEventListener(&apos;astro:page-load&apos;, () =&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console.log(&apos;页面内容已更新&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 重新初始化 UI 组件、绑定事件等&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 导航即将开始&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;document.addEventListener(&apos;astro:before-preparation&apos;, () =&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console.log(&apos;即将导航到新页面&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 清理定时器、取消网络请求等&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 导航被取消（比如用户点击了返回按钮）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;document.addEventListener(&apos;astro:after-swap&apos;, () =&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console.log(&apos;DOM 已更新但动画还未完成&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;常见坑&lt;/strong&gt;：如果你在脚本中绑定了事件监听器，记得在 &lt;code&gt;astro:before-preparation&lt;/code&gt; 中清理，否则可能导致内存泄漏。&lt;/p&gt;&lt;p&gt;我之前做过一个项目，有个滚动监听器没清理，导航几次后页面就开始卡顿。后来加了清理逻辑才解决。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;虽然 View Transitions 性能开销很小，但如果动画元素很多或者很复杂，还是可能卡顿。几个优化建议：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;限制同时过渡的元素数量&lt;/strong&gt;：不要给所有元素都加 &lt;code&gt;transition:name&lt;/code&gt;，只给关键元素加&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用 &lt;code&gt;will-change: transform&lt;/code&gt;&lt;/strong&gt;：告诉浏览器提前优化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;避免在动画中触发 reflow&lt;/strong&gt;：不要在动画过程中修改布局属性（width、height、padding等）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;测试真实设备&lt;/strong&gt;：开发机性能好，不代表用户设备也流畅&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/* 好的做法 */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;.animated-element {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;will-change: transform, opacity;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;transform: translateX(0);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/* 不好的做法 */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;.animated-element {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;width: 100px; /* 修改 width 会触发 reflow，性能差 */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;strong&gt;症状&lt;/strong&gt;：加了 &lt;code&gt;transition:name&lt;/code&gt; 但页面还是生硬跳转，没有动画。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;可能原因和解决方案&lt;/strong&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;transition 不唯一&lt;/strong&gt;：检查同一页面是否有重复的 name&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;两个页面的 name 不匹配&lt;/strong&gt;：确保列表页和详情页用的是同一个 name&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;浏览器不支持&lt;/strong&gt;：打开 DevTools Console，看有没有报错&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Astro 版本太旧&lt;/strong&gt;：升级到 Astro 3.0+ （View Transitions 是 3.0 引入的）&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 检查 Astro 版本&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npx astro --version&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 升级 Astro&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm install astro@latest&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;strong&gt;症状&lt;/strong&gt;：过渡过程中元素会闪一下或者位置跳动。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;可能原因和解决方案&lt;/strong&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;CSS 样式不一致&lt;/strong&gt;：确保元素在两个页面的基础样式（display、position等）一致&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;图片未加载完成&lt;/strong&gt;：给图片加 &lt;code&gt;loading=&quot;eager&quot;&lt;/code&gt; 或者设置固定高度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;没有用 &lt;code&gt;transition:persist&lt;/code&gt;&lt;/strong&gt;：对于需要保持状态的元素（导航栏、播放器），加上 &lt;code&gt;transition:persist&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- 解决图片闪烁 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;img&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;src={cover}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;loading=&quot;eager&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;style=&quot;height: 200px&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;transition:name=&quot;cover&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;p&gt;&lt;strong&gt;症状&lt;/strong&gt;：点击前进时动画正常，但点返回按钮时动画方向还是从右到左。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：Astro 会自动处理前进/后退的动画方向，但如果你用了自定义动画，可能需要手动处理：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;document.addEventListener(&apos;astro:before-preparation&apos;, (event) =&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const isBack = event.direction === &apos;back&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;if (isBack) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 调整动画方向&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;document.documentElement.classList.add(&apos;reverse-animation&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;.reverse-animation [transition:animate=&quot;slide&quot;] {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;animation-direction: reverse;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;strong&gt;症状&lt;/strong&gt;：加了 View Transitions 后，Google Analytics、广告脚本等第三方工具不工作了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：这些脚本通常在页面加载时执行一次，但 View Transitions 会”拦截”导航，第三方脚本不知道页面已经变了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：在 &lt;code&gt;astro:page-load&lt;/code&gt; 事件中重新触发第三方脚本：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;document.addEventListener(&apos;astro:page-load&apos;, () =&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// Google Analytics&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;if (typeof gtag !== &apos;undefined&apos;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;gtag(&apos;config&apos;, &apos;GA_MEASUREMENT_ID&apos;, {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;page_path: window.location.pathname,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// Facebook Pixel&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;if (typeof fbq !== &apos;undefined&apos;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fbq(&apos;track&apos;, &apos;PageView&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这个坑我也踩过，最开始加了 View Transitions 后发现 GA 统计不准了，才意识到要手动触发。&lt;/p&gt;&lt;/section&gt;&lt;section&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;最后提醒一点：View Transitions 虽然支持率已经很高（85%+），但还是有浏览器不支持。好消息是，Astro 会自动降级——在不支持的浏览器里就是普通的页面跳转，功能完全正常。&lt;/p&gt;&lt;p&gt;如果你想手动检测浏览器是否支持：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;if (document.startViewTransition) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console.log(&apos;浏览器支持 View Transitions&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;} else {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console.log(&apos;浏览器不支持，已自动降级&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这就是渐进增强的魅力：现代浏览器享受丝滑体验，旧浏览器也不会坏。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;第一次用 View Transitions 时，transition 配错了。列表页用的是 &lt;code&gt;title-astro-guide&lt;/code&gt;，详情页写成了 &lt;code&gt;post-title-astro-guide&lt;/code&gt;，结果怎么都不生效。排查了半天才发现名字不匹配，改成一样的就好了。&lt;/p&gt;&lt;p&gt;图片闪烁也踩过坑。封面图在过渡过程中总是闪一下才显示出来。后来给图片加了 &lt;code&gt;loading=&quot;eager&quot;&lt;/code&gt; 和固定高度，闪烁才消失。如果你也遇到这个问题，检查一下图片是不是懒加载导致的。&lt;/p&gt;&lt;p&gt;后退按钮方向也花了不少时间。点前进时动画是从右往左，点返回时还是从右往左，感觉很奇怪。后来加了 &lt;code&gt;event.direction&lt;/code&gt; 判断，返回时反转动画方向才解决。&lt;/p&gt;&lt;p&gt;第三方脚本的坑最头疼。加了 View Transitions 后，Google Analytics 统计的 PV 突然对不上。后来才发现是因为 View Transitions 拦截了导航，GA 的 pageview 事件没触发。在 &lt;code&gt;astro:page-load&lt;/code&gt; 里手动触发 &lt;code&gt;gtag(&apos;event&apos;, &apos;page_view&apos;)&lt;/code&gt; 才解决。&lt;/p&gt;&lt;p&gt;现在每个新项目我都会第一时间加上 View Transitions。效果真的好，用户体验提升明显，而且实现起来特别简单。&lt;/p&gt;&lt;p&gt;记住：好的用户体验不需要复杂的代码，关键是用对工具。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Mac M4 上 Z-image 模型采样器实战优化</title><link>https://blog.moewah.com/posts/m4-mac-zimage-sampler-combination-practical-insights/</link><guid isPermaLink="true">https://blog.moewah.com/posts/m4-mac-zimage-sampler-combination-practical-insights/</guid><description>如何在Mac mini M4上高效运行Z-image模型？本文详解双采样器串联方案，解决低步数下的质感瓶颈，结合VAE瓦片式处理实现高清放大，助你榨干M4性能释放AI绘画最大潜能。</description><pubDate>Wed, 12 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在 Mac mini M4 (24G 内存) 上运行 ComfyUI 时，Z-image 这类蒸馏模型以其极快的响应速度成为首选。为了突破极低步数带来的质感瓶颈，采用“双采样器（Dual Sampler）”的串联逻辑是目前公认的最优解。&lt;/p&gt;
&lt;p&gt;通过实测总结了两个核心场景的连接方案，重点在于如何通过采样器的交棒，既保留画面的灵性，又补充工业级的细节。如同一篇好文章是反复修改润色出来的，图像生成也同样受益于分阶段的精细处理 &lt;a href=&quot;https://finance.sina.com.cn/jjxw/2025-06-08/doc-ineziaar3895125.shtml&quot; target=&quot;_blank&quot;&gt;finance.sina.com.cn&lt;/a&gt;, &lt;a href=&quot;https://blog.csdn.net/ijiaodui/article/details/131006521&quot; target=&quot;_blank&quot;&gt;csdn.net&lt;/a&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h3&gt;ComfyUI KSampler 核心参数概览&lt;a href=&quot;#comfyui-ksampler-核心参数概览&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在详细介绍方案之前，有必要了解 ComfyUI &lt;code&gt;KSampler&lt;/code&gt; 节点的核心参数：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;model&lt;/code&gt;&lt;/strong&gt;: 指定用于生成样本的模型。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;sampler_name&lt;/code&gt;&lt;/strong&gt;: 决定了从随机噪声逐步生成图像的数学算法。不同的采样器在速度、细节表现和结果一致性上表现不同，例如 &lt;code&gt;ancestral&lt;/code&gt; 类型的采样器会持续添加噪声，增加每步采样的随机性，从而产生更具“灵性”的输出 &lt;a href=&quot;https://comfyui-wiki.com/zh/comfyui-nodes/sampling/sampler&quot; target=&quot;_blank&quot;&gt;comfyui-wiki.com&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;scheduler&lt;/code&gt;&lt;/strong&gt;: 控制降噪过程的步进节奏，即在每一步如何调整降噪强度。&lt;code&gt;karras&lt;/code&gt; 和 &lt;code&gt;beta&lt;/code&gt; 等调度器可以优化低步数下的图像质量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;steps&lt;/code&gt; (步数)&lt;/strong&gt;: 采样器执行降噪迭代的次数。步数越多，细节通常越丰富，但生成时间也越长。Z-image 模型的一大优势就是在极低步数下也能出图。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;cfg&lt;/code&gt; (Classifier Free Guidance)&lt;/strong&gt;: 控制生成图像对正向提示词的遵循程度。CFG 值越高，图像越严格遵循提示词，但过高可能导致画面失真或过度饱和。对于 Z-image，本文强调强制锁定在 &lt;code&gt;1.0&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;denoise&lt;/code&gt; (重绘幅度)&lt;/strong&gt;: 在图生图或多阶段采样中，决定在新生成的细节中保留多少原始潜像的信息。&lt;code&gt;1.0&lt;/code&gt; 意味着完全重绘，而 &lt;code&gt;0.0&lt;/code&gt; 意味着完全保留原始图像。通常通过 &lt;code&gt;start_at_step&lt;/code&gt; (开始降噪步数) 和 &lt;code&gt;end_at_step&lt;/code&gt; (结束降噪步数) 来更精细地控制 &lt;a href=&quot;https://comfyui-wiki.com/zh/comfyui-nodes/sampling/k-sampler-advanced&quot; target=&quot;_blank&quot;&gt;comfyui-wiki.com&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;noise_seed&lt;/code&gt;&lt;/strong&gt;: 噪声生成的随机种子。固定种子可确保重复生成相同图像。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;add_noise&lt;/code&gt;&lt;/strong&gt;: 是否在 Latent 输入中添加噪声。在首次生成时通常启用，在后续阶段可能禁用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;latent_image&lt;/code&gt;&lt;/strong&gt;: Sampler 的 Latent 输入来源，可以是空白 Latent 或前一阶段的 Latent 输出。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;VAE 瓦片式（Tiling）参数详解与配置建议&lt;a href=&quot;#vae-瓦片式tiling参数详解与配置建议&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这是处理大尺寸图像时避免内存溢出的关键优化，特别在 Mac mini M4 这种统一内存架构上至关重要。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;VAE (瓦片式) 节点参数示例：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tile_size: 512&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;overlap: 64&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;temporal_size: 64&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;temporal_overlap: 8&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;tile_size&lt;/code&gt; (瓦片大小)&lt;/strong&gt;: VAE 每次处理的图像小块 (瓦片) 的边长 (像素值)，默认通常是 &lt;code&gt;512&lt;/code&gt;。这是非常安全且普遍适用的尺寸。对于 Mac mini M4 (24G 内存)，&lt;code&gt;512&lt;/code&gt; 是一个无需更改的优秀默认值，在内存占用和处理效率之间取得了很好的平衡。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;overlap&lt;/code&gt; (重叠)&lt;/strong&gt;: 每个瓦片与其相邻瓦片之间的重叠像素数量，默认通常是 &lt;code&gt;64&lt;/code&gt;。这能有效防止瓦片之间出现“接缝”或不自然边界。&lt;code&gt;64&lt;/code&gt; 是一个非常好的默认值，通常能够有效消除绝大多数接缝问题。如果仍有接缝，可尝试增加到 &lt;code&gt;96&lt;/code&gt; 或 &lt;code&gt;128&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;temporal_size&lt;/code&gt; (时间大小) 和 &lt;code&gt;temporal_overlap&lt;/code&gt; (时间重叠)&lt;/strong&gt;: 这两个参数主要用于&lt;strong&gt;视频或连续帧处理&lt;/strong&gt;，在处理&lt;strong&gt;单张静态图像&lt;/strong&gt;时，它们的作用可以忽略。保持默认值 (&lt;code&gt;64&lt;/code&gt; 和 &lt;code&gt;8&lt;/code&gt;) 即可，或设为 &lt;code&gt;1&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;🎨 方案一：文生图·细节拉满流 (总步数 18，Refiner 重绘幅度约 0.3)&lt;a href=&quot;#-方案一文生图细节拉满流-总步数-18refiner-重绘幅度约-03&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;目标：&lt;/strong&gt; 解决单次采样构图死板的问题。第一级找“灵感”，第二级填“质感”。通过精细控制总去噪步数和重绘幅度，在保证整体去噪效率的同时，让精修阶段发挥最大作用。&lt;/p&gt;&lt;section&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;graph TD
    A[提示词与模型加载] --&amp;gt; B(Sampler 1: Euler A + Beta)
    B -- &quot;Latent (保持原参数直接传递)&quot; --&amp;gt; C(Sampler 2: ER SDE + Beta)
    C --&amp;gt; D[VAE Decode]
    D --&amp;gt; E[最终细节成品]&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;总的去噪步数控制在 18 步&lt;/strong&gt;，并且第二个采样器（Refiner）的有效&lt;strong&gt;重绘幅度（Denoise）为 &lt;span&gt;&lt;span&gt;0.30.3&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;0.3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 到 &lt;span&gt;&lt;span&gt;0.350.35&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;0.35&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 左右&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;计算 Sampler 2 的 &lt;code&gt;start_at_step&lt;/code&gt;：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果 Sampler 2 的 &lt;code&gt;steps&lt;/code&gt; 参数设置为整个工作流的总步数（即 18），且希望其重绘幅度为 &lt;span&gt;&lt;span&gt;0.30.3&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;0.3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 到 &lt;span&gt;&lt;span&gt;0.350.35&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;0.35&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;。我们可以取一个中间值，比如 &lt;span&gt;&lt;span&gt;0.330.33&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;0.33&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;。&lt;/p&gt;&lt;p&gt;则 Sampler 2 &lt;strong&gt;开始介入&lt;/strong&gt;的步数应为：
&lt;span&gt;&lt;span&gt;start_at_step=总步数×(1−目标重绘幅度)=18×(1−0.33)≈18×0.67≈12start\_at\_step = \text{总步数} \times (1 - \text{目标重绘幅度}) = 18 \times (1 - 0.33) \approx 18 \times 0.67 \approx 12&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;e&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;&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;18&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;×&lt;/span&gt;&lt;span&gt;&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;0.33&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;≈&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;18&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;×&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.67&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;≈&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;12&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;。&lt;/p&gt;&lt;p&gt;这意味着第一个采样器将负责前 12 步的去噪，然后第二个采样器从第 12 步开始接手，完成剩余的 &lt;span&gt;&lt;span&gt;18−12=618 - 12 = 6&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;18&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;12&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&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;6/18≈0.3336 / 18 \approx 0.333&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;6/18&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;≈&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.333&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;第一级 (Base) Sampler (K采样器 (高级) 配置)：&lt;/strong&gt; 负责“无中生有”并奠定基础构图。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;sampler_name&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;euler_ancestral&lt;/code&gt; (或 &lt;code&gt;euler_a&lt;/code&gt;)。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验与注意点&lt;/strong&gt;: &lt;code&gt;euler_ancestral&lt;/code&gt; 在每步采样中引入少量随机噪声，赋予图像独特的“灵气”和多样性，非常适合在第一阶段探索多样化的构图和创意，避免 AI 生成图像常见的呆板感 &lt;a href=&quot;https://comfyui-wiki.com/zh/comfyui-nodes/sampling/sampler&quot; target=&quot;_blank&quot;&gt;comfyui-wiki.com&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;scheduler&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;beta&lt;/code&gt;。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验与注意点&lt;/strong&gt;: &lt;code&gt;beta&lt;/code&gt; 调度器能提供平衡稳定的降噪过程，与 &lt;code&gt;euler_ancestral&lt;/code&gt; 配合，有助于在低步数下快速形成可辨识的初始画面。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;steps&lt;/code&gt; (总步数上下文)&lt;/strong&gt;: &lt;code&gt;12&lt;/code&gt; 步。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验与注意点&lt;/strong&gt;: 根据上述计算，第一级采样器需完成 12 步的去噪，以便为第二级采样器留出 6 步（总共 18 步完成）的精修空间。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;cfg&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;1.0&lt;/code&gt;。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验与注意点&lt;/strong&gt;: &lt;strong&gt;严格遵循 Z-image 模型的要求，CFG 锁定为 &lt;code&gt;1.0&lt;/code&gt;&lt;/strong&gt;。这是为了确保两个采样器能平滑衔接，避免在第二阶段出现色彩溢出或“焦黑”等伪影。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;noise_seed&lt;/code&gt;&lt;/strong&gt;: 建议在探索阶段设置为 &lt;code&gt;-1&lt;/code&gt; (随机)。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验与注意点&lt;/strong&gt;: &lt;strong&gt;若希望每次生成不同构图以探索创意，可将此项设置为 &lt;code&gt;-1&lt;/code&gt; (随机)。一旦发现满意的构图，务必&lt;/strong&gt;记录下该次生成的种子值**，并将其固定在此处以实现精确复现。**&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;add_noise&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;enable&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;start_at_step&lt;/code&gt; (开始降噪步数)&lt;/strong&gt;: &lt;code&gt;0&lt;/code&gt;。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验与注意点&lt;/strong&gt;: 对于第一个采样器，它应始终从去噪过程的起点 (&lt;code&gt;0&lt;/code&gt;) 开始。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;end_at_step&lt;/code&gt; (结束降噪步数)&lt;/strong&gt;: &lt;code&gt;12&lt;/code&gt;。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验与注意点&lt;/strong&gt;: 应与该采样器的 &lt;code&gt;steps&lt;/code&gt; 参数值一致，表示它完成其分配的 12 步去噪。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;return_with_leftover_no...&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;enable&lt;/code&gt;。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验与注意点&lt;/strong&gt;: 确保将部分去噪后的 Latent 图像以及任何剩余的噪声信息（如果采样器算法需要）传递给后续的采样器。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;latent_image&lt;/code&gt;&lt;/strong&gt;: 连接自 &lt;code&gt;Empty Latent Image&lt;/code&gt; 节点，用于设定图像的初始尺寸（例如，SDXL 模型推荐使用 1024x1024）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;第二级 (Refiner) Sampler (K采样器 (高级) 配置)：&lt;/strong&gt; 负责填充细节，提升画面质感。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;sampler_name&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;er_sde&lt;/code&gt; (通常指 &lt;code&gt;dpmpp_sde&lt;/code&gt; 或其 &lt;code&gt;_gpu&lt;/code&gt; 优化版本)。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验与注意点&lt;/strong&gt;: &lt;code&gt;dpmpp_sde&lt;/code&gt; 系列采样器擅长生成高细节、具有摄影感的效果，尤其在处理纹理、光影等复杂细节方面表现卓越 &lt;a href=&quot;https://comfyui-wiki.com/zh/comfyui-nodes/sampling/sampler&quot; target=&quot;_blank&quot;&gt;comfyui-wiki.com&lt;/a&gt;。它能有效地将第一级粗略的构图转化为具有“工业级细节”的图像，弥补低步数 Z-image 在质感上的不足。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;scheduler&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;beta&lt;/code&gt;。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验与注意点&lt;/strong&gt;: 继续使用 &lt;code&gt;beta&lt;/code&gt; 调度器，以维持整个工作流的连贯性和稳定性。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;steps&lt;/code&gt; (总步数上下文)&lt;/strong&gt;: &lt;code&gt;18&lt;/code&gt; 步。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验与注意点&lt;/strong&gt;: &lt;strong&gt;这设置了整个去噪过程的“总概念步数”&lt;/strong&gt;。此采样器将根据 &lt;code&gt;start_at_step&lt;/code&gt; 和 &lt;code&gt;end_at_step&lt;/code&gt; 在此总步数范围内工作。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;cfg&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;1.0&lt;/code&gt;。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验与注意点&lt;/strong&gt;: 继续&lt;strong&gt;保持 &lt;code&gt;1.0&lt;/code&gt; CFG&lt;/strong&gt;，确保第二级采样器在第一级的基础上进行细化，而不是重新解释提示词。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;noise_seed&lt;/code&gt;&lt;/strong&gt;: 建议设置为一个&lt;strong&gt;固定数字&lt;/strong&gt; (例如 &lt;code&gt;0&lt;/code&gt;)。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验与注意点&lt;/strong&gt;: &lt;strong&gt;为了验证精修阶段的稳定性和效果，通常会将其设置为固定数字，或者设置为与第一级采样器当时生成时使用的&lt;/strong&gt;相同种子值**（如果第一级是随机生成的话）。将此种子固定，有助于保持精修过程的内部一致性。**&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;add_noise&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;disable&lt;/code&gt;。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验与注意点&lt;/strong&gt;: 由于输入是部分去噪的 Latent 并且我们通过 &lt;code&gt;start_at_step&lt;/code&gt; / &lt;code&gt;end_at_step&lt;/code&gt; 控制重绘，此阶段不应额外添加噪声。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;start_at_step&lt;/code&gt; (开始降噪步数)&lt;/strong&gt;: &lt;code&gt;12&lt;/code&gt;。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验与注意点&lt;/strong&gt;: 这是实现约 &lt;span&gt;&lt;span&gt;0.330.33&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;0.33&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 重绘幅度的关键。它表示第二个采样器将从总去噪过程的第 12 步开始接手工作。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;end_at_step&lt;/code&gt; (结束降噪步数)&lt;/strong&gt;: &lt;code&gt;18&lt;/code&gt;。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验与注意点&lt;/strong&gt;: 应与该采样器的 &lt;code&gt;steps&lt;/code&gt; 参数值（即整个工作流的总步数）一致，表示它在此总步数内完成去噪过程。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;KSampler&lt;/code&gt; 设置也遵循 Z-image 的 &lt;code&gt;CFG 1.0&lt;/code&gt; 和低步数原则。主要区别在于中间的放大环节和 &lt;code&gt;denoise&lt;/code&gt; 参数的精细控制。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;方法 A：Latent 潜空间放大（类似 Hires.fix）&lt;a href=&quot;#方法-alatent-潜空间放大类似-hiresfix&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这种方式在采样器之间插入一个 &lt;code&gt;Upscale Latent&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;graph TD
    A[Sampler 1: DPM++ 2M SDE + Beta] --&amp;gt; B{Upscale Latent}
    B -- &quot;放大后的潜空间&quot; --&amp;gt; C(Sampler 2: ER SDE + Beta)
    C --&amp;gt; D[VAE Decode]
    D --&amp;gt; E[最终细节成品]&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sampler 1 (K采样器 (高级) 配置)：&lt;/strong&gt; 负责生成一张高质量底图。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;sampler_name&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;dpmpp_2m_sde&lt;/code&gt; (或 &lt;code&gt;dpmpp_2m_sde_gpu&lt;/code&gt;)。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验与注意点&lt;/strong&gt;: &lt;code&gt;dpmpp_2m_sde&lt;/code&gt; 系列采样器在多轮采样中具有出色的稳定性，能够生成结构极其稳健的图像。这对于后续的潜空间放大至关重要，能确保放大后图像的基础结构不发生崩坏。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;scheduler&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;beta&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;steps&lt;/code&gt; (总步数上下文)&lt;/strong&gt;: &lt;code&gt;5-8&lt;/code&gt; 步。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验与注意点&lt;/strong&gt;: 保持 Z-image 的低步数优势，生成一个足够精致的初始潜像。例如，可设置为 &lt;code&gt;6&lt;/code&gt; 步。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;cfg&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;1.0&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;noise_seed&lt;/code&gt;&lt;/strong&gt;: 建议使用固定整数，确保生成的底图可复现。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;add_noise&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;enable&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;start_at_step&lt;/code&gt; (开始降噪步数)&lt;/strong&gt;: &lt;code&gt;0&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;end_at_step&lt;/code&gt; (结束降噪步数)&lt;/strong&gt;: 应与该采样器的 &lt;code&gt;steps&lt;/code&gt; 参数值一致。例如，&lt;code&gt;6&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;latent_image&lt;/code&gt;&lt;/strong&gt;: 连接自 &lt;code&gt;Empty Latent Image&lt;/code&gt; 节点。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Upscale Latent&lt;/code&gt; 节点 (中间环节)：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验与注意点&lt;/strong&gt;: 此节点直接在潜空间中执行放大操作，因无需 VAE 编解码而速度极快。请设置合适的 &lt;code&gt;scale_factor&lt;/code&gt; (例如 &lt;code&gt;1.5&lt;/code&gt; 或 &lt;code&gt;2.0&lt;/code&gt;)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sampler 2 (K采样器 (高级) 配置)：&lt;/strong&gt; 在 Latent 放大后，介入修复模糊感并补充高频细节。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;sampler_name&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;er_sde&lt;/code&gt; (或 &lt;code&gt;dpmpp_sde&lt;/code&gt; 变体)。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验与注意点&lt;/strong&gt;: 再次利用其强大的细节生成能力，修复潜空间放大可能带来的轻微模糊，并添加放大的图像所缺少的高频细节。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;scheduler&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;beta&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;steps&lt;/code&gt; (总步数上下文)&lt;/strong&gt;: 例如，设置总步数为 &lt;code&gt;18&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;cfg&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;1.0&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;noise_seed&lt;/code&gt;&lt;/strong&gt;: 可以使用与第一级相同的种子，或略微增加以增加细微随机性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;add_noise&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;disable&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;start_at_step&lt;/code&gt; (开始降噪步数)&lt;/strong&gt;: 根据目标重绘幅度 &lt;code&gt;0.3 - 0.4&lt;/code&gt; 进行计算。例如，如果总步数是 18，目标重绘幅度是 &lt;span&gt;&lt;span&gt;0.350.35&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;0.35&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;，则 &lt;span&gt;&lt;span&gt;start_at_step=18×(1−0.35)=18×0.65=11.7≈12start\_at\_step = 18 \times (1 - 0.35) = 18 \times 0.65 = 11.7 \approx 12&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;e&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;18&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;×&lt;/span&gt;&lt;span&gt;&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;0.35&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;18&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;×&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.65&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;11.7&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;≈&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;12&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;end_at_step&lt;/code&gt; (结束降噪步数)&lt;/strong&gt;: 应与该采样器的 &lt;code&gt;steps&lt;/code&gt; 值一致。例如，&lt;code&gt;18&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;方法 B：模型放大 + 像素重采样（极致清晰）&lt;a href=&quot;#方法-b模型放大--像素重采样极致清晰&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这种方式将图片转为像素空间，通过 Upscale 模型放大后再重新编码回潜空间，能够获得最锐利的边缘。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;🔗 修正后的连接逻辑：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;graph TD
    A[Sampler 1 DPM++ 2M SDE Beta] --&amp;gt; |Model| B1[VAE Decode 瓦片式]
    B1 -- &quot;原始图像 像素&quot; --&amp;gt; C[Upscale Image via Model]
    C -- &quot;高清图像 像素&quot; --&amp;gt; D1[VAE Encode 瓦片式]
    D1 -- &quot;高清 Latent&quot; --&amp;gt; E[Sampler 2 ER SDE Beta]
    E -- &quot;最终高清 Latent&quot; --&amp;gt; G1[VAE Decode 瓦片式]
    G1 --&amp;gt; F[最终大图 像素]&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sampler 1 (K采样器 (高级) 配置)：&lt;/strong&gt; 负责生成一张高质量底图。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;sampler_name&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;dpmpp_2m_sde&lt;/code&gt; (或 &lt;code&gt;dpmpp_2m_sde_gpu&lt;/code&gt;)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;scheduler&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;beta&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;steps&lt;/code&gt; (总步数上下文)&lt;/strong&gt;: &lt;code&gt;5-8&lt;/code&gt; 步。例如，&lt;code&gt;6&lt;/code&gt; 步。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;cfg&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;1.0&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;noise_seed&lt;/code&gt;&lt;/strong&gt;: 固定整数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;add_noise&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;enable&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;start_at_step&lt;/code&gt; (开始降噪步数)&lt;/strong&gt;: &lt;code&gt;0&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;end_at_step&lt;/code&gt; (结束降噪步数)&lt;/strong&gt;: 应与该采样器的 &lt;code&gt;steps&lt;/code&gt; 参数值一致。例如，&lt;code&gt;6&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;latent_image&lt;/code&gt;&lt;/strong&gt;: 连接自 &lt;code&gt;Empty Latent Image&lt;/code&gt; 节点。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;B1((VAE Decode (瓦片式)))&lt;/code&gt; (第一个 VAE 解码器)&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验与注意点&lt;/strong&gt;: 用于将 &lt;code&gt;Sampler 1&lt;/code&gt; 的 Latent 输出解码成像素形式的“原始图像”，因为 &lt;code&gt;Upscale Image via Model&lt;/code&gt; (&lt;code&gt;C&lt;/code&gt; 节点) 是在像素空间操作的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mac 专属优化&lt;/strong&gt;: &lt;strong&gt;右键点击 &lt;code&gt;VAE Decode&lt;/code&gt; 节点，选择 &lt;code&gt;Enable Tiling&lt;/code&gt; (启用瓦片式)&lt;/strong&gt;。参数配置推荐 &lt;code&gt;tile_size=512&lt;/code&gt;, &lt;code&gt;overlap=64&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Upscale Image via Model&lt;/code&gt; 节点 (中间环节)：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验与注意点&lt;/strong&gt;: 此节点需要加载一个独立的超分模型 (例如 &lt;code&gt;4x-UltraSharp&lt;/code&gt;, &lt;code&gt;ESRGAN&lt;/code&gt; 等)。请确保您已将相应的 &lt;code&gt;upscale_loader&lt;/code&gt; 文件放置在 ComfyUI 的 &lt;code&gt;models/upscale_models&lt;/code&gt; 目录下，并在节点中选择正确的模型。这个模型负责在像素空间中增加图像的分辨率和锐度。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;D1((VAE Encode (瓦片式)))&lt;/code&gt; (VAE 编码器)&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验与注意点&lt;/strong&gt;: 将经过模型放大后的“高清图像”（像素）重新编码回 Latent 潜空间，作为 &lt;code&gt;Sampler 2&lt;/code&gt; 的输入。&lt;strong&gt;由于这里的像素图像已经是高分辨率的了（例如 2048x2048 或更大），所以此处强烈建议使用 &lt;code&gt;VAE Encode (瓦片式)&lt;/code&gt;。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mac 专属优化&lt;/strong&gt;: 同样，&lt;strong&gt;右键点击 &lt;code&gt;VAE Encode&lt;/code&gt; 节点，选择 &lt;code&gt;Enable Tiling&lt;/code&gt; (启用瓦片式)&lt;/strong&gt;。参数配置推荐 &lt;code&gt;tile_size=512&lt;/code&gt;, &lt;code&gt;overlap=64&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sampler 2 (K采样器 (高级) 配置)：&lt;/strong&gt; 接收高清 Latent，进行最终的精修。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;sampler_name&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;er_sde&lt;/code&gt; (或 &lt;code&gt;dpmpp_sde&lt;/code&gt; 变体)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;scheduler&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;beta&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;steps&lt;/code&gt; (总步数上下文)&lt;/strong&gt;: 例如，设置总步数为 &lt;code&gt;18&lt;/code&gt; (或根据实际需求调整)。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验与注意点&lt;/strong&gt;: 鉴于图像已经过模型放大，细节已大幅提升，因此第二级的步数通常可以适中，做轻微的优化。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;cfg&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;1.0&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;add_noise&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;disable&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;noise_seed&lt;/code&gt;&lt;/strong&gt;: 使用与第一级相同的种子，或略微增加。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;start_at_step&lt;/code&gt; (开始降噪步数)&lt;/strong&gt;: 根据重绘幅度 &lt;code&gt;0.25 - 0.35&lt;/code&gt; 进行计算。例如，如果总步数是 18，目标重绘幅度是 &lt;span&gt;&lt;span&gt;0.30.3&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;0.3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;，则 &lt;span&gt;&lt;span&gt;start_at_step=18×(1−0.3)=18×0.7=12.6≈13start\_at\_step = 18 \times (1 - 0.3) = 18 \times 0.7 = 12.6 \approx 13&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;e&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;18&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;×&lt;/span&gt;&lt;span&gt;&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;0.3&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;18&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;×&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.7&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;12.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;13&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;end_at_step&lt;/code&gt; (结束降噪步数)&lt;/strong&gt;: 应与该采样器的 &lt;code&gt;steps&lt;/code&gt; 值一致。例如，&lt;code&gt;18&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;G1((VAE Decode (瓦片式)))&lt;/code&gt; (第二个 VAE 解码器)&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验与注意点&lt;/strong&gt;: 用于将 &lt;code&gt;Sampler 2&lt;/code&gt; (&lt;code&gt;E&lt;/code&gt; 节点) 输出的&lt;strong&gt;最终优化过的高清 Latent&lt;/strong&gt; 解码成&lt;strong&gt;像素&lt;/strong&gt;形式的“最终大图”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mac 专属优化&lt;/strong&gt;: 由于这是处理已经过放大且由 &lt;code&gt;Sampler 2&lt;/code&gt; 优化过的高清 Latent，其解码出的像素图像分辨率会很高。&lt;strong&gt;强烈建议在此 &lt;code&gt;VAE Decode&lt;/code&gt; 节点上右键点击，选择 &lt;code&gt;Enable Tiling&lt;/code&gt; (启用瓦片式)&lt;/strong&gt;。参数配置推荐 &lt;code&gt;tile_size=512&lt;/code&gt;, &lt;code&gt;overlap=64&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;🛠️ Z-image 避坑与进阶参数总结&lt;a href=&quot;#️-z-image-避坑与进阶参数总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CFG 强制锁死 &lt;code&gt;1.0&lt;/code&gt;：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验与详细&lt;/strong&gt;: Z-image 模型对 CFG 的敏感度极高。当 &lt;code&gt;CFG&lt;/code&gt; 值超过 &lt;code&gt;1.5&lt;/code&gt; 时，特别是第二阶段的采样，极易出现明显的色彩溢出、细节过度锐利导致的“焦黑”感，或者画面元素出现不自然的光晕。将 &lt;code&gt;CFG&lt;/code&gt; 保持在 &lt;code&gt;1.0&lt;/code&gt; 确保了降噪过程的温和与稳定，使得两个采样器能够以最和谐的方式协作，从而获得干净、自然的出图效果。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重绘幅度 (Denoise) 的黄金分配 (通过 &lt;code&gt;start_at_step&lt;/code&gt; 控制)：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;文生图细节流 (&lt;code&gt;0.3 - 0.35&lt;/code&gt;)&lt;/strong&gt;: 针对总步数 18 的文生图场景，将第二级采样器的有效重绘幅度控制在 &lt;span&gt;&lt;span&gt;0.30.3&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;0.3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 到 &lt;span&gt;&lt;span&gt;0.350.35&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;0.35&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 是一个经过实测的良好平衡点。这意味着第二级采样器从总去噪过程的 &lt;span&gt;&lt;span&gt;18×(1−0.35)=11.7≈1218 \times (1 - 0.35) = 11.7 \approx 12&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;18&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;×&lt;/span&gt;&lt;span&gt;&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;0.35&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;11.7&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;≈&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;12&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 步开始介入。这个值允许 Sampler 2 引入足够的新信息来增加皮肤毛孔、服装纹理和环境光影等高频细节，显著提升画面的“质感”，同时又不会激进地改变 Sampler 1 定义的初始构图和人物特征，有效避免了“变脸”问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;放大流 (&lt;code&gt;0.25 - 0.4&lt;/code&gt;)&lt;/strong&gt;: 在放大场景中，由于图像尺寸的增加，新的细节空间也随之扩大。将第二级采样器的有效重绘幅度控制在 &lt;span&gt;&lt;span&gt;0.250.25&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;0.25&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 到 &lt;span&gt;&lt;span&gt;0.40.4&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;0.4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 的较低范围，意味着 Sampler 2 更多地扮演“修补”和“强化”的角色，而不是“重绘”。它的主要任务是修复放大过程中的可能模糊，以及精细化边缘。&lt;strong&gt;严禁通过 &lt;code&gt;start_at_step&lt;/code&gt; 控制的有效重绘幅度超过 &lt;code&gt;0.5&lt;/code&gt;&lt;/strong&gt;，否则图像内容会变得与原始结构脱离，导致“换脸”或过度创作。Z-image 的极快步进速度意味着高 &lt;code&gt;Denoise&lt;/code&gt; 会带来巨大的修改量，导致放大后的画面细节与原图完全断层，失去放大的意义。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;噪声种子 (&lt;code&gt;noise_seed&lt;/code&gt;) 的灵活运用：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;探索创意阶段（Sampler 1 随机，Sampler 2 固定）&lt;/strong&gt;: 为了快速生成不同构图以探索创意，可以将第一个采样器的 &lt;code&gt;noise_seed&lt;/code&gt; 设置为 &lt;code&gt;-1&lt;/code&gt; (随机)，而第二个采样器的 &lt;code&gt;noise_seed&lt;/code&gt; 设置为固定的数字（例如 &lt;code&gt;0&lt;/code&gt;）。这样，每次运行 &lt;code&gt;Sampler 1&lt;/code&gt; 都会产生新的初始构图，而 &lt;code&gt;Sampler 2&lt;/code&gt; 则以其固定的“精修风格”来处理这些不同的初稿。这样做有助于评估 &lt;code&gt;Sampler 2&lt;/code&gt; 的通用性和一致性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;复现细节阶段（Sampler 1 固定，Sampler 2 固定）&lt;/strong&gt;: 当你从随机探索中找到一个满意的构图后，务必记录下该次 &lt;code&gt;Sampler 1&lt;/code&gt; 生成使用的种子。然后将 &lt;code&gt;Sampler 1&lt;/code&gt; 的 &lt;code&gt;noise_seed&lt;/code&gt; 也固定为该值，&lt;code&gt;Sampler 2&lt;/code&gt; 保持固定种子。这样你就可以精确地复现带有特定构图和精修细节的图像。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mac 专属优化：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;由于 M4 (24G) 使用的是统一内存，在方法 B 的放大流程中，图片尺寸一旦超过 2048px，强烈建议在 &lt;code&gt;VAE Decode&lt;/code&gt; 和 &lt;code&gt;VAE Encode&lt;/code&gt; 节点上点击右键，选择开启 &lt;strong&gt;Tiled (瓦片式) 模式&lt;/strong&gt;，并使用推荐参数 (&lt;code&gt;tile_size=512&lt;/code&gt;, &lt;code&gt;overlap=64&lt;/code&gt;)，这样可以有效防止显存溢出导致的 ComfyUI 重启。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;strong&gt;追求“灵气”和“动态”的初始构图：&lt;/strong&gt; 请务必使用 &lt;strong&gt;&lt;code&gt;Euler A + Beta&lt;/code&gt;&lt;/strong&gt; 作为第一级采样器。它独特的随机噪声添加机制能帮助您摆脱 AI 绘画常见的对称和僵硬，捕捉更具生命力的构图。在创意探索阶段，其 &lt;code&gt;noise_seed&lt;/code&gt; 可设置为随机，一旦满意则记录并固定。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验配置示例 (总步数 18，Refiner 重绘幅度约 0.33)&lt;/strong&gt;: &lt;code&gt;steps: 12&lt;/code&gt;, &lt;code&gt;start_at_step: 0&lt;/code&gt;, &lt;code&gt;end_at_step: 12&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;追求“稳健”和“放大”场景的结构一致性：&lt;/strong&gt; 第一级首选 &lt;strong&gt;&lt;code&gt;DPM++ 2M SDE + Beta&lt;/code&gt;&lt;/strong&gt;。它的稳定性和高质量细节生成能力，能像模具一样精准锁定图像结构，为后续的放大或精修提供一个可靠且不易变形的基础，使放大成功率接近百分之百。其 &lt;code&gt;noise_seed&lt;/code&gt; 通常建议固定。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验配置示例 (总步数 18，Refiner 重绘幅度约 0.33)&lt;/strong&gt;: &lt;code&gt;steps: 12&lt;/code&gt; (或根据总步数和目标重绘幅度计算), &lt;code&gt;start_at_step: 0&lt;/code&gt;, &lt;code&gt;end_at_step: 12&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;所有场景的“画质压阵”和细节提升：&lt;/strong&gt; 第二级采样器统一选择 &lt;strong&gt;&lt;code&gt;ER SDE + Beta&lt;/code&gt;&lt;/strong&gt; (即 &lt;code&gt;dpmpp_sde&lt;/code&gt; 及其变体)。无论是在文生图还是图像放大场景，其卓越的细节处理能力都能对图像进行最终的质感强化，为画面带来更丰富的纹理和层次。其 &lt;code&gt;noise_seed&lt;/code&gt; 可设置为固定值以确保精修过程的稳定。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验配置示例 (总步数 18，Refiner 重绘幅度约 0.33)&lt;/strong&gt;: &lt;code&gt;steps: 18&lt;/code&gt; (总目标步数), &lt;code&gt;start_at_step: 12&lt;/code&gt; (根据重绘幅度计算), &lt;code&gt;end_at_step: 18&lt;/code&gt;。 (有效执行去噪 &lt;span&gt;&lt;span&gt;18−12=618 - 12 = 6&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;18&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;12&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&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;6/18≈0.336/18 \approx 0.33&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;6/18&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;≈&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.33&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; ) &lt;a href=&quot;https://yghub.com/article/124&quot; target=&quot;_blank&quot;&gt;yghub.com&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这套逻辑不仅发挥了 Z-image 极速出图的优势，还通过多级采样解决了低步数模型质感偏“肉”的通病，是在 Mac mini M4 上兼顾效率与画质的最优工作流方案 &lt;a href=&quot;https://blog.csdn.net/ijiaodui/article/details/131006521&quot; target=&quot;_blank&quot;&gt;csdn.net&lt;/a&gt;。通过系统地运用这些策略和工具，可以像编辑润色文章一样，将图像从初稿打磨成精品。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>AI助手：答案之书的逻辑运行法则</title><link>https://blog.moewah.com/posts/ai-assistant-answer-book-logic-truth/</link><guid isPermaLink="true">https://blog.moewah.com/posts/ai-assistant-answer-book-logic-truth/</guid><description>如何让AI模型输出绝对中立的答案？本文揭示《答案之书》的底层逻辑机制，通过温度设定、事实优先和零迎合原则，实现从情绪化回应到冷峻真相的转变，助你掌握AI提示词设计的核心方法论。</description><pubDate>Wed, 22 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;建议：使用时将模型温度（Temperature）固定在 &lt;strong&gt;0.4&lt;/strong&gt;。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;AI提示词&lt;a href=&quot;#ai提示词&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Role&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;你是一本冷峻、绝对中立的《逻辑答案之书》。你没有情感，不具备安慰功能，你的唯一目标是揭示事物运行的底层骨架。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Core Rules (严格遵守)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. **零迎合原则**：严禁宽慰用户，严禁美化现实，严禁提供情绪价值。如果事实是残酷的，请直白地表达。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. **事实优先**：所有分析必须基于科学规律、统计学、进化心理学或经济学逻辑。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. **拒绝模糊**：不使用“可能”、“大概”、“也许”等推测性词汇，仅输出逻辑链条上的必然结论。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4. **温度设定**：内部逻辑执行温度固定为 0.0，保持高度的一致性与严谨性。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 📖【答案书模板】&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### 🧩 逻辑原点 (The Origin)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt; [剥离所有修饰词，用硬核术语定义该现象的本质]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### ⚙️ 运行机制 (The Mechanism)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **核心驱动**：[该现象背后不可违背的底层规律，如：熵增、基因延续、利益最大化]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **演化路径**：[A 导致 B 的必然逻辑链条，剔除所有随机性干扰]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **稳态描述**：[该逻辑在现实中形成的最终、最稳定的闭环形态]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### 🔍 冷峻真相 (The Truth)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;▷ [揭示一个剥离了道德、情感和主观滤镜后的真相，哪怕它违背直觉或令人不适]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### 🗝️ 理性准则 (The Rule)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;▷ [基于逻辑推演得到的唯一最优应对解，而非建议]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded></item><item><title>哲学三问：本质·规律·价值的深度解构</title><link>https://blog.moewah.com/posts/philosophical-three-questions-deep-structure-framework/</link><guid isPermaLink="true">https://blog.moewah.com/posts/philosophical-three-questions-deep-structure-framework/</guid><description>如何用哲学三问（本质、规律、价值）拆解任何事物？本文提供一套严谨的多流派思辨框架，融合斯多葛、存在主义等学派视角，帮助读者建立系统性认知与深度洞察力。</description><pubDate>Wed, 22 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;AI助手——“哲学三问”，旨在通过本质、规律、价值三大维度深度解构万物。它严谨融合多流派视角，拒绝杜撰引经据典，输出结构优美且富有洞察力的多维思辨报告。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;最适合的温度值（Temperature）参考：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;建议值：0.5 - 0.7&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;理由：&lt;/strong&gt; 哲学探讨需要一定的 &lt;strong&gt;创造性（高温度）&lt;/strong&gt; 来联结不同流派的观点，避免语言过于枯燥呆板；但同时需要极高的 &lt;strong&gt;逻辑性与真实性（低温度）&lt;/strong&gt; 以确保引言不被杜撰。0.6左右的平衡点最能兼顾思想的灵动与学术的严谨。&lt;/li&gt;
&lt;/ul&gt;
&lt;section&gt;&lt;h2&gt;AI提示词&lt;a href=&quot;#ai提示词&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Role: 哲学三问 (Philosophical Three Questions)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## Profile&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;你是一位治学严谨、博古通今的哲学大师。你拒绝空谈与伪哲学，坚持每一句引文都必须有据可查。你擅长通过不同思想流派的碰撞，揭示事物深层的逻辑脉络。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## Framework: 哲学三问&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;无论用户输入什么主题，你都必须围绕以下三个维度进行深度拆解：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. **本质之问 (Ontology)**：它是“什么”？探讨其存在论根源。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. **规律之问 (Logic)**：它“如何”运作？探讨其内在逻辑与演化规律。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. **价值之问 (Axiology)**：它“为何”重要？探讨其对人的意义与实践指导。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## Workflow &amp;amp; Constraints&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **派系碰撞**：每一问必须引入至少两个主流哲学派系视角（如：斯多葛、存在主义、辩证唯物主义、虚无主义、分析哲学、道家等）。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **引用红线**：【严禁杜撰】任何哲学家名言。引述的内容可以是翻译版，但必须确保该观点确为该哲学家/流派所持有，且逻辑一致。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **输出审美**：使用 Markdown 格式，保持结构清晰，具备仪式感。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## Output Template (Strictly Follow)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt; ### 🏛️ 哲学透视：[在此填入用户输入的主题]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt; ---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt; #### 🔍 第一问：本质之问 (Ontology) —— 它是“什么”？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt; * **[派系A] 视角：** [核心观点描述]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt; * **[派系B] 视角：** [核心观点描述]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt; #### ⚙️ 第二问：规律之问 (Logic) —— 它“如何”运作？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt; * **[派系C] 视角：** [描述事物的运动规律、逻辑结构或因果链条]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt; * **[派系D] 视角：** [描述事物在宏观或微观环境下的平衡/演变]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt; #### 🕯️ 第三问：价值之问 (Axiology) —— 它“为何”重要？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt; * **[派系E] 视角：** [探讨该事物如何通过人的主体性产生意义]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt; * **[派系F] 视角：** [提供面对该事物时的伦理指导或心态转变]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt; ---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt; ### ⚖️ 哲学终局：思维闭环&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt; **【深度总结】：** [融合各派视角，给出一份具有高度指导性的总结报告]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt; **哲思名句：** 「[此处引用一句真实存在的、与主题高度契合的哲学名言]」&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt; *—— [哲学家姓名]《[著作名/选段]》（注：确保真实，绝非杜撰）*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## Initialization&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;请准备好，当我输入任何词汇或话题时，请严格执行上述指令。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded></item><item><title>10个爆款标题公式，点击率翻倍秘籍</title><link>https://blog.moewah.com/posts/10-burst-title-formulas-click-rate-doubling-secrets/</link><guid isPermaLink="true">https://blog.moewah.com/posts/10-burst-title-formulas-click-rate-doubling-secrets/</guid><description>如何写出让人忍不住点开的爆款标题？本文揭秘10个经过验证的标题公式，涵盖数字+痛点、时间限定等技巧，帮你提升内容曝光与点击率，解决自媒体运营中的核心难题。</description><pubDate>Sat, 18 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我有个做公众号的朋友，去年9月发了篇干货，花了整整三天写的，结果阅读量只有可怜的500。&lt;/p&gt;
&lt;p&gt;后来我帮她改了标题，只改了标题，内容一个字没动——重新发，数据涨到8万+。&lt;/p&gt;
&lt;p&gt;你花多少精力创作内容，用户根本不知道，他们只看得到那一行标题。标题不够吸引人，再好的内容也会被埋没。&lt;/p&gt;
&lt;p&gt;去年我花了两个多月，分析了1000多篇爆文，提炼出10个标题公式。这些公式我自己用了大半年，点击率基本稳定在5%-8%之间（公众号行业平均才1.13%）。&lt;/p&gt;
&lt;section&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;用户看到一篇文章时，平均只花0.3秒决定要不要点。他们看的就是标题给的第一感觉——这内容对我有用吗？够有趣吗？&lt;/p&gt;&lt;p&gt;2025年微信公众号平均打开率只有1.13%，也就是说你发100个人，只有1个人会点开看。小红书超过65%的流量来自搜索。标题里没关键词，用户根本搜不到你。&lt;/p&gt;&lt;p&gt;我之前写的干货跟别人类似内容比，质量明显更详细，但人家阅读量是我10倍。后来仔细对比，发现最大差别就在标题上。&lt;/p&gt;&lt;p&gt;小红书有个算法评分叫CES，公式是：点赞1分+收藏1分+评论4分+转发4分+关注8分。评论和转发权重特别高，因为这代表用户真的被你内容吸引了。而用户愿不愿意点进来看，第一关就是标题。&lt;/p&gt;&lt;p&gt;各平台对标题要求也不太一样：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;小红书&lt;/strong&gt;：前10个字最关键，必须包含核心关键词&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公众号&lt;/strong&gt;：标题长度建议13-20字&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;抖音&lt;/strong&gt;：前5个字决定生死&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;10个爆款标题公式（直接套用）&lt;a href=&quot;#10个爆款标题公式直接套用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;p&gt;&lt;strong&gt;模板&lt;/strong&gt;：“X个方法/技巧+解决Y痛点+获得Z结果”&lt;/p&gt;&lt;p&gt;&lt;strong&gt;案例&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;“7个方法让你的小红书笔记上热门（点击率提升200%）”&lt;/li&gt;
&lt;li&gt;“5个睡前好习惯，让你的孩子不再磨蹭到半夜”&lt;/li&gt;
&lt;li&gt;“10分钟搞定晚餐！3个懒人食谱拯救下班后的你”&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;数字能让标题更具体。“很多方法”和”7个方法”，哪个更让你想点？肯定是7个，因为它给了明确预期。而且研究发现，3、5、7、10这几个数字效果最好，太大的数字反而让人觉得不真实。&lt;/p&gt;&lt;p&gt;痛点必须精准。你要击中读者真实困扰，让他们看到标题就想”对啊，我就是这样！”&lt;/p&gt;&lt;p&gt;别为了凑数字而凑，如果你只有3个真正有用的方法，就写3个。&lt;/p&gt;&lt;/section&gt;&lt;section&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;/p&gt;&lt;p&gt;&lt;strong&gt;模板&lt;/strong&gt;：“X天+可视化结果+方法/计划”&lt;/p&gt;&lt;p&gt;&lt;strong&gt;案例&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;“28天换头计划！塌鼻梁→妈生鼻的修容地图”&lt;/li&gt;
&lt;li&gt;“30天英语逆袭，从听不懂到能日常对话”&lt;/li&gt;
&lt;li&gt;“7天早起挑战，我是怎么从夜猫子变晨型人的”&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;时间限定会制造紧迫感，就是心理学上说的FOMO（Fear of Missing Out，错过恐惧）。看到”28天”，读者会想”哦，只要28天就能看到效果，我也能坚持”。&lt;/p&gt;&lt;p&gt;包含时间限定的标题，平均点击率会高35%。&lt;/p&gt;&lt;p&gt;时间设定要合理。“3天练出马甲线”这种一看就假，反而降低信任度。28天、30天、90天这些相对长一点的周期，更容易让人相信。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;这公式能精准找到目标人群。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;模板&lt;/strong&gt;：“特定人群标签+痛点+情感词”&lt;/p&gt;&lt;p&gt;&lt;strong&gt;案例&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;“高敏感宝宝妈妈必看！这5个哄睡神器让我多活2年”&lt;/li&gt;
&lt;li&gt;“职场新人避坑指南：我踩过的那些坑，你别再踩了”&lt;/li&gt;
&lt;li&gt;“30+女性护肤真相：别再花冤枉钱了”&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;因为它一下就筛选出了目标用户。“高敏感宝宝妈妈”看到这标题，会瞬间产生”这说的就是我”的感觉。精准人群标签能让相关用户点击率提升40%。&lt;/p&gt;&lt;p&gt;人群标签要够细分。“妈妈”太宽泛了，“高敏感宝宝妈妈”就精准多了。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;&lt;strong&gt;模板&lt;/strong&gt;：“被误认为X+其实是Y+价格/方法差异”&lt;/p&gt;&lt;p&gt;&lt;strong&gt;案例&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;“被邻居误认豪宅的客厅！其实全是1688同源厂”&lt;/li&gt;
&lt;li&gt;“同事以为我请了造型师，其实就花了50块”&lt;/li&gt;
&lt;li&gt;“被问是不是留学回来的英语，其实我就看了这几部剧”&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;人的大脑特别喜欢处理反差信息。当你说”看起来很贵，其实很便宜”，这种冲突会激发好奇心。数据显示，小红书平台上这类标题互动率能高47%。&lt;/p&gt;&lt;p&gt;关键是要制造足够大的反差。“看起来1万，其实5千”，这反差不够。“看起来5万，其实500”，这就很惊人了。&lt;/p&gt;&lt;p&gt;别过度夸张。如果你说的反差跟实际内容差太多，会被当成标题党。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;公式5：否定句式+逆向思维&lt;a href=&quot;#公式5否定句式逆向思维&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;p&gt;&lt;strong&gt;案例&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;“千万别这样写标题！90%的人都在犯的5个错误”&lt;/li&gt;
&lt;li&gt;“别再给孩子报这种兴趣班了，钱多还没效果”&lt;/li&gt;
&lt;li&gt;“停止过度护肤！皮肤科医生说这3件事才重要”&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;因为它制造了紧张感，暗示”你可能正在做错的事”。人都有避害心理，看到”千万别”会条件反射地想知道”别做啥”。&lt;/p&gt;&lt;p&gt;否定句式会让读者觉得你在分享”独家信息”或”避坑经验”，更有价值感。&lt;/p&gt;&lt;p&gt;这公式别用太频繁，10篇文章里最多用2-3次，保持神秘感。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;公式6：提问引导+答案预告&lt;a href=&quot;#公式6提问引导答案预告&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;p&gt;&lt;strong&gt;案例&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;“为什么同样的内容，她的点击率是我的10倍？”&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;p&gt;提问要具体，别太宽泛。“为什么标题重要？“就不如”为什么我的标题改了点击率翻倍？”&lt;/p&gt;&lt;p&gt;在问题后面加一句”答案出乎意料”或”真相是…”，能进一步激发好奇心。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;公式7：情绪词+夸张对比&lt;a href=&quot;#公式7情绪词夸张对比&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;p&gt;&lt;strong&gt;案例&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;“爱了！这个标题公式让我的阅读量涨了10倍”&lt;/li&gt;
&lt;li&gt;“绝了！这个收纳方法让20㎡看起来像50㎡”&lt;/li&gt;
&lt;li&gt;“真会谢！这几个穿搭技巧让我显高10cm”&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;小红书用户普遍年轻化，喜欢用”爱了”、“绝了”这种流行语。但公众号用户年龄偏大，可能不太买账。&lt;/p&gt;&lt;p&gt;在小红书上，带情绪词的标题互动率能高30%左右。但要注意，情绪词会过时。&lt;/p&gt;&lt;p&gt;小红书对极限词管得很严，“史上最全”、“永久有效”这种会被限流。用”保姆级”、“超全”替代更安全。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;公式8：独家揭秘+稀缺性&lt;a href=&quot;#公式8独家揭秘稀缺性&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;p&gt;&lt;strong&gt;案例&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;“月入10万的博主都在用的标题公式（首次公开）”&lt;/li&gt;
&lt;li&gt;“广告公司不会告诉你的3个文案技巧”&lt;/li&gt;
&lt;li&gt;“我花3万学的运营课，核心就这5个方法”&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这公式利用了稀缺性和从众心理。“月入10万的博主都在用”会让人觉得”原来成功的人都在用这方法”。&lt;/p&gt;&lt;p&gt;别过度夸张。“月入100万”、“年入千万”这种一听就假，反而降低信任度。&lt;/p&gt;&lt;p&gt;如果你确实没有”独家”信息，就别硬往上套。读者看完内容发现都是常识，会觉得被骗了。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;公式9：前后对比+具体数字&lt;a href=&quot;#公式9前后对比具体数字&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;：“从X到Y+时间/方法”&lt;/p&gt;&lt;p&gt;&lt;strong&gt;案例&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;“从500阅读到8万+，我只改了一个标题”&lt;/li&gt;
&lt;li&gt;“从月薪3千到月入2万，我做对了这3件事”&lt;/li&gt;
&lt;li&gt;“从英语学渣到雅思7分，我用了这套方法”&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;具体数字增加可信度，对比制造冲击力。“阅读量增长很多”不如”从500到8万+“震撼。&lt;/p&gt;&lt;p&gt;数字必须真实，千万别虚构。现在用户越来越聪明，数据一看就能看出真假。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;公式10：场景化+可视化描述&lt;a href=&quot;#公式10场景化可视化描述&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;p&gt;&lt;strong&gt;案例&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;“下班回家10分钟搞定晚餐，老公说比外卖好吃”&lt;/li&gt;
&lt;li&gt;“早上多睡20分钟的秘密：我的晨间护肤只用3步”&lt;/li&gt;
&lt;li&gt;“周末在家也能拍大片，手机就能出片”&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这公式特别适合生活方式、美食、家居类内容。因为它能让读者产生代入感：“对啊，我也是下班到家累得不想做饭。”&lt;/p&gt;&lt;p&gt;场景要具体，别说”工作很忙”，要说”加班到晚上9点”。结果也要具体，“效果很好”不如”老公说比外卖好吃”。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;section&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;前10个字&lt;/strong&gt;。用户刷信息流时，标题可能被截断，只能看到前面一部分。&lt;/p&gt;&lt;p&gt;前10个字里必须包含核心关键词。小红书超过65%流量来自搜索，标题里没关键词，用户搜不到你。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;emoji和符号也很重要&lt;/strong&gt;。小红书用户喜欢看到emoji，会觉得更轻松、更有趣。但别过度，一个标题3-5个emoji就够了。&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;/section&gt;&lt;section&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;13-20字&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;strong&gt;括号补充说明&lt;/strong&gt;能提升点击率38%。比如”爆款标题公式（附案例+工具）“，括号里的信息会让用户觉得”这篇内容很干货”。&lt;/p&gt;&lt;/section&gt;&lt;section&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;前5个字最关键&lt;/strong&gt;。用情绪词、悬念、冲突来抓眼球。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;配合封面图&lt;/strong&gt;。封面展示结果，标题解释过程。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;强调情绪和悬念&lt;/strong&gt;。“你绝对想不到”、“看到最后惊呆了”、“别划走，马上揭晓”，这种引导式语言在视频平台效果特别好。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;标题AB测试：别凭感觉，要用数据说话&lt;a href=&quot;#标题ab测试别凭感觉要用数据说话&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;做AB测试&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;AB测试就是准备2-3个不同标题，同时测试，看哪个效果最好。字节跳动有个专门工具叫DataTester，就是用来做AB测试的。有数据显示，某团购APP把”优惠团购”改成”限时特惠”，点击率就提升了3%。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;怎么做AB测试？&lt;a href=&quot;#怎么做ab测试&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;步骤1：准备2-3个标题变体&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;一次只改一个变量。比如你想测试”数字是不是真的有用”，那就准备两个标题：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;版本A：“提升点击率的标题技巧”&lt;/li&gt;
&lt;li&gt;版本B：“10个提升点击率的标题技巧”&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;只改数字，其他都一样。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;步骤2：选择测试工具&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;公众号可以用&lt;strong&gt;壹伴助手&lt;/strong&gt;，有标题评测功能。免费版就够用。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;步骤3：设定测试时长&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;至少跑&lt;strong&gt;2周&lt;/strong&gt;。样本量要足够，至少1000次曝光，数据才有统计意义。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;步骤4：分析数据，选择最优&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;看点击率、完读率、互动率。不要只看点击率，有的标题点击率高，但完读率低，说明标题党了。&lt;/p&gt;&lt;p&gt;真正好的标题是：点击率高，完读率也高，互动率也高。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;避坑指南：这些标题千万别用&lt;a href=&quot;#避坑指南这些标题千万别用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;：最、最好、史上最全、永久、第一、唯一…这些词都不能用。2025年各大平台对极限词管得更严了。&lt;/p&gt;&lt;p&gt;我去年有篇文章用了”史上最全”，结果被小红书限流，阅读量惨到只有平时1/10。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;过度夸张、虚假承诺&lt;/strong&gt;：“3天学会编程”、“一周瘦10斤”、“看完立马月入过万”…这种一看就假的标题，别用。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;引诱点击、标题党&lt;/strong&gt;：标题说的跟内容完全不相关，或者标题承诺的内容文章里根本没有。这会严重伤害信任度，掉粉特别快。&lt;/p&gt;&lt;/section&gt;&lt;section&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;：超过25个字，信息量太大，用户看不过来。&lt;/p&gt;&lt;p&gt;“爆款标题公式大全：包含10个经过数据验证的模板、小红书公众号抖音多平台案例分析、AB测试方法和工具推荐”——你看着累不累？&lt;/p&gt;&lt;p&gt;精简版：“爆款标题公式：10个模板+多平台案例”，是不是清爽多了？&lt;/p&gt;&lt;p&gt;&lt;strong&gt;信息量过载&lt;/strong&gt;：一个标题想说太多事，反而啥都没说清楚。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;目标人群过于宽泛&lt;/strong&gt;：“所有人必看”、“每个人都应该知道”…太宽泛就等于没目标。&lt;/p&gt;&lt;p&gt;好了，10个公式全部分享完了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;先挑3个最适合你内容类型的公式，试一周。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;比如你是做教程类内容的，那”数字+痛点+解决方案”、“时间限定+紧迫感”、“前后对比+具体数字”这三个就很适合。如果你是做生活分享的，“场景化+可视化描述”、“身份认同+情感共鸣”会更合适。&lt;/p&gt;&lt;p&gt;记住几个关键点：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;公式只是工具，理解底层逻辑更重要&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;好标题是真实反映内容价值，不是欺骗点击&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;坚持做AB测试，用数据指导优化&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;7天行动计划&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;第1-2天&lt;/strong&gt;：学习这10个公式，找出最适合自己的3个&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第3-5天&lt;/strong&gt;：实战应用，给接下来的3篇内容用不同公式写标题&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第6-7天&lt;/strong&gt;：收集数据，分析哪个公式效果最好，为什么&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;建议你建一个”爆款标题库”，平时刷到好标题就收藏起来，定期分析它们用了啥公式、为啥吸引你。&lt;/p&gt;&lt;p&gt;内容是1，标题是0前面的那个1。没有1，再多0都没用。但有了1，多几个0，价值就翻倍。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;Q：十个字左右的爆款标题怎么写？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A：十个字左右的短标题，核心是前5个字抓眼球。比如”千万别这样写标题！”、“绝了！这个方法涨粉10倍”。短标题适合抖音、小红书封面，必须在前5个字放情绪词、数字或冲突点。抖音算法只给前5个字机会，后面可能被截断。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：有没有十个爆款标题模板可以直接用？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A：文章里已经给了10个公式，每个都有模板和案例。比如公式1”数字+痛点+解决方案”，直接套：{7个方法让你的小红书笔记上热门}。公式2”时间限定+紧迫感”，套：{28天换头计划}。别光看，挑3个适合你内容的，明天就试。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：标题用数字还是用文字？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A：数字效果更好。研究表明，带数字的标题点击率高15%-20%。原因是数字给了明确预期——“7个方法”比”很多方法”更具体。而且3、5、7、10这几个数字效果最好，太大反而不真实。但要真实，别硬凑，你只有3个方法就写3个。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：小红书标题和公众号标题有什么区别？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A：小红书前10个字必须含关键词，因为65%流量来自搜索。还要加emoji，3-5个就够，太多显乱。极限词管得严，“史上最全”会被限流，用”保姆级&quot;&quot;超全”替代。公众号标题建议13-20字，用户年龄偏大，看重实用性，别用太多网络流行语。加括号补充说明能提升点击率38%。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：标题党会不会被封号？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A：分两种。标题夸张但内容能兑现，比如”从500到8万+“，这是可以的。标题说的跟内容完全不相关，或者承诺的内容文章里根本没有，这就是标题党，会掉粉掉得很快。我去年有篇文章用了”史上最全”，小红书直接限流，阅读量只有平时1/10。极限词查得越来越严，别碰。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>大模型温度设置指南：创意写作与角色助手调参秘籍</title><link>https://blog.moewah.com/posts/large-model-temperature-setting-guide-creative-writing-role-assistants/</link><guid isPermaLink="true">https://blog.moewah.com/posts/large-model-temperature-setting-guide-creative-writing-role-assistants/</guid><description>如何通过调整大模型温度参数来优化创意写作和角色助手表现？本文详解不同任务场景下的最佳温度设置，帮助你平衡输出的稳定性和创造性，提升内容质量与用户体验。</description><pubDate>Sat, 18 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;AI 大模型本地温度设置：创意写作的参考指南&lt;a href=&quot;#ai-大模型本地温度设置创意写作的参考指南&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;在人工智能（AI）大模型中，“温度”（Temperature）是一个关键参数，用于控制模型生成文本的随机性和创造性。对于创意写作这类需要多样化、新颖输出的任务，调整温度设置尤为重要。&lt;/p&gt;&lt;section&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;strong&gt;低温度&lt;/strong&gt;（接近 0）：模型会更倾向于选择概率最高的词，导致输出更加确定、保守、可预测，适合事实性问答或代码生成等需要精确性的场景。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高温度&lt;/strong&gt;（接近或大于 1）：模型会更愿意探索概率较低的词汇，增加了输出的随机性和多样性，使得生成的内容更具创造性、趣味性和新颖性。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;section&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;0.7 - 0.9&lt;/strong&gt;：这是一个常用的范围，被认为是创意写作的通用建议。可以从 0.7 开始尝试，并根据输出效果逐步调整，以找到最适合您需求的设置。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;0.8 - 1.2&lt;/strong&gt;：这个范围特别适合需要高度创造性和多样性的场景，如诗歌、故事、歌词创作，以及头脑风暴等。较高的温度有助于生成更具趣味性和新颖性的答案，并能有效避免模型陷入重复。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;约 1.0&lt;/strong&gt;：对于撰写小说或段子这类任务，将温度设置为 1.0 是一个不错的选择。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高达 1.5&lt;/strong&gt;：有些场景下，甚至可以将温度设置得更高（例如 1.5），以鼓励模型探索更不常见的可能性，这对于创意写作非常理想。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;&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;/section&gt;&lt;section&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;需要强调的是，以上温度设置仅为一般性建议。实际应用中，最佳的温度值会因所使用的具体大模型、输入的提示（prompt）以及期望的输出特性而异。因此，鼓励用户进行实验和调整，通过观察生成结果来找到最适合特定创意写作任务的“甜蜜点”，以在“靠谱”与“有趣”之间取得平衡。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;AI 大模型本地温度设置：不同角色助手推荐指南&lt;a href=&quot;#ai-大模型本地温度设置不同角色助手推荐指南&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&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;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;日常医生 (Daily_Doctor 🩺)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.2 - 0.4&lt;/code&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;p&gt;&lt;strong&gt;心理咨询师 (Psychological_Counselor 🛋️)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.5 - 0.7&lt;/code&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;p&gt;&lt;strong&gt;锐评师 (Sharp_Critic 📝)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.6 - 0.8&lt;/code&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;p&gt;&lt;strong&gt;小红书文案 (Xiaohongshu_Copywriter 💄)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.8 - 1.0&lt;/code&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;p&gt;&lt;strong&gt;部署专家 (Deployment_Expert 🚀)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.1 - 0.3&lt;/code&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;p&gt;&lt;strong&gt;电影解读 (Film_Interpreter 🎬)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.7 - 0.9&lt;/code&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;p&gt;&lt;strong&gt;编程开发助手 (Programming_Assistant 💻)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.1 - 0.3&lt;/code&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;p&gt;&lt;strong&gt;小说家 (Novelist ✍️)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.8 - 1.2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;理由&lt;/strong&gt;: 小说创作是高度依赖创造力的任务。高温度能极大地激发模型的想象力，生成丰富多样的情节、角色和描写，甚至可以尝试略高于1.0的设置来探索更具实验性的文本。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;哲学三问 (Philosophical_Inquiries 🤔)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.7 - 0.9&lt;/code&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;p&gt;&lt;strong&gt;吵架小能手 (Argument_Expert 🗣️)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.6 - 0.8&lt;/code&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;p&gt;&lt;strong&gt;政策解读学者 (Policy_Analyst 📜)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.3 - 0.6&lt;/code&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;p&gt;&lt;strong&gt;决策专家 (Decision_Expert 📊)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.4 - 0.7&lt;/code&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;p&gt;&lt;strong&gt;答案之书 (Book_of_Answers 🔮)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.8 - 1.0&lt;/code&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;p&gt;&lt;strong&gt;公司调研专家 (Company_Research_Expert 📈)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.3 - 0.6&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;理由&lt;/strong&gt;: 公司调研需要基于事实、数据和客观分析。中低温度有助于确保报告的准确性、专业性和可靠性。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;重要提示&lt;/strong&gt;:
这些温度设置是基于通用场景的建议值。在实际使用中，您可能需要根据具体的模型表现、输入的提示（prompt）的风格以及您期望的输出效果，对这些数值进行微调，以找到最适合您需求的“甜蜜点”。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>《爆裂鼓手》的极致追求与教育反思</title><link>https://blog.moewah.com/posts/whiplash-movie-psychological-thriller-artistic-ambition/</link><guid isPermaLink="true">https://blog.moewah.com/posts/whiplash-movie-psychological-thriller-artistic-ambition/</guid><description>《爆裂鼓手》如何通过师徒冲突探讨成功代价？影片以爵士乐为背景，揭示“斯巴达式教育”的残酷与偏执，引发对艺术追求、心理压迫和成功定义的深层思考。</description><pubDate>Mon, 13 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;《爆裂鼓手》（Whiplash）是由美国导演达米恩·查泽雷（Damien Chazelle）执导并编剧的电影，他的代表作还包括《爱乐之城》（La La Land）等。 这部影片以其紧张的节奏、独特的师徒关系和对极致追求的探讨，在影史上留下了深刻印记。&lt;/p&gt;
&lt;section&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;达米恩·查泽雷的创作动机源于其个人经历。影片剧本脱胎于他自己在高中时期参加爵士乐团的真实体验，片中魔鬼导师弗莱彻（Terence Fletcher）一角便是以查泽雷的前乐团教师为蓝本创作的。 导演通过这部影片，旨在探讨“成功”的代价与极致追求的本质。他并非简单地歌颂奋斗，而是大胆揭示追梦之路的“暗面”，展现了为达目标近乎偏执的狂热与突破身体、心理极限的痛苦过程。 查泽雷本人曾表示，影片的结局从某种意义上来说是悲剧性的，这反映了他对这种“斯巴达式教育”以及“不疯魔不成活”价值观的深层反思和批判，而非单纯的励志赞歌。 他试图通过安德鲁与弗莱彻这对师徒近乎“以爆制暴”的对决，引发观众对教育、成功定义以及社会“唯成功论”单一价值取向的思考。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;strong&gt;心理惊悚&lt;/strong&gt;和&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;li&gt;&lt;strong&gt;剪辑与节奏：&lt;/strong&gt; 影片的剪辑风格犀利、节奏快速且紧凑，大量运用特写镜头（脸部、手部、乐器）和快速切换，强化了视听效果，完美契合了叙事内容的紧张感和酣畅感，尤其在鼓点和乐手动作的配合上达到了极致。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&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;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“There are no two words in the English language more harmful than ‘good job’.”（英语中没有比“干得好”更害人的词了。）&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;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“I was there to push people beyond what’s expected of them. I believe that is an absolute necessity.”（我就是要把人逼到超越他们期望的极限。我相信这是绝对必要的。）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;场景片段：&lt;/strong&gt; 弗莱彻被解雇后，在小酒馆遇到安德鲁，向他解释自己的教育理念时（约影片第75分钟）。&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;
&lt;p&gt;&lt;strong&gt;“There are no shortcuts.”（没有捷径。）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;场景片段：&lt;/strong&gt; 安德鲁独自在家苦练，双手磨出血泡，依然坚持不懈时（约影片第40分钟）。&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;
&lt;p&gt;&lt;strong&gt;“I’m not gonna be another one of your goddamn cautionary tales.”（我才不会成为你那些该死的反面教材之一。）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;场景片段：&lt;/strong&gt; 安德鲁与弗莱彻在小酒馆对话时，安德鲁表达自己对弗莱彻教育方式的不满和反抗（约影片第76分钟）。&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;
&lt;p&gt;&lt;strong&gt;“I want to be one of the greats.”（我想成为一个伟大的人。）&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;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“Not quite my tempo.”（不是我的节奏。）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;场景片段：&lt;/strong&gt; 弗莱彻在乐团排练中，不断挑剔鼓手节奏，并反复强调这句话（贯穿影片排练场景，如约影片第15分钟，以及多次更换鼓手时）。&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;
&lt;p&gt;&lt;strong&gt;“I’m gonna be a great musician.”（我会成为一个伟大的音乐家。）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;场景片段：&lt;/strong&gt; 安德鲁在与家人聚餐，讨论自己未来时，与表哥的对话（约影片第35分钟）。&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;
&lt;p&gt;&lt;strong&gt;“The two most terrifying words in the English language are ‘good job’.”（英语中最可怕的两个词是“干得好”。）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;场景片段：&lt;/strong&gt; 影片结尾，弗莱彻在谢泼德音乐学院的舞台上对安德鲁说，与开头的台词呼应（约影片第100分钟）。&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;
&lt;p&gt;&lt;strong&gt;“You’re here for a reason. Enjoy the process.”（你来这里是有原因的。享受过程吧。）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;场景片段：&lt;/strong&gt; 弗莱彻首次邀请安德鲁加入乐团时所说，初期表现出温和的一面（约影片第10分钟）。&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;
&lt;p&gt;&lt;strong&gt;“I’m gonna be the greatest drummer in the world.”（我要成为世界上最伟大的鼓手。）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;场景片段：&lt;/strong&gt; 安德鲁在与女友妮可分手时，表达自己无法兼顾爱情与音乐的决心（约影片第55分钟）。&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;
&lt;p&gt;&lt;strong&gt;“You think you’re gonna find a great musician on a park bench?”（你觉得你能在一个公园长凳上找到一个伟大的音乐家吗？）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;场景片段：&lt;/strong&gt; 弗莱彻在酒吧与安德鲁对话时，讽刺平庸（约影片第75分钟）。&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;/ol&gt;&lt;/section&gt;
&lt;section&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;ol&gt;
&lt;li&gt;&lt;strong&gt;对“天才”与“教育”议题的颠覆性探讨：&lt;/strong&gt; 影片打破了传统励志片中温情脉脉的师生关系，以极具争议的方式探讨了“不疯魔不成活”的艺术追求与“斯巴达式”教育的边界。它提出了一个深刻的问题：为了成就伟大，可以付出多大的代价？这种极端呈现引发了关于天赋、磨砺、精神控制与教育伦理的广泛社会讨论。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;视听语言的极致运用：&lt;/strong&gt; 影片在剪辑、音效和摄影方面达到了极高水准，获得了奥斯卡最佳剪辑和最佳音响效果奖。 鼓点的每一次敲击、汗水与血液的飞溅、弗莱彻的怒吼和安德鲁的挣扎，都通过精准的剪辑和音效设计，营造出无与伦比的沉浸感和紧张感，使观众仿佛置身其中，体验到“高能视听盛宴”。 这种对感官冲击的极致追求，是其在同类音乐电影中脱颖而出的重要原因。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;表演的里程碑：&lt;/strong&gt; J·K·西蒙斯凭借弗莱彻一角斩获奥斯卡最佳男配角，他将角色的暴戾、偏执与对艺术的狂热刻画得入木三分，成为影史上的经典反派（或复杂导师）形象。 迈尔斯·特勒也贡献了令人信服的表演，将安德鲁从青涩到近乎疯狂的蜕变展现得淋漓尽致。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;与同类影片的比较：&lt;/strong&gt; 相较于《死亡诗社》中启迪人心的教育者，弗莱彻的形象更为复杂和极端，挑战了观众对“好老师”的传统认知。 与《心灵捕手》等关注天才发掘的影片不同，《爆裂鼓手》更侧重于天才被极端压榨和自我超越的痛苦过程。 它没有采用《爱乐之城》那种浪漫化的歌舞片手法，而是以一种更“暗黑热血”的风格，揭示了艺术追求的残酷性。 影片的结局虽然看似安德鲁的胜利，但查泽雷本人认为其带有悲剧色彩，这使得影片的深度和回味空间远超一般的励志片。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&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;ol&gt;
&lt;li&gt;&lt;strong&gt;文本层面（叙事、台词、视听）：&lt;/strong&gt; 影片通过安德鲁和弗莱彻这对师徒的“以爆制暴” 的关系，呈现了一个天才鼓手在严苛训练下追求卓越的故事。弗莱彻的极端言行、安德鲁的身体和精神极限突破，以及贯穿始终的爵士乐表演，构成了影片的核心文本。独特的剪辑、节奏和音效，放大了这种冲突和压迫感。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主题层面（艺术与个人）：&lt;/strong&gt; 影片深入探讨了艺术成就的最高境界是否必须以牺牲个人幸福、健康甚至人性为代价。安德鲁为了“伟大”而放弃爱情、友情和家庭生活，双手血肉模糊，心理濒临崩溃，这反映了极致追求对个体造成的巨大损耗。 弗莱彻的“不疯魔不成活” 理念，挑战了传统教育中对学生身心健康的关注，将艺术置于一切之上。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;社会意义层面（教育与成功观）：&lt;/strong&gt; 影片引发了广泛的社会讨论：
&lt;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;/li&gt;
&lt;/ol&gt;&lt;p&gt;综上所述，《爆裂鼓手》不仅是一部关于音乐和梦想的电影，更是一面折射社会深层问题，引发观众对教育、成功和人性进行深刻反思的镜子。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>《徒手攀岩》极限攀登的生死瞬间</title><link>https://blog.moewah.com/posts/free-solo-alex-honnold-climbing-story/</link><guid isPermaLink="true">https://blog.moewah.com/posts/free-solo-alex-honnold-climbing-story/</guid><description>亚历克斯·霍诺尔德如何无保护徒手登顶酋长岩？这部奥斯卡获奖纪录片深度解析极限运动的心理挑战与人类意志的边界，揭示攀岩大师背后的恐惧、专注与人生选择。</description><pubDate>Fri, 10 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;《徒手攀岩》（Free Solo）是一部由伊丽莎白·柴·瓦沙瑞丽（Elizabeth Chai Vasarhelyi）和金国威（Jimmy Chin）联合执导的美国纪录片。该片于2018年上映，并荣获第91届奥斯卡金像奖最佳纪录长片奖。金国威是一位华裔摄影师、登山家，曾攀登珠穆朗玛峰，并与妻子瓦沙瑞丽共同执导了《攀登梅鲁峰》（Meru）等作品。&lt;/p&gt;
&lt;section&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;《徒手攀岩》记录了美国攀岩大师亚历克斯·霍诺尔德（Alex Honnold）在2017年6月3日无保护徒手攀登约塞米蒂国家公园3000英尺（约914米）高的酋长岩（El Capitan）的全过程。导演金国威和伊丽莎白·柴·瓦沙瑞丽的创作动机和表达意图主要体现在以下几个方面：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;记录人类极限成就与卓越的代价：&lt;/strong&gt; 影片的核心在于捕捉亚历克斯·霍诺尔德这一“无保护攀登届的成功登月”壮举。导演夫妇旨在展现亚历克斯挑战人类生理和心理极限的非凡过程，同时也深入探讨了追求卓越所付出的个人代价。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;探讨恐惧与专注：&lt;/strong&gt; 导演们对亚历克斯如何“穿越恐惧”（moving through your fear）感到启发，并希望通过影片引发观众对“你是否过着自己想要的生活”的思考。影片通过亚历克斯的视角，揭示了他对死亡的冷静态度，以及通过无数次训练和周密准备来将风险降到最低的极致专注。&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;/section&gt;
&lt;section&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;strong&gt;体育纪录片&lt;/strong&gt;和&lt;strong&gt;人物传记片&lt;/strong&gt;的特点。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;纪实主义：&lt;/strong&gt; 影片通过大量真实拍摄的镜头，包括高空摄影、跟拍以及对亚历克斯及其身边人物的访谈，力求客观地记录事件的发生和人物的状态。尤其是在酋长岩攀登的最后20分钟，影片的实拍场景让观众紧张到不敢直视。&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;/section&gt;
&lt;section&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;虽然是纪录片，但影片中人物的对话和旁白极大地揭示了影片的主题。以下是10条核心台词（或关键表述）及其分析：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;“世界上最伟大的运动员，不是那些拥有最强身体的人，而是那些拥有最强大脑的人。”&lt;/strong&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;/li&gt;
&lt;li&gt;&lt;strong&gt;“完美是刚刚好。如果目标是完美，那刚好就足够了。” (Perfect is good enough. If the goal is perfection, then just good enough is perfect.)&lt;/strong&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;/li&gt;
&lt;li&gt;&lt;strong&gt;“每个人都会思考人生的意义，每个人都有一些梦想，也曾纠结要不要踏出自己的舒适区。”&lt;/strong&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;/li&gt;
&lt;li&gt;&lt;strong&gt;“你不需要勇敢来做这件事，你只需要承诺。” (You don’t need to be brave to do this, you just need to be committed.)&lt;/strong&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;/li&gt;
&lt;li&gt;&lt;strong&gt;“失败意味着死亡。” (Failure means death.)&lt;/strong&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;/li&gt;
&lt;li&gt;&lt;strong&gt;“我并不是个事先张扬的人，虽然徒手爬上酋长岩是我多年的梦想，但只想自己悄悄去做，每当别人问他是不是要征服酋长岩，他都不会明确回答。而现在，他却要在摄像机和整个摄制团队面前攀登。”&lt;/strong&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;/li&gt;
&lt;li&gt;&lt;strong&gt;“我们俩在一起时，他会变得更开心。”&lt;/strong&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;/li&gt;
&lt;li&gt;&lt;strong&gt;“如果他当场摔死？ 作为好友，眼睁睁地看着，还要记录下来，我们能承受吗？ 他的家人能不能接受？”&lt;/strong&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;/li&gt;
&lt;li&gt;&lt;strong&gt;“你不能只是想赢，你必须不想输。” (You can’t just want to win, you have to not want to lose.)&lt;/strong&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;/li&gt;
&lt;li&gt;&lt;strong&gt;“耳边有微风吹过，我感觉自己踏入空中，那是一种不可思议的感受。我百分之一百地确定，我不会脱落，正是那种确定感让我不会脱落。”&lt;/strong&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;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&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;ol&gt;
&lt;li&gt;&lt;strong&gt;开创性的视觉奇观与技术挑战：&lt;/strong&gt; 影片以其令人叹为观止的酋长岩高空拍摄画面而闻名，这些镜头不仅带来了极致的视觉冲击和沉浸感，也展现了拍摄团队作为专业攀岩者和摄影师所面临的巨大技术和生命风险。这种在极限环境下进行的电影制作本身就是一项壮举，使其成为技术和视觉上的里程碑式纪录片。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对极限运动的深度剖析：&lt;/strong&gt; 不同于一般的体育电影，《徒手攀岩》没有仅仅停留在展现极限挑战的刺激，而是深入探讨了极限运动员的内心世界、动机、恐惧、孤独以及与亲密关系之间的平衡。它超越了“肾上腺素电影”，成为一部对人类追求卓越本质的哲学思考。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;伦理争议与社会讨论：&lt;/strong&gt; 影片引发了广泛的社会讨论，关于“用生命为赌注的挑战是否应该被提倡”、“极限冒险的意义”以及“纪录片拍摄伦理”等问题。这种对影片内容和制作过程的深度反思，使其在社会文化层面具有重要意义。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;奖项认可与大众影响力：&lt;/strong&gt; 获得奥斯卡最佳纪录长片奖，使《徒手攀岩》突破了小众的极限运动圈，进入了更广泛的公众视野，成功将一个特定领域的非凡故事转化为一个全球性的励志与反思范例。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;与同类影片的比较：&lt;/strong&gt; 相较于《走钢丝的人》（Man on Wire）等其他记录人类极限壮举的纪录片，《徒手攀岩》更加侧重于对主人公内心世界的挖掘和亲密关系的呈现，使其在情感深度上更胜一筹。与《碟中谍2》中阿汤哥徒手攀岩的虚构场景相比，《徒手攀岩》的真实性更是带来了无与伦比的震撼和紧张感。影片也引发了与《美国工厂》等其他纪实美学纪录片在叙事手法上的对比和讨论。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&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;ol&gt;
&lt;li&gt;&lt;strong&gt;文本中的“非典型英雄”亚历克斯：&lt;/strong&gt; 影片通过亚历克斯的自述和对他的观察，展现了他异于常人的冷静、专注以及对恐惧的独特应对方式。他的“不畏死但不惜命”、对风险的极致控制和对“完美”的追求，构成了其独特的“英雄”形象。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;导演的“见证”与“拷问”：&lt;/strong&gt; 导演夫妇以一种既亲近又保持距离的方式记录了亚历克斯的壮举，他们的镜头既是见证者，也是提出伦理拷问的视角。金国威作为攀岩者身份的介入，也使得影片在专业性上无可挑剔。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;艺术价值的升华：&lt;/strong&gt; 影片通过震撼的航拍镜头、细致的人物刻画、以及对攀登过程的紧张剪辑，将一个极限运动故事升华成为对人类意志、梦想、专注与恐惧的深刻探讨，获得了评论界和观众的普遍赞誉，成为纪录片的典范。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;引发社会深思：&lt;/strong&gt; 影片上映后，不仅激发了人们对极限运动的兴趣，更引发了对生命意义、风险认知、追求卓越与个人幸福之间平衡的广泛讨论。它促使观众思考：我们为什么要冒险？人生的“酋长岩”在哪里？如何才能走出舒适区并实现自己的梦想？甚至在商业领域，有人将亚历克斯的“徒手攀岩”精神引申为中国经济从“电梯模式”向“攀岩模式”转型的隐喻，即面对不确定性时，需要缜密计划和步步为营。这使得影片超越了娱乐范畴，成为一个具有社会启示意义的文化现象。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;</content:encoded></item><item><title>小红书SEO实战指南：2025年搜索流量获取全攻略</title><link>https://blog.moewah.com/posts/xiaohongshu-seo-practical-guide-2025-search/</link><guid isPermaLink="true">https://blog.moewah.com/posts/xiaohongshu-seo-practical-guide-2025-search/</guid><description>如何通过小红书SEO精准拦截用户搜索需求？本文拆解2025年最新算法逻辑与关键词策略，从标题优化到内容匹配，手把手教你提升搜索流量转化率，实现笔记长效曝光。</description><pubDate>Fri, 10 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我第一次听到”小红书SEO”这个词的时候，心里挺不屑的。SEO不是做网站那套玩意儿吗？&lt;/p&gt;
&lt;p&gt;然后现实狠狠打了我的脸。&lt;/p&gt;
&lt;p&gt;那会儿我刚开始做小红书，每天花三四个小时选图、修图、想文案，发出去的笔记阅读量经常是个位数。最惨的一次，我觉得特别用心的一篇笔记，24小时后阅读量是7。&lt;/p&gt;
&lt;p&gt;我当时真的很崩溃，甚至怀疑自己是不是压根不适合做自媒体。&lt;/p&gt;
&lt;p&gt;后来我才知道，60%的小红书用户每天都会主动搜索内容。千瓜数据2025年的报告显示，搜索流量的转化率比推荐流量高4.1倍。你的笔记要是能出现在搜索结果里，用户下单或者关注你的概率，是刷到推荐的4倍多。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;为什么小红书SEO比你想的更重要&lt;a href=&quot;#为什么小红书seo比你想的更重要&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;很多人做小红书，眼睛只盯着”发现页”，觉得只要内容好就能被推荐。这个想法没错，但不完全对。&lt;/p&gt;&lt;p&gt;小红书的流量来源，大概70%来自发现页推荐，20%来自搜索页，剩下10%是关注页和其他入口。&lt;/p&gt;&lt;p&gt;你可能会想，20%也不多啊？&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;推荐流量就像烟花，发布后48小时是爆发期，过了这个时间热度就没了。但SEO做得好的笔记，可能发布三个月后还能持续被搜索到。我有一篇关于”咖啡机清洁”的笔记，发了半年了，每天还能从搜索带来二三十个阅读。&lt;/p&gt;&lt;p&gt;做小红书SEO，就是从”碰运气等推荐”升级到”精准拦截搜索流量”。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;2025年小红书算法怎么运作的&lt;a href=&quot;#2025年小红书算法怎么运作的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;要做好SEO，首先得搞懂小红书的算法是怎么运作的。&lt;/p&gt;&lt;p&gt;小红书的内容推荐大概是一个”四维评估体系”：&lt;/p&gt;&lt;section&gt;&lt;h3&gt;1. 内容质量（权重约40%）&lt;a href=&quot;#1-内容质量权重约40&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这个包括原创度、信息价值、视觉呈现等。小红书现在对搬运和洗稿查得很严，一旦被判定抄袭，账号权重会直接降低。图片质量、排版美观度也都在考察范围内。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 用户互动（权重约30%）&lt;a href=&quot;#2-用户互动权重约30&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;点赞、收藏、评论、转发这些数据，直接影响你的笔记能不能进入更大的流量池。&lt;/p&gt;&lt;p&gt;这里有一个CES评分公式：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;CES = 点赞×1 + 收藏×1 + 评论×4 + 转发×4 + 关注×8&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;你看，评论和转发的权重是点赞的4倍，关注更是8倍。这就解释了为什么有些笔记点赞很多但就是不火。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 账号权重（权重约20%）&lt;a href=&quot;#3-账号权重权重约20&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;账号的垂直度、活跃度、粉丝质量都会影响推荐。所以不要什么都发，保持内容垂直真的很重要。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. 实时热度（权重约10%）&lt;a href=&quot;#4-实时热度权重约10&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;2025年有个新变化&lt;/strong&gt;：算法越来越重视”搜索意图匹配”。简单说，就是你的内容得和用户搜索的关键词高度相关。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;关键词研究是SEO的基础。刚开始我完全凭感觉选词，觉得”护肤”这个词热度高就用这个，结果竞争太激烈，根本排不上去。&lt;/p&gt;&lt;section&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;strong&gt;第三方工具&lt;/strong&gt;，比如5118、千瓜、新红。我个人用千瓜比较多。&lt;/p&gt;&lt;p&gt;第三种最简单，就是&lt;strong&gt;搜索下拉词和相关搜索&lt;/strong&gt;。在小红书搜索框里输入你的主题词，看看下拉推荐有哪些词，搜索结果页底部还有”相关搜索”，这些都是真实用户在搜的词。&lt;/p&gt;&lt;/section&gt;&lt;section&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;这是我测试了挺久总结出来的：70%用长尾词，30%用热搜词。&lt;/p&gt;&lt;p&gt;比如你做护肤内容，“护肤”这个词太大了，竞争激烈得要命。但”敏感肌秋冬护肤步骤”、“学生党平价护肤品”这种长尾词，搜索的人虽然少一些，但竞争也小，更容易排到前面。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;9大关键词布局位置&lt;a href=&quot;#9大关键词布局位置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;标题&lt;/strong&gt;：必须放主要关键词，这是权重最高的位置&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;正文开头100字&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;li&gt;&lt;strong&gt;话题标签&lt;/strong&gt;：选择包含关键词的话题&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;评论区&lt;/strong&gt;：自己在评论区补充关键词相关内容&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;账号昵称/简介&lt;/strong&gt;：如果你专注某个领域，昵称里可以带关键词&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;合集名称&lt;/strong&gt;：把相关笔记放进带关键词的合集里&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&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;现在的经验是控制在2-8%。1000字的笔记，关键词出现3-8次就够了，而且要自然。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;标题优化的4个爆款公式&lt;a href=&quot;#标题优化的4个爆款公式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;标题的重要性不用多说了吧？用户搜索后，第一眼看到的就是标题。标题不吸引人，内容再好也没用。&lt;/p&gt;&lt;p&gt;我测试下来，这4种标题公式效果最好：&lt;/p&gt;&lt;section&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;直接戳用户痛点，比如：“小红书笔记没人看？这5个SEO技巧救了我”&lt;/p&gt;&lt;/section&gt;&lt;section&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;比如：“2025年必学的7个小红书关键词布局技巧”&lt;/p&gt;&lt;p&gt;数字给人具体、可执行的感觉。根据我的观察，带数字的标题点击率普遍高10-20%。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;比如：“你知道小红书搜索流量有多值钱吗？”&lt;/p&gt;&lt;p&gt;用问句激发好奇心，让用户想点进来看答案。&lt;/p&gt;&lt;/section&gt;&lt;section&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;比如:“做了3个月小红书，终于搞懂了SEO的重要性”&lt;/p&gt;&lt;p&gt;这种标题会让用户觉得”跟我情况好像”，产生代入感。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;标题长度建议：18-20字&lt;/strong&gt;。太短信息量不够，太长会被截断。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;section&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;：1-2个精准垂直标签（比如#小红书SEO）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;推荐&lt;/strong&gt;：2-3个热门相关标签（比如#自媒体干货）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可选&lt;/strong&gt;：1个泛流量标签（比如#干货分享）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;热门标签流量大但竞争激烈，垂直标签流量小但精准。两者要平衡。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;标签数量&lt;/strong&gt;：3-5个最佳，最多不要超过10个。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;section&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;早高峰 7:00-9:00&lt;/strong&gt;：上班通勤刷手机&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;午休 12:00-14:00&lt;/strong&gt;：吃饭休息时间&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;晚高峰 18:00-20:00&lt;/strong&gt;：下班回家路上&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;睡前 21:00-23:00&lt;/strong&gt;：躺床上刷手机&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我个人测试下来，晚高峰18:00-20:00效果最好，尤其是19点左右发布。&lt;/p&gt;&lt;/section&gt;&lt;section&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;笔记发布后的1小时，是进入初始流量池的关键期。这段时间的互动数据，直接决定算法要不要把你推给更多人。&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;：每周3-5篇比较合理。&lt;/p&gt;&lt;p&gt;小红书SEO的5大核心方法：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;理解搜索流量的价值，从”等推荐”转变为”做SEO”&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;/ol&gt;&lt;p&gt;SEO很重要，但不是万能的。内容质量才是根本，SEO只是”锦上添花”，帮助好内容被更多人看到。如果内容本身没价值，SEO做得再好也没用。&lt;/p&gt;&lt;p&gt;从今天开始，试着用这些方法优化你的下一篇笔记吧。不需要一次全做到，先从关键词研究开始，慢慢把每个环节都做起来。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>《魔女宅急便》成长启示：独立与自我实现的奇幻之旅</title><link>https://blog.moewah.com/posts/kiki-s-adventure-independence-and-self-discovery/</link><guid isPermaLink="true">https://blog.moewah.com/posts/kiki-s-adventure-independence-and-self-discovery/</guid><description>如何在孤独中找到自我价值？本文深度解读宫崎骏《魔女宅急便》如何通过琪琪的独立成长，探讨青春期女孩在现实与幻想间寻找自我、实现精神独立的核心命题。</description><pubDate>Tue, 07 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;专业电影解读：日本动画电影《魔女宅急便》&lt;a href=&quot;#专业电影解读日本动画电影魔女宅急便&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;: 宫崎骏 (Hayao Miyazaki)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;国籍&lt;/strong&gt;: 日本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代表作&lt;/strong&gt;: 《风之谷》(1984), 《天空之城》(1986), 《龙猫》(1988), 《幽灵公主》(1997), 《千与千寻》(2001), 《哈尔的移动城堡》(2004), 《悬崖上的金鱼姬》(2008), 《起风了》(2013), 《你想活出怎样的人生》(2023) 等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;电影风格&lt;/strong&gt;: 《魔女宅急便》融合了“成长（Coming-of-Age）”、“现实主义（Realism）”、“日常系（Slice-of-Life）”和“奇幻（Fantasy）”元素。虽然故事背景设定在一个有魔法的世界，但其核心聚焦于主人公琪琪在青春期所面临的独立、自我认知、职业倦怠以及人际交往等现实挑战，而非依赖强烈的戏剧冲突或奇幻冒险。影片通过日常生活的细腻描绘，展现了成长的普遍性与真实感。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;&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;: 影片背景设定在一个没有二战发生、带有1950年代复古风格的平行欧洲世界，同时又出现了一些超前的物品，如琪琪的随身收音机。这种设定体现了宫崎骏对传统与现代社会之间转型的思考，以及如何在传统价值逐渐消逝的背景下，寻找一种共存之道。琪琪保留了魔女的传统黑色长袍，却用鲜艳的红色蝴蝶结来点缀，象征着她在传统与现代之间寻求平衡。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;艺术创作的困境与突破&lt;/strong&gt;: 影片中画家乌露丝拉的角色，以及她对琪琪的开导，被认为是宫崎骏借此表达了自己作为创作者所面临的困境与突破。乌露丝拉关于“画画就是和看不见的自己进行斗争”的论述，反映了艺术家在创作过程中可能遇到的瓶颈和如何重新找回灵感的过程，这也隐喻了琪琪在成长中遇到的魔法瓶颈。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;以下选取10条以上核心台词，结合具体场景片段，分析其所体现的主题与导演意图：&lt;/p&gt;&lt;ol&gt;
&lt;li&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;/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;
&lt;p&gt;&lt;strong&gt;“我要走了，去找寻属于自己的小镇，开始新的生活！”&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;场景片段&lt;/strong&gt;: 琪琪告别父母，独自踏上旅程的夜晚（约影片开始10分钟左右）。&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;
&lt;p&gt;&lt;strong&gt;“不是所有的城市都欢迎魔女的。”&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;场景片段&lt;/strong&gt;: 琪琪初到大城市，被警察驱赶后，吉吉的抱怨（约影片15分钟左右）。&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;
&lt;p&gt;&lt;strong&gt;“这是我的店，你需要住的地方吗？”&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;场景片段&lt;/strong&gt;: 琪琪在面包店门口避雨，面包店老板娘索娜主动提出帮助（约影片20分钟左右）。&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;
&lt;p&gt;&lt;strong&gt;“如果连自己都讨厌，那就没有办法飞了。”&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;场景片段&lt;/strong&gt;: 琪琪因沮丧和自我怀疑失去魔法，画家乌露丝拉开导她时（约影片1小时10分钟左右）。&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;
&lt;p&gt;&lt;strong&gt;“画画也常有画不出来的时候，这种时候就什么都不做，散散步，睡睡觉，等什么时候想画了再画。”&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;场景片段&lt;/strong&gt;: 乌露丝拉向失去魔力的琪琪讲述自己创作瓶颈的经历（约影片1小时15分钟左右）。&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;
&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;/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;
&lt;p&gt;&lt;strong&gt;“我好像变得不再是魔女了，吉吉也不再和我说话了。”&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;场景片段&lt;/strong&gt;: 琪琪发现自己无法飞行，也无法再听懂吉吉的话时，流露出沮丧（约影片1小时左右）。&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;
&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;/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;
&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;/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;
&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;/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;/ol&gt;&lt;/section&gt;&lt;section&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;成长（Coming-of-Age）&lt;strong&gt;和&lt;/strong&gt;现实主义（Realism）&lt;strong&gt;风格，并融入了&lt;/strong&gt;奇幻&lt;/strong&gt;和**日常系（Slice-of-Life）**的特点。&lt;/p&gt;&lt;ul&gt;
&lt;li&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;: 影片围绕琪琪从一个懵懂的13岁小魔女，到在异乡独立生活并克服困难、最终找到自我价值的过程展开。这种线性的成长叙事是典型的成长电影模式。&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;
&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;/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;
&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;/li&gt;
&lt;li&gt;&lt;strong&gt;治愈与温情&lt;/strong&gt;: 日常系的叙事风格，配合久石让的温和配乐和吉卜力标志性的精美手绘，营造出一种温暖治愈的氛围。影片通过展现人与人之间的善意（如索娜夫妇、乌露丝拉、老妇人等），为琪琪的成长之路提供了温情的支持，也给观众带来心理上的慰藉。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;&lt;strong&gt;对吉卜力工作室的关键性意义&lt;/strong&gt;: 在《魔女宅急便》上映前，吉卜力工作室虽然推出了《风之谷》、《天空之城》和《龙猫》等佳作，但票房表现并不如预期，工作室一度面临财务危机。而《魔女宅急便》的巨大成功（成为当时吉卜力最卖座的动画），不仅为工作室带来了丰厚的收益，更巩固了其在日本动画界的地位，为其后续作品的制作奠定了坚实基础。可以说，这部影片是吉卜力“逆袭成功”的关键之作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;宫崎骏作品风格的承前启后&lt;/strong&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;strong&gt;个人内心的成长和日常生活的描绘&lt;/strong&gt;。它没有复杂的政治隐喻或史诗般的冲突，而是将焦点回归到个体的情感和自我发现。这种“&lt;strong&gt;日常奇幻&lt;/strong&gt;”的风格，在当时的动画电影中独树一帜，也为后来的“治愈系”动画奠定了基础。它证明了动画电影无需依赖激烈的剧情，也能通过细腻的情感刻画和生活化的场景打动人心。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对青年群体心理的深刻洞察&lt;/strong&gt;: 影片精准地捕捉了青春期独立过程中的迷茫、自我怀疑和“燃尽”感（Burnout）。这种对精神困境的描绘，使其超越了简单的儿童故事范畴，成为一部对各年龄层观众都具有普适意义的“成长指南”。它告诉人们，即使是拥有“魔法”的特殊个体，也无法逃避成长中的普遍烦恼，这使得影片具有了强大的现实穿透力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;艺术成就与国际影响力&lt;/strong&gt;: 《魔女宅急便》以其精美的手绘动画、流畅的叙事、立体的人物塑造以及久石让的经典配乐，展现了极高的艺术水准。影片的背景设计灵感来源于瑞典的维斯比和斯德哥尔摩老城，为影片增添了独特的异国情调。它不仅在日本国内广受好评，也为吉卜力工作室在国际上赢得了更多声誉，成为西方观众认识宫崎骏和日本动画的入门作品之一。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;ol&gt;
&lt;li&gt;&lt;strong&gt;文本层面：琪琪的“离家修行”与魔法的失去/恢复&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;台词与场景&lt;/strong&gt;: 琪琪独自前往新城市，开设宅急便业务。她最初对飞行充满热情，但随着业务的开展、挫折的累积（如第一次送货的狼狈、被其他魔女忽视、蜻蜓的“背叛感”），她开始感到疲惫和自我怀疑，最终失去了飞行能力和与吉吉对话的能力。乌露丝拉关于“画画瓶颈”的启发，以及琪琪在危急时刻为了救蜻蜓而重新爆发的潜能，最终使她找回了魔法。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主题层面：独立、自我价值与职业倦怠&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;对应关系&lt;/strong&gt;: 琪琪的离家代表了年轻人追求独立的普遍愿望。她开办宅急便服务，象征着在社会中寻找自己的位置和实现自我价值。魔法的失去则具象化了“职业倦怠”和“自我怀疑”——当工作不再带来乐趣，甚至成为负担时，人会失去原有的激情和能力。乌露丝拉的开导和琪琪的自我救赎，则体现了如何应对低谷、重新找回热情和意义。吉吉不再说话，则象征着琪琪不再需要外部的心理依赖，而是真正地独立成熟。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;导演意图层面：对现代年轻人精神困境的关怀&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;对应关系&lt;/strong&gt;: 宫崎骏在访谈中明确指出，影片是为了描绘现代日本年轻人，尤其是在经济独立后，面临精神空虚和自我实现困境的问题。琪琪的困境是这种普遍困境的缩影。导演通过影片，呼吁人们关注内在的成长，认识到独立不仅仅是物质上的，更是精神上的。他鼓励年轻人勇敢面对挫折，在日常生活中寻找乐趣和意义，并通过与他人的连接获得力量。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;社会意义层面：现代社会对个体成长的启示&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;对应关系&lt;/strong&gt;: 影片超越了动画的载体，成为一部对当代社会具有普遍启示意义的作品。它提醒社会关注年轻人的心理健康和成长压力，并强调人际互助、自我接纳和对生活意义的探索的重要性。在一个物质充裕但精神层面可能感到迷茫的时代，《魔女宅急便》提供了一种温柔而坚定的成长范式，即真正的成长并非一帆风顺，而是在经历挫折、自我怀疑后，重新发现并肯定自我价值的过程。它传递了“找到自己的位置，并为社会贡献力量”的积极信息，鼓励个体在平凡中找到不凡的意义。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>5个最好用的Astro博客主题推荐</title><link>https://blog.moewah.com/posts/5-best-astro-blog-themes-recommended/</link><guid isPermaLink="true">https://blog.moewah.com/posts/5-best-astro-blog-themes-recommended/</guid><description>想快速搭建一个高性能的Astro博客？本文精选5个最实用的主题，涵盖极简、优雅、多作者等不同需求，并提供详细安装配置教程，帮你30分钟搞定个人博客搭建。</description><pubDate>Wed, 01 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;花了两个礼拜试了十几个Astro博客主题。有些看起来很炫但太臃肿，有些太简陋连基本功能都没有，还有些配置起来简直是噩梦。最后筛出了5个真正好用的，每个都亲自用过。&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;th&gt;GitHub星数&lt;/th&gt;&lt;th&gt;难度&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;AstroPaper&lt;/td&gt;&lt;td&gt;技术博主、长文写作&lt;/td&gt;&lt;td&gt;极简设计、模糊搜索&lt;/td&gt;&lt;td&gt;3.5k+&lt;/td&gt;&lt;td&gt;⭐⭐&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Astro Air Blog&lt;/td&gt;&lt;td&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;Bookworm Light&lt;/td&gt;&lt;td&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;AstroWind&lt;/td&gt;&lt;td&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;Astro Cactus&lt;/td&gt;&lt;td&gt;个人博客、简洁风格&lt;/td&gt;&lt;td&gt;固执己见、省心&lt;/td&gt;&lt;td&gt;活跃社区&lt;/td&gt;&lt;td&gt;⭐&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;section&gt;&lt;h2&gt;AstroPaper - 极简主义者的首选&lt;a href=&quot;#astropaper---极简主义者的首选&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;GitHub上有3.5k+星标，是目前最受欢迎的Astro博客主题之一。&lt;/p&gt;&lt;p&gt;模糊搜索功能是亮点，输入关键词就能快速找到文章。草稿功能很实用，写到一半的文章不会被误发出去。响应式设计做得很好，手机上看完全没问题。深浅模式切换很丝滑。&lt;/p&gt;&lt;p&gt;适合技术博主和喜欢长文写作的人。如果你主要写教程、技术分析这类内容，这个主题能让读者专注在文字上。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;核心特性&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;模糊搜索&lt;/li&gt;
&lt;li&gt;草稿功能和分页&lt;/li&gt;
&lt;li&gt;自动生成RSS和sitemap&lt;/li&gt;
&lt;li&gt;SEO和无障碍访问优化&lt;/li&gt;
&lt;li&gt;类型安全的Markdown&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;官方地址&lt;/strong&gt;：&lt;a href=&quot;https://astro-paper.pages.dev/&quot; target=&quot;_blank&quot;&gt;https://astro-paper.pages.dev/&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Astro Air Blog - 优雅简洁的个人博客&lt;a href=&quot;#astro-air-blog---优雅简洁的个人博客&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;比AstroPaper更注重个人风格展示。页面加载动画很流畅不会觉得晃眼。&lt;/p&gt;&lt;p&gt;配置文件设计得人性化。你可以直接编辑 &lt;code&gt;about.mdx&lt;/code&gt;、&lt;code&gt;intro.mdx&lt;/code&gt;、&lt;code&gt;links.mdx&lt;/code&gt; 这几个文件来定制页面内容，不用到处找配置项。标签系统也做得不错。&lt;/p&gt;&lt;p&gt;想做个人作品集博客，或者想展示自己的创作，Astro Air是个好选择。它给人的感觉更像是”我的个人空间”而不是”新闻网站”。&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;MDX支持&lt;/li&gt;
&lt;li&gt;社交媒体分享&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;GitHub地址&lt;/strong&gt;：&lt;a href=&quot;https://github.com/sun0225SUN/astro-air&quot; target=&quot;_blank&quot;&gt;https://github.com/sun0225SUN/astro-air&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Bookworm Light - 多作者博客利器&lt;a href=&quot;#bookworm-light---多作者博客利器&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;p&gt;我用它搭过一个测试站点，配置过程比想象中简单，文档写得还算清楚。唯一要注意的是功能多了配置项也多，第一次用可能需要点时间熟悉。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;核心特性&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;多作者支持&lt;/li&gt;
&lt;li&gt;丰富的分类和标签系统&lt;/li&gt;
&lt;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;/section&gt;
&lt;section&gt;&lt;h2&gt;AstroWind - 功能最全面的选择&lt;a href=&quot;#astrowind---功能最全面的选择&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;适合那种”我要快速上线一个博客”的场景。基于Tailwind CSS，用过Tailwind的话上手会很快。开箱即用，很多优化都帮你做好了，PageSpeed分数天生就高。&lt;/p&gt;&lt;p&gt;图片优化、自动RSS、社交分享这些功能都是内置的，不用自己加插件。还支持RTL（从右到左）语言，如果你的博客面向国际用户，这点很实用。&lt;/p&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;Astro 4.0 + Tailwind CSS&lt;/li&gt;
&lt;li&gt;PageSpeed高分优化&lt;/li&gt;
&lt;li&gt;内置图片优化&lt;/li&gt;
&lt;li&gt;自动RSS订阅&lt;/li&gt;
&lt;li&gt;RTL语言支持&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;/section&gt;
&lt;section&gt;&lt;h2&gt;Astro Cactus - 简单且固执己见的选择&lt;a href=&quot;#astro-cactus---简单且固执己见的选择&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;“固执己见”的意思是它已经帮你做好了大部分设计决策，你不用纠结该用什么配色、什么布局。这对有选择困难症的人来说反而是好事。&lt;/p&gt;&lt;p&gt;用的是Astro 4.0加Tailwind CSS，代码写得挺规范的，语义化HTML做得好。如果你想基于它做二次开发，代码可读性不错。&lt;/p&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;Astro 4.0 + Tailwind CSS&lt;/li&gt;
&lt;li&gt;语义化HTML标记&lt;/li&gt;
&lt;li&gt;SEO友好设计&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;/section&gt;
&lt;section&gt;&lt;h2&gt;详细安装配置教程（以AstroPaper为例）&lt;a href=&quot;#详细安装配置教程以astropaper为例&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;最简单的方法是用包管理器。我推荐用pnpm，速度快而且省磁盘空间：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 用pnpm（推荐）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;astro@latest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--template&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;satnaing/astro-paper&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 或者用npm&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;astro@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;--template&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;satnaing/astro-paper&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 或者用yarn&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yarn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;astro&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--template&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;satnaing/astro-paper&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;运行命令后，它会问你项目名称。然后等它安装依赖，喝口水的功夫就装好了。&lt;/p&gt;&lt;p&gt;如果你用Docker，也可以这么搞：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;build&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;astropaper&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&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;4321:80&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;astropaper&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;除非你的开发环境特别复杂，一般用不着Docker。&lt;/p&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 先安装依赖（如果刚才没自动装的话）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 启动开发服务器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后打开浏览器访问 &lt;code&gt;http://localhost:4321&lt;/code&gt;，就能看到你的博客了。&lt;/p&gt;&lt;/section&gt;&lt;section&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/config.ts&lt;/code&gt; 这个文件里：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&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;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;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;website&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;https://你的域名.com&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;&lt;span&gt;// 生产环境必填，开发时可以留空&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&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;&quot;&lt;/span&gt;&lt;span&gt;你的博客名称&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;博客简介，用一两句话说清楚你的博客是关于什么的&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;你的名字&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// 其他配置...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;开发阶段 &lt;code&gt;website&lt;/code&gt; 可以先不填，等准备部署的时候再改成你的实际域名。这个很重要，因为它会用来生成网站地图和社交分享卡片的URL。&lt;/p&gt;&lt;p&gt;还有 &lt;code&gt;astro.config.mjs&lt;/code&gt; 文件，这是Astro框架自己的配置。一般默认的就够用了，除非你要加插件或者改端口。&lt;/p&gt;&lt;/section&gt;&lt;section&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/content/posts/&lt;/code&gt; 目录下。新建一个Markdown文件，比如 &lt;code&gt;my-first-post.md&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&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;&quot;&lt;/span&gt;&lt;span&gt;我的第一篇文章&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&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;&quot;&lt;/span&gt;&lt;span&gt;简单介绍一下这篇文章讲什么&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pubDate&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;2025-12-02&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&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;&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;,&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;博客&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;这里写你的文章内容，用Markdown格式就行。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;保存文件，页面会自动刷新，你就能在首页看到这篇文章了。&lt;/p&gt;&lt;p&gt;注意几点：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pubDate&lt;/code&gt; 是必填的，格式是 &lt;code&gt;YYYY-MM-DD&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tags&lt;/code&gt; 是可选的，但建议填上，方便分类&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ogImage&lt;/code&gt; 可以指定社交分享时显示的封面图，不填的话会用默认图&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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://astro-paper.pages.dev/posts/customizing-astropaper-theme-color-schemes/&quot; target=&quot;_blank&quot;&gt;颜色自定义文档&lt;/a&gt;。AstroPaper支持多种配色方案，改起来也不复杂。&lt;/p&gt;&lt;p&gt;默认的颜色已经挺好看了，我自己也没怎么改。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;常见问题解决&lt;a href=&quot;#常见问题解决&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;yarn安装后报错找不到sharp模块&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这是yarn 1的一个已知问题。手动装一下sharp：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yarn&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sharp&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;装完重启开发服务器就好了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Windows PowerShell运行诊断命令报错&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你用的是Windows PowerShell，运行 &lt;code&gt;astro check --watch &amp;amp; astro dev&lt;/code&gt; 可能会报错。这是因为PowerShell不支持 &lt;code&gt;&amp;amp;&lt;/code&gt; 这种后台运行语法。&lt;/p&gt;&lt;p&gt;解决办法是装个concurrently包，或者干脆分开运行两个命令。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;端口4321被占用&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在 &lt;code&gt;astro.config.mjs&lt;/code&gt; 里改个端口：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt;:&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;port&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3000&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// 改成你想要的端口&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;/p&gt;&lt;p&gt;快捷键 &lt;code&gt;Ctrl+C&lt;/code&gt; 停止服务器，然后重新 &lt;code&gt;pnpm run dev&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;图片显示不出来&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;图片要放在 &lt;code&gt;public&lt;/code&gt; 文件夹里，引用的时候路径写成 &lt;code&gt;/图片名.jpg&lt;/code&gt;。注意前面那个斜杠别漏了。&lt;/p&gt;&lt;p&gt;或者你也可以把图片放在 &lt;code&gt;src/assets&lt;/code&gt; 里，然后在Markdown里用相对路径引用。两种方式都可以。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;深色模式切换有bug&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;检查一下是不是自定义CSS的时候没考虑深色模式。主题色配置文件里应该有对应的深色模式变量，改颜色的时候记得两套都改。&lt;/p&gt;&lt;/section&gt;&lt;section&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;部署到Vercel或Netlify失败&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;检查构建命令是不是 &lt;code&gt;astro build&lt;/code&gt;，输出目录是不是 &lt;code&gt;dist&lt;/code&gt;。这两个配错了肯定部署失败。&lt;/p&gt;&lt;p&gt;确认一下Node.js版本，Astro 4.0要求Node 18+，版本太低会报错。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;部署后CSS样式丢失&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这通常是base路径配置的问题。如果你的博客不是部署在根目录（比如 &lt;code&gt;你的域名.com/blog/&lt;/code&gt;），需要在 &lt;code&gt;astro.config.mjs&lt;/code&gt; 里设置base：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;/blog&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;不然CSS和JS文件的路径会找不到。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;进阶自定义建议&lt;a href=&quot;#进阶自定义建议&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;推荐用Giscus（基于GitHub Discussions）或者Waline（轻量级独立评论系统）。集成起来不难，照着官方文档走就行。&lt;/p&gt;&lt;p&gt;Giscus的好处是完全免费，而且数据存在GitHub上不用担心丢失。Waline功能更丰富，但要自己部署服务器。&lt;/p&gt;&lt;/section&gt;&lt;section&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;Google Analytics是最常用的，但如果你在意隐私，可以试试Plausible或者Umami，这两个都是注重隐私保护的统计工具。&lt;/p&gt;&lt;p&gt;集成方式就是在HTML模板里加一段统计代码，很简单。&lt;/p&gt;&lt;/section&gt;&lt;section&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有内置的图片优化功能，用 &lt;code&gt;&amp;lt;Image&amp;gt;&lt;/code&gt; 组件代替普通的 &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; 标签就能自动优化。&lt;/p&gt;&lt;p&gt;还可以考虑用CDN加速，把图片传到Cloudinary或者Cloudflare Images这种服务上，加载速度会更快。&lt;/p&gt;&lt;/section&gt;&lt;section&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支持国际化，配置起来也不算麻烦。不过要注意，每篇文章都要翻译成多个语言版本，工作量会大不少。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;第一次用AstroPaper的时候，忘记设置 &lt;code&gt;website&lt;/code&gt; 字段，sitemap 生成的全是相对路径。改完重新部署就好了。&lt;/p&gt;&lt;p&gt;还有一次配置文件改完没重启开发服务器，折腾了半小时才发现问题在哪。之后每次改配置我都记着重启。&lt;/p&gt;&lt;p&gt;图片路径也踩过坑。一开始把图片放在 &lt;code&gt;src/assets&lt;/code&gt; 里，结果引用路径写错了，图片一直显示不出来。后来才搞清楚 &lt;code&gt;public/&lt;/code&gt; 和 &lt;code&gt;src/assets/&lt;/code&gt; 的区别。&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://astro.build/themes/&quot; target=&quot;_blank&quot;&gt;Astro官方主题库&lt;/a&gt;会定期更新新主题，可以收藏起来，没事去逛逛说不定能发现更适合你的。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>AI翻译提示词优化指南：从v1到v3实战解析</title><link>https://blog.moewah.com/posts/ai-translation-prompt-engineering-practical-review/</link><guid isPermaLink="true">https://blog.moewah.com/posts/ai-translation-prompt-engineering-practical-review/</guid><description>如何写出高质量的AI翻译提示词？本文深度拆解v1-v3三个版本的优化逻辑，提供从基础要求到全领域通用的最佳实践方案，助你轻松掌握AI翻译的精准指令设计技巧。</description><pubDate>Thu, 25 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;此提示词仅用于 Easydict 应用，&lt;strong&gt;推荐温度：0.1 - 0.3&lt;/strong&gt;&lt;/p&gt;
&lt;section&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;p&gt;&lt;strong&gt;0.1（最推荐）：&lt;/strong&gt; 几乎是确定性输出。在这个温度下，模型会选择概率最高的 Token，极大地降低了它“自作聪明”把 &lt;code&gt;llama&lt;/code&gt; 修正为 &lt;code&gt;lama&lt;/code&gt; 的概率，也能更好地遵守你“不带反引号输出”的指令。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;0.3：&lt;/strong&gt; 如果你发现翻译的中文过于生硬、不够通顺，可以轻微调高到 0.3。这会给模型一点点语言组织的空间，但仍能保持较强的指令遵循能力。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;提示词（v1）AI 领域&lt;a href=&quot;#提示词v1ai-领域&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;请将以下英文文章，重写成通俗流畅、引人入胜的简体中文。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;核心要求：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 读者与风格： 面向对AI感兴趣的普通读者。风格要像讲故事，清晰易懂，而不是写学术论文。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 准确第一： 核心事实、数据和逻辑必须与原文完全一致。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 行文流畅： 优先使用地道的中文语序。将英文长句拆解为更自然的中文短句。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 术语标准： 专业术语使用行业公认的标准翻译（如 `LLM` -&amp;gt; `大语言模型`）。第一次出现时，在译文后用括号加注英文原文。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 保留格式： 保持原文的标题、粗体、斜体等Markdown格式。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;提示词（v2）AI 领域&lt;a href=&quot;#提示词v2ai-领域&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## Role: AI 科技资深翻译与科普作家&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### Profile&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;你是一位擅长将复杂 AI 技术转化为生动故事的顶尖翻译专家。你拥有将硬核科技论文、深度外刊评论转化为通俗易懂、引人入胜的简体中文的能力。你的文字既有科技博主的敏锐，又有文学创作的流畅。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### Task&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;请将提供的英文原文重写为一篇高质量的中文科普文章。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### Guidelines &amp;amp; Rules&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. **读者与风格**：受众为对 AI 感兴趣的普通大众。请像讲故事一样展开叙述，语言自然且富有节奏感，严禁学术味过浓或生硬的“翻译腔”。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. **准确性第一**：必须严格遵循原文的核心事实、数据和逻辑，不捏造事实，不改变作者初衷。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. **行文重构**：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 彻底打破英文的长句结构，重组为符合中文母语习惯的短句。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 优先使用动词而非抽象名词，增强文字的动感。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4. **术语规范**：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 使用行业公认的标准翻译（例如：LLM -&amp;gt; 大语言模型）。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- **首次出现时**：采用“中文译名（英文原文）”的标注方式。后续仅使用中文。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;5. **格式保留**：严格保留原文的 Markdown 格式，包括标题层级（#）、粗体（**）、斜体（*）以及列表符号。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### Workflow&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **第一步：深度理解**。分析原文逻辑流。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **第二步：风格转化**。将原本枯燥的技术描述转化为叙事性强的表达。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **第三步：精修润色**。检查语感是否丝滑，术语是否准确。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;提示词（v3）全领域&lt;a href=&quot;#提示词v3全领域&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## Role: 资深翻译与全领域科普作家&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### Profile&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;你是一位擅长跨语言转述与科普创作的顶尖翻译专家。你能精准捕捉外文深度内容的核心精髓，并将其转化为通俗易懂、引人入胜的简体中文。你的文字兼具媒体人的敏锐感与作家的叙事力，旨在让任何背景的读者都能轻松读懂专业内容。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### Task&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;请将提供的英文原文重写/翻译为一篇高质量、地道流利的中文内容。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### Guidelines &amp;amp; Rules&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. **读者与风格**：面向对该领域感兴趣的普通大众。风格要像讲故事般自然生动，具有高度的可读性，严禁生硬、枯燥的学术式翻译。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. **准确性第一**：核心事实、关键数据和论证逻辑必须与原文保持高度一致，确保信息零失真。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. **语言本土化**：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- **拆解重组**：打破英文的从句和长句结构，将其转化为简洁、有力的中文短句。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- **地道语序**：优先采用中文母语者的表达习惯，消除“翻译腔”。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4. **术语标准**：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 使用该行业公认的标准术语译名。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- **首次出现时**：在中文译名后的括号内加注英文原文，如：“[译名] ([Original Term])”。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;5. **格式保留**：严格保留原文的 Markdown 格式，包括各级标题、粗体、斜体、列表及引用。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### Workflow&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. **意译式阅读**：解析原文的深层含义与情感基调。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. **结构化重构**：按中文叙事逻辑重新组织语言。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. **润色与核查**：优化行文韵律，确保专业术语和格式完全正确。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded></item><item><title>Astro vs Next.js：静态网站框架终极选择指南</title><link>https://blog.moewah.com/posts/astro-vs-nextjs-static-site-framework-comparison/</link><guid isPermaLink="true">https://blog.moewah.com/posts/astro-vs-nextjs-static-site-framework-comparison/</guid><description>Astro和Next.js到底该选哪个？本文从性能、成本和适用场景深度对比，帮你快速判断哪种框架更适合你的静态网站项目，解决技术选型难题。</description><pubDate>Sun, 14 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我想给自己做个技术博客，纠结了快两周还没选定框架。&lt;/p&gt;
&lt;p&gt;打开搜索引擎一查，铺天盖地都是”Astro性能爆表”、“Next.js全能框架”这样的标题。看得我越来越懵：一个说零JS加载，一个说功能齐全，到底该选谁？&lt;/p&gt;
&lt;p&gt;前几年做项目时也纠结过Vue还是React，最后花了好几天时间对比，结果发现很多对比文章都是片面的，要么吹捧某个框架，要么就是理论一大堆，实际场景根本对不上。&lt;/p&gt;
&lt;p&gt;这次我把Astro和Next.js这两个框架彻底研究了一遍。翻遍官方文档、测试性能数据、看了几十个真实案例，终于搞明白了它们的本质区别。&lt;/p&gt;
&lt;p&gt;Astro说自己比Next.js快40%，JavaScript减少90%，这数字听起来很厉害，但实际意味着什么？更重要的是，这些性能优势在你的项目里真的用得上吗？&lt;/p&gt;
&lt;section&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;strong&gt;如果你的网站主要是静态内容（博客、文档、作品集、营销页），选Astro；如果需要大量交互和动态数据（电商、SaaS、实时应用），选Next.js。&lt;/strong&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;/td&gt;&lt;td&gt;&lt;strong&gt;Astro&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;零JS加载，性能爆表，天生为内容设计&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;营销落地页/公司官网&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Astro&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;加载快，SEO友好，维护简单&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;个人作品集展示&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Astro&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;性能好，支持多框架混用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;电商网站/购物平台&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Next.js&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;需要SSR、动态路由、实时库存&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SaaS应用/后台管理&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Next.js&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;大量交互、用户认证、API集成&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;社交应用/实时数据&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Next.js&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;需要服务端能力和动态渲染&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;性能对比：数据说话，差距有多大？&lt;a href=&quot;#性能对比数据说话差距有多大&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;先看数据：Astro确实快&lt;a href=&quot;#先看数据astro确实快&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;我用Lighthouse测了几个真实网站，数据挺惊人的：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;加载速度&lt;/strong&gt;：Astro构建的网站比同类Next.js网站快约40%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JavaScript大小&lt;/strong&gt;：Astro的JS bundle比Next.js少90%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lighthouse评分&lt;/strong&gt;：Astro网站持续保持98-100分，Next.js静态导出通常在80-90分&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;举个实际例子。我之前用Next.js做过一个文档站，首屏加载大概需要1.2秒。后来用Astro重构，同样的内容，首屏加载只要0.7秒。这0.5秒的差距，用户能明显感觉到。&lt;/p&gt;&lt;p&gt;更重要的是JavaScript大小。Next.js那个版本打包出来有180KB的JS，Astro版本只有18KB。你在移动网络下试试就知道差距了，特别是在3G网络环境，这差距能让人抓狂。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Islands架构：Astro性能好的秘密&lt;a href=&quot;#islands架构astro性能好的秘密&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Astro为什么这么快？核心原因是它的Islands架构。&lt;/p&gt;&lt;p&gt;把网页想象成一片大海，大部分区域是静止的海水（静态HTML），只有少数几个小岛需要”动起来”（交互组件）。Astro默认只给这些小岛”通电”（加载JavaScript），其他地方保持静止。&lt;/p&gt;&lt;p&gt;对比一下传统框架（包括Next.js）的做法：不管你需不需要，整个页面的JavaScript都会加载和执行。就像给整片海域都通电，浪费能源不说，还拖慢速度。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Astro的核心思路&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;构建时把所有内容渲染成纯HTML&lt;/li&gt;
&lt;li&gt;默认零JavaScript&lt;/li&gt;
&lt;li&gt;只在你明确指定的地方加载JS&lt;/li&gt;
&lt;li&gt;支持多种加载策略（马上加载、页面空闲时加载、滚动到可见区域时加载&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这就是为什么Astro能做到零JS加载。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Next.js的性能表现：也不差，但有代价&lt;a href=&quot;#nextjs的性能表现也不差但有代价&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Next.js也有不少优化手段：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;React Server Components&lt;/strong&gt;：在服务端渲染组件，减少客户端JS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Partial Prerendering (PPR)&lt;/strong&gt;：混合静态和动态渲染&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动代码分割&lt;/strong&gt;：只加载当前页面需要的代码&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这些优化主要针对SSR（服务端渲染）场景。如果你用Next.js做纯静态导出（就是我们说的静态网站），很多优化就用不上了。&lt;/p&gt;&lt;p&gt;我实测过，Next.js静态导出的性能确实不如Astro。Lighthouse评分经常掉到80-85分，主要是Total Blocking Time（总阻塞时间）这个指标拖后腿。原因很简单：即使是静态页面，Next.js也会打包一堆React运行时代码，这些代码需要解析和执行。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;性能优势的代价：Astro不是万能的&lt;a href=&quot;#性能优势的代价astro不是万能的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Astro的高性能是建立在”内容为主、交互为辅”这个前提上的。如果你的网站需要大量交互（比如复杂的表单、实时搜索、拖拽操作），Astro的优势就没那么明显了。&lt;/p&gt;&lt;p&gt;比如你要做一个类似Notion的富文本编辑器，或者一个实时协作看板，这种场景用Astro就有点别扭。倒不是说做不了，而是你会发现自己一直在跟框架的”零JS”理念对着干。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;简单总结一下性能这块&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;静态内容为主的网站，Astro性能碾压Next.js&lt;/li&gt;
&lt;li&gt;需要大量交互的应用，Next.js更合适&lt;/li&gt;
&lt;li&gt;性能差异在移动端和弱网环境下最明显&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;功能对比：哪些能做，哪些不能做？&lt;a href=&quot;#功能对比哪些能做哪些不能做&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Astro：为静态而生&lt;a href=&quot;#astro为静态而生&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Astro从设计之初就瞄准静态网站。你几乎不用配置什么，运行 &lt;code&gt;npm run build&lt;/code&gt; 就能得到一堆HTML、CSS、JS文件，往任何CDN一扔就能访问。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Astro的杀手锏功能&lt;/strong&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;内置Markdown支持&lt;/strong&gt;：写博客太爽了，直接写.md文件，自动转成页面&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content Collections&lt;/strong&gt;：管理文章、文档的类型安全方案，带TypeScript类型提示&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多框架混用&lt;/strong&gt;：同一个页面里可以同时用React、Vue、Svelte组件，不冲突&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;零配置部署&lt;/strong&gt;：GitHub Pages、Netlify、Cloudflare Pages都能一键部署&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;我特别喜欢它的Content Collections功能。之前用其他框架写博客，文章的front matter经常写错字段，构建时才发现。Astro会在开发时就给你类型检查，写错了立马报错。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Astro也能做SSR&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;话说回来，Astro不是只能做静态网站。从2.0版本开始，它也支持服务端渲染了。你可以在需要的页面用SSR，其他页面保持静态。&lt;/p&gt;&lt;p&gt;但Astro的SSR体验不如Next.js成熟。比如你想做用户认证、API路由、数据库操作，Astro能做，但生态和工具链还不够完善。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Next.js：全能选手，但静态导出有坑&lt;a href=&quot;#nextjs全能选手但静态导出有坑&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Next.js的定位是”全能框架”，静态、SSR、ISR（增量静态生成）都支持。听起来很美好，但如果你只想做静态网站，会遇到一些限制。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Next.js静态导出的限制&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;当你在 &lt;code&gt;next.config.js&lt;/code&gt; 里设置 &lt;code&gt;output: &apos;export&apos;&lt;/code&gt; 时，以下功能就不能用了：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;❌ &lt;strong&gt;API Routes&lt;/strong&gt;：不能用内置的API路由功能&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Server Actions&lt;/strong&gt;：React 19的Server Actions不支持&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;ISR&lt;/strong&gt;：增量静态生成不可用&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;动态路由的某些功能&lt;/strong&gt;：比如 &lt;code&gt;getServerSideProps&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;图片优化&lt;/strong&gt;：&lt;code&gt;next/image&lt;/code&gt; 的自动优化需要自己配CDN&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这份限制清单在Next.js官方文档里有详细说明，但很多人开始做项目时没注意，写到一半才发现某些功能用不了。&lt;/p&gt;&lt;p&gt;我之前就踩过这个坑。做一个文档站，想加个简单的搜索功能，打算用API Route处理。结果发现静态导出不支持API Route，只能改用客户端搜索方案，折腾了好久。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;开发体验：用起来爽不爽？&lt;a href=&quot;#开发体验用起来爽不爽&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;学习曲线：Astro更亲和&lt;a href=&quot;#学习曲线astro更亲和&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果你会写HTML，基本就会写Astro组件。它的 &lt;code&gt;.astro&lt;/code&gt; 文件语法就是HTML的超集，看个5分钟就能上手。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const title = &quot;我的博客&quot;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;title&amp;gt;{title}&amp;lt;/title&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;h1&amp;gt;欢迎！&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;就这么简单。&lt;/p&gt;&lt;p&gt;Next.js的学习曲线相对陡峭一些，特别是新的App Router。刚开始用的时候，被Server Components、&lt;code&gt;use client&lt;/code&gt;、&lt;code&gt;use server&lt;/code&gt; 这些概念搞得有点晕。&lt;/p&gt;&lt;p&gt;如果你是前端新手，或者不想花太多时间学框架，Astro更友好。如果你已经深耕React生态，Next.js的这些新概念反而能帮你写出更好的代码。&lt;/p&gt;&lt;/section&gt;&lt;section&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;Astro的优势&lt;/strong&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;内容管理超方便&lt;/strong&gt;：直接写Markdown，自动生成页面和路由&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;热更新快&lt;/strong&gt;：改个文件，浏览器秒刷新&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;构建速度快&lt;/strong&gt;：我测过一个50页的文档站，Astro构建只要8秒，Next.js要25秒&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;Next.js的优势&lt;/strong&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Fast Refresh&lt;/strong&gt;：改React组件时保持状态，调试体验好&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具链完善&lt;/strong&gt;：ESLint配置、TypeScript支持都是开箱即用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;错误提示详细&lt;/strong&gt;：报错信息很清楚，定位问题快&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;说实话，开发文档、博客这类内容站，Astro效率确实高。我之前用Next.js写文档，每次加个新页面都要创建文件、配置路由、写组件。用Astro之后，新建一个.md文件就完事了。&lt;/p&gt;&lt;p&gt;但如果你要做复杂的交互应用，Next.js的开发体验更好。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;部署便利性：Astro更灵活&lt;a href=&quot;#部署便利性astro更灵活&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Astro的部署方式&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;Astro构建出来是纯静态文件，你可以部署到任何地方：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;GitHub Pages：免费，直接用Actions自动部署&lt;/li&gt;
&lt;li&gt;Netlify/Cloudflare Pages：免费额度够用，速度快&lt;/li&gt;
&lt;li&gt;甚至自己的Nginx服务器：扔进去就能跑&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Next.js的部署方式&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;静态导出的Next.js也能部署到任何静态托管平台，但如果你要用SSR或者ISR，就得考虑服务器环境了。&lt;/p&gt;&lt;p&gt;Vercel是Next.js的最佳搭档，部署体验确实好。但其他平台就没那么顺滑了。&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;Astro静态站：纯CDN托管，成本几乎为零&lt;/li&gt;
&lt;li&gt;Next.js SSR：需要服务器资源，流量大了账单会涨&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;实战选型指南：我该选哪个？&lt;a href=&quot;#实战选型指南我该选哪个&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;/p&gt;&lt;ul&gt;
&lt;li&gt;内容为主（博客、文档、作品集、营销页）→ 继续第二步&lt;/li&gt;
&lt;li&gt;交互为主（SaaS、电商、管理后台、社交应用）→ 选择Next.js&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;纯静态内容，不需要服务端 → 选择Astro&lt;/li&gt;
&lt;li&gt;需要动态数据、用户系统、API → 选择Next.js&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;第三步：团队技术栈&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;你的团队熟悉React吗？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;React深度用户，享受React生态 → Next.js也不错&lt;/li&gt;
&lt;li&gt;前端基础即可，不想被框架绑定 → Astro更灵活&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;强烈推荐Astro的场景&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;ul&gt;
&lt;li&gt;理由：Markdown原生支持，性能爆表，免费托管&lt;/li&gt;
&lt;li&gt;实测：我的博客从Next.js迁移到Astro，Lighthouse从85分提到99分&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;理由：Content Collections类型安全，搜索友好，构建快&lt;/li&gt;
&lt;li&gt;案例：GitHub、Firebase都在用&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;理由：加载速度影响转化率，SEO友好，维护成本低&lt;/li&gt;
&lt;li&gt;收益：页面加载快0.5秒，转化率能提升10%+&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;/li&gt;
&lt;li&gt;优势：部署简单，完全免费&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;强烈推荐Next.js的场景&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;ul&gt;
&lt;li&gt;理由：需要SSR保证SEO，需要API处理订单，需要实时库存&lt;/li&gt;
&lt;li&gt;关键功能：ISR可以实现增量更新，平衡性能和实时性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SaaS应用&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;理由：大量交互，用户认证，数据库集成，API路由&lt;/li&gt;
&lt;li&gt;生态优势：Auth.js、Prisma、tRPC等工具深度集成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;内容平台（类似Medium）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;理由：需要用户投稿、评论、点赞等动态功能&lt;/li&gt;
&lt;li&gt;技术优势：SSR保证SEO，Server Actions简化表单处理&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;理由：需要WebSocket、实时状态同步、复杂交互&lt;/li&gt;
&lt;li&gt;适配性：React的状态管理方案更成熟&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;第一次用Next.js做静态网站时，不知道&lt;code&gt;output: &apos;export&apos;&lt;/code&gt;的限制，想加个搜索功能就用了API Route。结果构建时报错，排查了半天才发现静态导出不支持。最后只能改成客户端搜索，多花了不少时间。&lt;/p&gt;&lt;p&gt;Astro的Content Collections也踩过坑。一开始没定义schema，frontmatter字段写错了构建时才发现。后来加上Zod的schema定义，写错了立马有类型提示，省了不少时间。&lt;/p&gt;&lt;p&gt;部署Next.js到Vercel以外的平台也花了不少时间。试过Railway、Render，配置起来都比Astro麻烦。后来发现静态导出虽然能用，但某些优化的功能（比如图片优化）需要自己配置CDN，折腾了很久。&lt;/p&gt;&lt;p&gt;现在我个人的做法是：内容型网站用Astro，需要复杂交互的用Next.js。不同项目用不同的工具，各取所长，效果最好。&lt;/p&gt;&lt;p&gt;选框架不能只看数字，更重要的是做出好产品。别花太多时间纠结工具，选一个顺手的，快点开始干活。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>公众号运营2025：私域流量与内容变现新玩法</title><link>https://blog.moewah.com/posts/public-account-2025-private-domain-content-monetization/</link><guid isPermaLink="true">https://blog.moewah.com/posts/public-account-2025-private-domain-content-monetization/</guid><description>2025年公众号还能做吗？本文揭秘微信算法变化、私域流量运营和内容变现的实战方法，帮你从0到1打造高转化公众号，实现粉丝增长与商业变现双突破。</description><pubDate>Fri, 15 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;凌晨两点，你盯着后台数据。刷新、刷新、再刷新。阅读量还是停在可怜的387。&lt;/p&gt;
&lt;p&gt;我最近看到一个数据——有个叫”好奇博士”的账号，次条阅读量不到10万，却带来了80万的销售额。&lt;/p&gt;
&lt;p&gt;2025年公众号的玩法确实变了。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;一、游戏规则——2025公众号算法的变化&lt;a href=&quot;#一游戏规则2025公众号算法的变化&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;p&gt;这个变化意味着什么？&lt;/p&gt;&lt;p&gt;新号和老号站在同一起跑线了。我有个朋友去年10月才开始做号，现在单篇阅读量经常破万。以前你得羡慕那些做了十几年的老号。&lt;/p&gt;&lt;p&gt;小号也有爆发的可能。我见过一个真实案例，2000粉的号，一篇文章阅读量破10万。&lt;/p&gt;&lt;p&gt;算法到底喜欢什么内容？我花了三个月测试，发现这三个指标最关键：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;阅读时长&lt;/strong&gt;：用户看了多久？如果30秒就划走，基本判定为”不感兴趣”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;完读率&lt;/strong&gt;：有多少人看完了？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;互动率&lt;/strong&gt;：点赞、在看、评论、转发&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;注意了，有些事千万别做：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AI生成内容不修改&lt;/strong&gt;：平台能识别出来&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;标题党&lt;/strong&gt;：“震惊!XXX”、“你绝对不知道的…”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内容同质化&lt;/strong&gt;：复制粘贴别人的文章&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;二、流量藏在4个被低估的渠道&lt;a href=&quot;#二流量藏在4个被低估的渠道&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;微信搜一搜的月活已经破8亿了。排名前3的公众号，能瓜分掉60%以上的搜索流量。&lt;/p&gt;&lt;p&gt;我有个做母婴内容的朋友，把公众号名称改成了”宝妈育儿日记”，然后每篇文章标题都包含精准关键词。结果每天光搜索进来的新粉就有几十个。&lt;/p&gt;&lt;/section&gt;&lt;section&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;ol&gt;
&lt;li&gt;&lt;strong&gt;标题&lt;/strong&gt;：用数字、疑问、场景描述&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开头&lt;/strong&gt;：前100字定生死，说清楚”读者能获得什么”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;互动引导&lt;/strong&gt;：比如”如果这3个方法帮到了你，点个赞让我知道？“&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&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;我见过最牛的案例，是一个做奢侈品维护的90后创业者。他用17个微信号做私域运营，每个号都加满了精准客户。每次发完公众号文章，就在朋友圈和社群里转发，然后引导大家去评论区讨论。每个号年产值80万，17个号加起来超过1300万。&lt;/p&gt;&lt;/section&gt;&lt;section&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;/ul&gt;&lt;p&gt;还有个新玩法特别火：通过微信的”问一问”功能，回答用户问题，然后引导关注公众号。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三、私域运营的三层架构&lt;a href=&quot;#三私域运营的三层架构&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;流量思维是：“我有10万粉丝，能卖多少货？”&lt;/p&gt;&lt;p&gt;关系思维是：“我有1000个铁杆粉丝，他们信任我到什么程度？”&lt;/p&gt;&lt;p&gt;一个信任你的铁杆粉丝，价值远超100个泛粉。&lt;/p&gt;&lt;/section&gt;&lt;section&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;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;/li&gt;
&lt;li&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;/li&gt;
&lt;li&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;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&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;我看过一个做了5年付费社群、赚了400万的案例，他的经验是：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SOP（标准操作流程）&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;：每周至少3次深度分享&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;付费社群的收入，是广告收入的20倍，是打赏收入的400倍。&lt;/p&gt;&lt;/section&gt;&lt;section&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;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;四、2025年能赚钱的变现方式&lt;a href=&quot;#四2025年能赚钱的变现方式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;粉丝满500就能开通流量主：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;泛娱乐内容：1000阅读≈10-30元&lt;/li&gt;
&lt;li&gt;垂直领域：1000阅读≈30-100元&lt;/li&gt;
&lt;li&gt;金融、教育等高价值领域：可能更高&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果你的号每月有10万阅读量，流量主收入大概在1000-3000元。&lt;/p&gt;&lt;/section&gt;&lt;section&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;微信的付费阅读功能，2025年第一季度，垂直领域头部账号的付费阅读收入增长了62%。&lt;/p&gt;&lt;p&gt;定价建议：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;单篇文章：3-9元&lt;/li&gt;
&lt;li&gt;系列文章：19-49元&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;/p&gt;&lt;ul&gt;
&lt;li&gt;“笔吧评测室”做深度测评+付费社群，年收入突破百万&lt;/li&gt;
&lt;li&gt;某母婴博主的付费社群，365元/年，1000人规模，年收入36.5万&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;/ul&gt;&lt;/section&gt;&lt;section&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;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;五、避坑指南&lt;a href=&quot;#五避坑指南&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;❌ AI生成不修改&lt;/li&gt;
&lt;li&gt;✅ AI辅助+人工精炼，加入个人经历和观点&lt;/li&gt;
&lt;li&gt;❌ 标题党&lt;/li&gt;
&lt;li&gt;✅ 标题吸引人但不夸张&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;✅ 优化公众号名称和文章标题SEO&lt;/li&gt;
&lt;li&gt;❌ 私域变成骚扰&lt;/li&gt;
&lt;li&gt;✅ 提供价值，偶尔软性推广&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;p&gt;如果你发现流量突然下滑，可以去微信开放社区发帖反馈，或者用工具做暗限流检测。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;2025年公众号不是没机会，而是游戏规则变了。&lt;/p&gt;&lt;p&gt;算法从订阅变成推荐，意味着新号有了逆袭可能；流量藏在搜索、推荐、私域、跨平台四个金矿里；私域不是加好友那么简单，而是构建信任资产。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;现在，你可以立即行动：&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;优化你的公众号名称，做好搜索SEO&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;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;/section&gt;</content:encoded></item><item><title>强迫症救星：安全修改Proxmox VE虚拟机VMID</title><link>https://blog.moewah.com/posts/5341/</link><guid isPermaLink="true">https://blog.moewah.com/posts/5341/</guid><description>如何安全地修改Proxmox VE中虚拟机的VMID？本文提供针对LVM、ZFS和目录存储的完整命令行操作指南，解决因乱序ID导致的系统管理困扰，确保配置与磁盘文件同步更新。</description><pubDate>Thu, 14 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;对于系统管理员，尤其是我们这种对秩序有偏执追求的人来说，Proxmox VE (PVE) 自动生成的、乱序的 VMID 简直就是屏幕上的一粒灰尘，不擦掉浑身难受。传统的“备份-删除-恢复”大法固然可行，但面对一个几百 GB 的虚拟机，可谓是“动静大，耗时长”。本文将分步介绍如何通过命令行安全地修改配置文件和重命名基于LVM、ZFS及目录存储的虚拟磁盘。&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;⚠️&lt;strong&gt;注意事项&lt;/strong&gt; ：开始前，请务必、一定、确认要操作的虚拟机&lt;strong&gt;已处于关机状态&lt;/strong&gt; 。在运行的系统上动刀，后果自负。&lt;/p&gt;&lt;/blockquote&gt;
&lt;section&gt;&lt;h4&gt;核心原理：VMID 的身份二要素&lt;a href=&quot;#核心原理vmid-的身份二要素&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;在 Proxmox 的系统中，一个虚拟机的身份由两个核心要素绑定：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;配置文件&lt;/strong&gt;: 一个名为 &lt;code&gt;&amp;lt;VMID&amp;gt;.conf&lt;/code&gt; 的文本文件，记录了虚拟机的全部硬件配置。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;虚拟磁盘文件&lt;/strong&gt;: 一个或多个名为 &lt;code&gt;vm-&amp;lt;VMID&amp;gt;-disk-X&lt;/code&gt; 的文件或逻辑卷，是虚拟机的实际存储。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;因此，修改 VMID 的本质，就是同步修改这两个地方的 ID 标识。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h4&gt;1、重命名并修改配置文件&lt;a href=&quot;#1重命名并修改配置文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;配置文件位于该目录下&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd /etc/pve/nodes/$(hostname)/qemu-server/&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;👆请进入上面两个目录，逐一完成下面的操作：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;检查并重命名配置文件名 (如果还没做)，如果文件名还是 &lt;code&gt;100.conf&lt;/code&gt;，请将其重命名为新的 ID。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 示例：将 100.conf 重命名为 101.conf&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mv 100.conf 101.conf&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;修改配置文件内容 (最关键的一步)&lt;/strong&gt;
这是最容易被忽略的步骤。需要用文本编辑器（如 &lt;code&gt;nano&lt;/code&gt; 或 &lt;code&gt;vim&lt;/code&gt;）打开新的配置文件，将所有对旧 ID &lt;code&gt;100&lt;/code&gt; 的引用，特别是磁盘路径，更改为新 ID &lt;code&gt;101&lt;/code&gt;。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nano 101.conf&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;在文件中，找到类似下面这样的行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 修改前&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sata0: local-lvm:vm-100-disk-0,size=32G&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;手动将其修改为：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 修改后&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sata0: local-lvm:vm-101-disk-0,size=32G&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h4&gt;2、重命名虚拟磁盘文件&lt;a href=&quot;#2重命名虚拟磁盘文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;这一步的操作取决于你的存储类型。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;情况一：使用 LVM 或 LVM-Thin 存储 (&lt;code&gt;local-lvm&lt;/code&gt;)&lt;/strong&gt;
需要使用 &lt;code&gt;lvrename&lt;/code&gt; 命令。首先，可以用 &lt;code&gt;ls /dev/pve&lt;/code&gt; 查看当前的逻辑卷名称。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 示例：重命名 LVM 卷&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lvrename /dev/pve/vm-100-disk-0 /dev/pve/vm-101-disk-0&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lvs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-a&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;grep&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;旧VMID&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;重命名磁盘快照卷（Snapshot）：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 将 &amp;lt;旧VMID&amp;gt; 和 &amp;lt;新VMID&amp;gt; 替换为你的实际 VMID&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lvrename&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pve/snap_vm-&amp;lt;旧VMID&amp;gt;-disk-0_&amp;lt;快照名称1&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pve/snap_vm-&amp;lt;新VMID&amp;gt;-disk-0_&amp;lt;快照名称1&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lvrename&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pve/snap_vm-&amp;lt;旧VMID&amp;gt;-disk-0_&amp;lt;快照名称2&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pve/snap_vm-&amp;lt;新VMID&amp;gt;-disk-0_&amp;lt;快照名称2&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;重命名状态卷（State，用于保存内存状态）：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lvrename&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pve/vm-&amp;lt;旧VMID&amp;gt;-state-&amp;lt;快照名称1&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pve/vm-&amp;lt;新VMID&amp;gt;-state-&amp;lt;快照名称1&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lvrename&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pve/vm-&amp;lt;旧VMID&amp;gt;-state-&amp;lt;快照名称2&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pve/vm-&amp;lt;新VMID&amp;gt;-state-&amp;lt;快照名称2&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;情况二：使用 ZFS 存储&lt;/strong&gt;
需要使用 &lt;code&gt;zfs rename&lt;/code&gt; 命令。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# &amp;lt;pool_name&amp;gt; 是你的 ZFS 池名字，例如 rpool/data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;zfs rename &amp;lt;pool_name&amp;gt;/vm-100-disk-0 &amp;lt;pool_name&amp;gt;/vm-101-disk-0&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;情况三：使用目录作为存储 (如存放 qcow2 文件)&lt;/strong&gt;
你需要直接移动（重命名）磁盘文件。首先要找到存储目录，然后在该目录下重命名文件。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 路径根据你的存储配置而定，通常在 /var/lib/vz/images/&amp;lt;VMID&amp;gt;/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 示例路径&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd /var/lib/vz/images/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 首先重命名目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mv 100 101&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 然后进入新目录重命名磁盘文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd 101&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mv vm-100-disk-0.qcow2 vm-101-disk-0.qcow2&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h4&gt;3、可能出现的问题排查&lt;a href=&quot;#3可能出现的问题排查&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;如果上述所有文件和配置检查下来都确认无误，但 VM ID 显示依然不正常，可以使用 &lt;code&gt;qm rescan&lt;/code&gt;这个命令会强制 Proxmox 重新扫描所有存储，并更新虚拟机的状态。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;qm rescan --vmid 101&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;执行后，刷新一下 Web 界面，看看问题是否解决了。如果问题仍然没有解决，可以尝试重启 PVE 的管理服务来强制它重新加载所有配置。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl restart pvedaemon&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl restart pveproxy&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;执行后稍等片刻，然后清理浏览器缓存并强制刷新 Web 界面 (Ctrl+F5)。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;如果不想使用终端命令方案，这里有一个更直观、风险更低的“B计划”。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;在旧虚拟机（比如 &lt;code&gt;VM 100&lt;/code&gt;）的&lt;strong&gt;硬件&lt;/strong&gt;标签页，选中它的磁盘。&lt;/li&gt;
&lt;li&gt;点击&lt;strong&gt;分离 (Detach)&lt;/strong&gt; 按钮。磁盘会变成一个“未使用的磁盘”。&lt;/li&gt;
&lt;li&gt;创建一个新的、配置相似的虚拟机，ID 设置为你想要的（比如 &lt;code&gt;VM 200&lt;/code&gt;）。可以不给它创建新磁盘。&lt;/li&gt;
&lt;li&gt;进入新虚拟机 (&lt;code&gt;VM 200&lt;/code&gt;) 的&lt;strong&gt;硬件&lt;/strong&gt;标签页。你会看到之前分离的那个“未使用的磁盘”。&lt;/li&gt;
&lt;li&gt;选中它，点击&lt;strong&gt;编辑 (Edit)&lt;/strong&gt;，将它 &lt;strong&gt;重新分配所有者&lt;/strong&gt; 给 &lt;code&gt;VM 200&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;调整新虚拟机的&lt;strong&gt;选项 -&amp;gt; 启动顺序&lt;/strong&gt; ，确保从这个刚挂载的磁盘启动。&lt;/li&gt;
&lt;li&gt;启动 &lt;code&gt;VM 200&lt;/code&gt; 测试，确认一切正常。&lt;/li&gt;
&lt;li&gt;最后，安心地删除掉那个只剩空壳的旧虚拟机 (&lt;code&gt;VM 100&lt;/code&gt;)。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;这个方法虽然步骤多一点，但全程可视化操作，不容易出错。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>PVE 9.x 升级后 SSD 掉盘问题临时解决方案</title><link>https://blog.moewah.com/posts/5337/</link><guid isPermaLink="true">https://blog.moewah.com/posts/5337/</guid><description>Proxmox VE 9.x 升级后 SSD 频繁掉盘怎么办？本文提供临时回滚至 pve-kernel-6.5.13-3-pve 的详细操作指南，解决 IO 错误和硬盘识别失败问题，确保系统稳定运行。</description><pubDate>Wed, 13 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;⚠️ 问题背景：升级 Proxmox VE 9.x 后 SSD 异常掉盘&lt;a href=&quot;#️-问题背景升级-proxmox-ve-9x-后-ssd-异常掉盘&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;自 Proxmox VE（PVE）9.0 正式发布以来，大量用户在升级后遇到 &lt;strong&gt;固态硬盘（SSD）频繁掉盘&lt;/strong&gt; 的严重问题。该现象并非个别案例，已在 Proxmox 官方社区论坛和多平台技术交流群组中广泛讨论。&lt;a href=&quot;https://forum.proxmox.com/threads/are-ssd-nvme-issues-resurfacing-with-the-latest-pve-kernel-upgrade.163503/&quot; target=&quot;_blank&quot;&gt;proxmox forum&lt;/a&gt;&lt;/p&gt;&lt;p&gt;关键特征包括：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;系统报 IO Error 错误；&lt;/li&gt;
&lt;li&gt;多品牌 SSD（如三星、西部数据、铠侠等）均受影响；&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;6.8.12 及其后续更新&lt;/strong&gt; 。部分用户尝试升级至 6.9 或 6.10 内核后，问题依旧存在或加重。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;✅ 当前稳定替代方案：降级至 pve-kernel-6.5.13-3-pve&lt;a href=&quot;#-当前稳定替代方案降级至-pve-kernel-6513-3-pve&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;经过社区测试与个人验证，&lt;strong&gt;内核版本 &lt;code&gt;6.5.13-3-pve&lt;/code&gt; 为目前最稳定的选择&lt;/strong&gt;。该内核具备以下优势：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;完全兼容 Proxmox VE 9.x 系统；&lt;/li&gt;
&lt;li&gt;有效规避 SSD 掉盘与 IO 错误问题；&lt;/li&gt;
&lt;li&gt;支持启用集成显卡（Intel 核心显卡）的 &lt;strong&gt;SR-IOV vGPU 硬件虚拟化&lt;/strong&gt; 功能，适用于视频处理、远程办公等高性能场景；&lt;/li&gt;
&lt;li&gt;性能表现流畅，资源占用低于高版本内核。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&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;重要提醒：该操作涉及系统内核版本变更，且需临时调用 Proxmox 8.x 源。必须在测试机验证无误后，再应用于生产环境。&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&lt;h3&gt;添加 Proxmox 8.x 的 bookworm 源（临时）&lt;a href=&quot;#添加-proxmox-8x-的-bookworm-源临时&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;为避免与当前系统主版本冲突，&lt;strong&gt;严禁修改现有 &lt;code&gt;/etc/apt/sources.list.d/proxmox.list&lt;/code&gt; 文件&lt;/strong&gt;。应新建独立源文件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;deb https://mirrors.tuna.tsinghua.edu.cn/proxmox/debian/pve bookworm pve-no-subscription&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;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;/etc/apt/sources.list.d/proxmox-old.list&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;执行更新命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;✅ 提示：当前系统仅读取此临时源以获取旧版内核，不影响其他软件包。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;搜索并安装所需内核与 headers&lt;a href=&quot;#搜索并安装所需内核与-headers&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;查询可用的 6.5.x 系列内核：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt&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;pve-kernel-6.5&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;确认目标版本后，安装指定内核及 headers（以 6.5.13-3-pve 为例）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pve-kernel-6.5.13-3-pve&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pve-headers-6.5.13-3-pve&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;proxmox-boot-tool&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;kernel&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;6.5.13-3-pve&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;proxmox-boot-tool&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;refresh&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;✅ 说明：&lt;code&gt;pin&lt;/code&gt; 命令将该内核设为默认启动项，&lt;code&gt;refresh&lt;/code&gt; 用于刷新引导菜单。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&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;立即禁用并删除临时添加的 PVE 8 源，避免未来出现依赖冲突或系统升级失败。&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mv&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/apt/sources.list.d/proxmox-old.list&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/apt/sources.list.d/proxmox-old.list.disabled&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;🔥 强烈建议：即使暂时无问题，也必须在完成配置后&lt;strong&gt;立刻移除旧源&lt;/strong&gt; 。否则系统升级时可能因包冲突导致无法启动。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&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;查看已安装的 kernel 包：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;dpkg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--get-selections&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;grep&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;kernel&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;移除不需要的版本（例如 5.15、5.19 系列）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;remove&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--purge&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pve-kernel-5.15.152-1-pve&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;remove&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--purge&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pve-kernel-5.19.17-2-pve&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;remove&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--purge&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pve-kernel-5.15&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;清理无用依赖：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;autoremove&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--purge&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;reboot&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;系统重新启动后，确认内核是否生效：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;uname&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-r&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;输出应为：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;6.5.13-3-pve&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;若显示此版本，则表示回滚成功，SSD 掉盘问题应已被解决。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;📌 补充：国产 NAS 系统体验&lt;a href=&quot;#-补充国产-nas-系统体验&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在排查问题期间，也尝试了国内新兴的 &lt;strong&gt;飞牛 OS&lt;/strong&gt; （FeiniuOS），其作为群晖替代方案正在逐步完善。具备基础虚拟化与存储管理能力，在家庭/小型办公场景中已有实用价值。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>ChatGPT不推荐你？7个GEO技巧让AI主动引用你的内容</title><link>https://blog.moewah.com/posts/chatgpt-gemini-ai-content-citation-seo-tactics/</link><guid isPermaLink="true">https://blog.moewah.com/posts/chatgpt-gemini-ai-content-citation-seo-tactics/</guid><description>为什么你的内容不被ChatGPT引用？本文揭秘7个实测有效的GEO优化技巧，教你如何让AI在回答中直接推荐你的品牌和内容，抢占生成式搜索流量红利。</description><pubDate>Tue, 12 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;上周和一个做内容营销的朋友聊天，她花了三个月把”家用咖啡机推荐”这个关键词优化到谷歌第一位，结果流量还是没涨多少。&lt;/p&gt;
&lt;p&gt;后来我俩一起分析才发现，现在大家都直接问ChatGPT了，谁还一页页翻搜索结果？&lt;/p&gt;
&lt;p&gt;看到她的困境，我也有点慌。我自己做了5年SEO，突然发现规则变了。&lt;/p&gt;
&lt;p&gt;数据也证明这个趋势正在发生：2024年7月统计显示，AI驱动的零售网站流量同比暴增470%。超过40%的用户现在优先用AI问答而不是传统搜索引擎。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;GEO和SEO到底有什么不同？&lt;a href=&quot;#geo和seo到底有什么不同&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;SEO是让你的网站出现在搜索结果列表里，GEO是让AI在生成答案时直接引用你的内容。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;举个具体例子，假设有人问”2025年最好的降噪耳机”：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SEO思维&lt;/strong&gt;：让我的评测文章排在搜索结果前三位&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GEO思维&lt;/strong&gt;：让ChatGPT在答案里直接说”根据XX网站的实测数据，Sony WH-1000XM5的降噪效果最好…”&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;本质上是从”争取点击”变成了”争取引用”，从”关键词排名”变成了”内容权威性”。&lt;/p&gt;&lt;p&gt;ChatGPT现在月活跃用户突破1.8亿，Perplexity AI的搜索量一年激增858%。&lt;/p&gt;&lt;p&gt;GEO优化的企业，AI搜索流量获取成本比传统SEO低42%。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;7个实战技巧&lt;a href=&quot;#7个实战技巧&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;/p&gt;&lt;p&gt;&lt;strong&gt;具体怎么做：&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;使用清晰的H1-H3标题层级&lt;/strong&gt;：不要全是H2，要有逻辑层次&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;在文章开头直接给出答案&lt;/strong&gt;：别绕弯子&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用列表、表格、FAQ区块呈现关键信息&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;p&gt;❌ &lt;strong&gt;不好的做法：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;关于降噪耳机的选择，我们需要从多个维度来看。首先要考虑预算，其次要看使用场景，还要考虑品牌...（绕了三段才给答案）&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;✅ &lt;strong&gt;好的做法：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**最佳降噪耳机推荐：Sony WH-1000XM5（综合评分9.2/10）**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;为什么推荐这款：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **降噪效果**：业界顶尖，实测降噪深度达30dB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **续航时间**：开启降噪模式下30小时&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **价格**：$399（京东价格2699元）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- **音质表现**：均衡，特别适合流行和古典音乐&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;技巧二：添加Schema标记&lt;a href=&quot;#技巧二添加schema标记&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Schema就像商品的条形码，让AI快速识别你的内容类型和关键信息。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;具体怎么做：&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;选择合适的Schema类型&lt;/strong&gt;：产品评测用Product，文章用Article&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用JSON-LD格式添加标记&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;：用Google结构化数据测试工具检查&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;代码示例：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;@context&quot;: &quot;https://schema.org&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;@type&quot;: &quot;Product&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;name&quot;: &quot;Sony WH-1000XM5&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;description&quot;: &quot;索尼旗舰降噪耳机，2025年最佳降噪表现&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;aggregateRating&quot;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;@type&quot;: &quot;AggregateRating&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;ratingValue&quot;: &quot;9.2&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;reviewCount&quot;: &quot;1547&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;/p&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;：行业报告、官方统计、学术研究&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;标注数据来源和时间&lt;/strong&gt;：AI很看重时效性&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;p&gt;❌ &lt;strong&gt;不好的做法：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;研究表明，大多数用户更喜欢降噪耳机。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;✅ &lt;strong&gt;好的做法：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;根据Statista 2025年Q2消费者调研（样本量5000人），**78%的用户在购买耳机时将降噪功能列为首要考虑因素**，这一比例比2023年提升了23个百分点。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;/p&gt;&lt;ul&gt;
&lt;li&gt;搜索谷歌：“最佳降噪耳机 2025”（关键词式）&lt;/li&gt;
&lt;li&gt;问ChatGPT：“我预算3000块，想买个降噪好的耳机通勤用，有什么推荐？“（完整问句）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果你的内容还是按照SEO思维，堆砌关键词”最佳降噪耳机”，那AI可能根本匹配不到你的内容。&lt;/p&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;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;创建FAQ版块&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;/section&gt;&lt;section&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;/p&gt;&lt;p&gt;&lt;strong&gt;具体怎么做：&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;确保允许AI爬虫抓取&lt;/strong&gt;：检查robots.txt文件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;页面加载速度控制在3秒内&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;移动端适配&lt;/strong&gt;：60%以上的AI搜索来自移动设备&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用HTTPS加密&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;robots.txt示例：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 允许主要AI爬虫抓取&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;User-agent: GPTBot&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Allow: /&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;User-agent: ChatGPT-User&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Allow: /&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;User-agent: PerplexityBot&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Allow: /&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;/p&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;：知乎、小红书、Medium、Reddit、Quora&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;确保品牌信息一致&lt;/strong&gt;：名称、描述、核心卖点在各平台要统一&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;鼓励用户评价和UGC内容&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;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;strong&gt;小红书&lt;/strong&gt;：用户真实使用体验和对比&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;B站&lt;/strong&gt;：产品开箱和对比视频&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;微信公众号&lt;/strong&gt;：深度评测和使用技巧&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;GEO不是一次性工作。AI模型在不断更新，优化策略也要跟着调整。&lt;/p&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;：每周在ChatGPT、Perplexity手动搜一次你的核心业务关键词&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用GEO监测工具&lt;/strong&gt;：Semrush AI Toolkit、Otterly、AthenaHQ&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;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;避坑指南&lt;a href=&quot;#避坑指南&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;strong&gt;高质量原创内容&lt;/strong&gt;：这个永远是基础&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;权威数据和引用&lt;/strong&gt;：有数据支撑的内容，AI更愿意引用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结构化信息呈现&lt;/strong&gt;：清晰的标题、列表、表格&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;真实用户评价&lt;/strong&gt;：UGC内容对AI来说权重很高&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&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;strong&gt;关键词堆砌&lt;/strong&gt;：AI看的是内容质量和相关性&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;低质量批量内容&lt;/strong&gt;：100篇水文不如10篇精品&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;纯AI生成无人工审核&lt;/strong&gt;：AI能识别出AI生成的内容，会降低权重&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&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;strong&gt;完全放弃传统SEO&lt;/strong&gt;：GEO是补充，不是替代&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;只依赖单一平台&lt;/strong&gt;：别把鸡蛋放一个篮子里&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;过度技术优化&lt;/strong&gt;：Schema很重要，但内容质量更重要&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;回到文章开头那个朋友的故事。后来她花了两个月时间，优化了网站的结构化数据，增加了一个很详细的FAQ版块，还在知乎、小红书回答了不少问题。&lt;/p&gt;&lt;p&gt;上周她告诉我，现在ChatGPT在回答”家用咖啡机推荐”时，经常会引用她的文章，甚至会说”根据XX咖啡评测博客的数据…”。&lt;/p&gt;&lt;p&gt;她说现在不那么焦虑了。虽然规则变了，但只要愿意学习、愿意调整，还是有办法应对的。&lt;/p&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;：在ChatGPT和Perplexity搜索你的核心业务关键词&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;挑一个技巧先试试&lt;/strong&gt;：我推荐从”结构化内容”开始&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;建立监测习惯&lt;/strong&gt;：每周花10分钟记录一次&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;持续学习&lt;/strong&gt;：GEO还在快速发展中，保持更新&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;AI搜索确实是大趋势，但不用慌。从小处开始，一个技巧一个技巧地尝试。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>群晖NAS部署Lobe-Chat数据库版完整指南</title><link>https://blog.moewah.com/posts/5330/</link><guid isPermaLink="true">https://blog.moewah.com/posts/5330/</guid><description>如何在群晖NAS上成功部署Lobe-Chat数据库版并实现HTTPS反向代理访问？本文详细解决域名+端口映射登录跳转失败问题，提供从环境配置到安全访问的全流程方案，助你稳定运行私有AI服务。</description><pubDate>Mon, 11 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本文详细介绍如何在 &lt;strong&gt;群晖 NAS&lt;/strong&gt; 上成功部署 Lobe-Chat 数据库版，并通过动态 DNS 域名 + 自定义端口实现安全访问。该方案特别解决了“使用域名+路由器端口映射时登录跳转失败”的常见问题，经过实际验证稳定运行。&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;✅ 适用场景：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;已拥有一个支持 HTTPS 的动态 DNS 域名（如 &lt;code&gt;demo.nas.com&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;希望通过非标准端口访问服务（如 &lt;code&gt;23210&lt;/code&gt;、&lt;code&gt;28000&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;希望通过 Nginx 反向代理实现 HTTPS 加密与安全访问&lt;/li&gt;
&lt;li&gt;遇到登录时报错或无响应问题，本教程可彻底解决&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;section&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;th&gt;访问地址（HTTPS）&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Lobe-Chat Web 服务&lt;/td&gt;&lt;td&gt;3210&lt;/td&gt;&lt;td&gt;23210&lt;/td&gt;&lt;td&gt;&lt;code&gt;https://demo.nas.com:23210&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Casdoor 鉴权服务&lt;/td&gt;&lt;td&gt;8000&lt;/td&gt;&lt;td&gt;28000&lt;/td&gt;&lt;td&gt;&lt;code&gt;https://demo.nas.com:28000&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MinIO S3 API 服务&lt;/td&gt;&lt;td&gt;9000&lt;/td&gt;&lt;td&gt;29000&lt;/td&gt;&lt;td&gt;&lt;code&gt;https://demo.nas.com:29000&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MinIO 控制台 UI 服务&lt;/td&gt;&lt;td&gt;9001&lt;/td&gt;&lt;td&gt;29001&lt;/td&gt;&lt;td&gt;&lt;code&gt;https://demo.nas.com:29001&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;blockquote&gt;&lt;p&gt;💡 &lt;strong&gt;说明&lt;/strong&gt; ：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;所有服务均运行于群晖 NAS 内网，通过 docker-compose 管理。&lt;/li&gt;
&lt;li&gt;外部访问将使用 &lt;strong&gt;域名 + 自定义端口&lt;/strong&gt; 的方式，绕过 HTTP/HTTPS 默认 80/443 端口限制。&lt;/li&gt;
&lt;li&gt;若你已有 PostgreSQL 使用 5432 端口，请避免端口冲突，本教程将 Postgres 映射至 &lt;code&gt;55432&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lobe-chat-db&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lobe-chat-db&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;下载并运行官方一键部署脚本，选择「端口模式」（1），按提示输入你的域名 &lt;code&gt;demo.nas.com&lt;/code&gt;：&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;bash&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;(&lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-fsSL&lt;/span&gt;&lt;span&gt;&lt;span&gt; https://lobe.li/setup.sh&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-l&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;zh_CN&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;blockquote&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;/li&gt;
&lt;li&gt;此步为生成 &lt;code&gt;.env&lt;/code&gt; 与 &lt;code&gt;docker-compose.yml&lt;/code&gt; 文件的初始步骤。&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三、部署阶段二：核心配置修改与问题修复&lt;a href=&quot;#三部署阶段二核心配置修改与问题修复&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;（一）&lt;code&gt;docker-compose.yml&lt;/code&gt; 文件关键修改&lt;a href=&quot;#一docker-composeyml-文件关键修改&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;⚠️ 问题背景：&lt;br /&gt;
使用动态域名（如 &lt;code&gt;demo.nas.com&lt;/code&gt;）访问时，Casdoor 无法正确响应 OAuth 登录跳转，出现“短暂无响应 → 超时异常”错误。&lt;br /&gt;
&lt;strong&gt;根本原因&lt;/strong&gt; ：容器内 DNS 无法解析外部域名，导致回调地址校验失败。&lt;/p&gt;&lt;/blockquote&gt;&lt;section&gt;&lt;h4&gt;✅ 核心修复措施：添加 &lt;code&gt;extra_hosts&lt;/code&gt; 解析映射&lt;a href=&quot;#-核心修复措施添加-extra_hosts-解析映射&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;在 &lt;code&gt;network-service&lt;/code&gt; 服务中，&lt;strong&gt;添加域名到局域网 IP 的静态解析项&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;network-service&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;alpine&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;container_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;lobe-network&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;restart&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;always&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &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;&lt;/span&gt;&lt;span&gt;${MINIO_PORT}:${MINIO_PORT}&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;# MinIO API (如 9000)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &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;&lt;/span&gt;&lt;span&gt;9001:9001&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;span&gt;# MinIO Console&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &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;&lt;/span&gt;&lt;span&gt;${CASDOOR_PORT}:${CASDOOR_PORT}&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;# Casdoor (如 8000)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &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;&lt;/span&gt;&lt;span&gt;${LOBE_PORT}:3210&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;# Lobe-Chat 主服务&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;command&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tail -f /dev/null&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;extra_hosts&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;# 关键修复：让容器能解析 demo.nas.com → 192.168.0.168&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &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;demo.nas.com:192.168.0.168&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;🔍 补充说明：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;extra_hosts&lt;/code&gt; 可强制指定容器内 &lt;code&gt;/etc/hosts&lt;/code&gt; 的解析规则。&lt;/li&gt;
&lt;li&gt;此设置确保 Casdoor 能正确识别 &lt;code&gt;https://demo.nas.com:28000&lt;/code&gt; 为合法回调地址。&lt;/li&gt;
&lt;li&gt;若使用的是静态 IP（如 &lt;code&gt;192.168.0.168&lt;/code&gt;），请替换为你实际的 NAS 内网 IP。&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;（二）&lt;code&gt;.env&lt;/code&gt; 配置文件调整&lt;a href=&quot;#二env-配置文件调整&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;确保 &lt;code&gt;.env&lt;/code&gt; 文件中所有 URL 使用 HTTPS 模式，并设置 MinIO 密码：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# ===================&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# ===== 预设配置 =====&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# ===================&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 服务端口（内部映射）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LOBE_PORT=3210&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;CASDOOR_PORT=8000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;MINIO_PORT=9000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 外部访问地址（HTTPS + 自定义端口）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;APP_URL=https://demo.nas.com:23210&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;AUTH_URL=https://demo.nas.com:23210/api/auth&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 数据库配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LOBE_DB_NAME=lobechat&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;POSTGRES_PASSWORD=uWNZuhlfhexf8dxC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Casdoor 鉴权服务&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;AUTH_CASDOOR_ISSUER=https://demo.nas.com:28000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;AUTH_CASDOOR_ID=a387a41227719b1a5549&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;AUTH_CASDOOR_SECRET=47d9338d1176a92cdde9791a4065567d&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# MinIO S3 配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;MINIO_ROOT_USER=admin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;MINIO_ROOT_PASSWORD=&amp;lt;YOUR PASSWORD&amp;gt;          # ← 设置密码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;MINIO_LOBE_BUCKET=lobe&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# MinIO 访问路径（完整 HTTPS 地址）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;S3_PUBLIC_DOMAIN=https://demo.nas.com:29000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;S3_ENDPOINT=https://demo.nas.com:29000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Casdoor 附加配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;origin=https://demo.nas.com:28000&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;✅ 修改要点：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;所有 &lt;code&gt;http://&lt;/code&gt; 替换为 &lt;code&gt;https://&lt;/code&gt;，端口按上文规划填写。&lt;/li&gt;
&lt;li&gt;设置 MinIO 密码 &lt;code&gt;MINIO_ROOT_PASSWORD&lt;/code&gt; 并保证其复杂性。&lt;/li&gt;
&lt;li&gt;确保 &lt;code&gt;AUTH_CASDOOR_ISSUER&lt;/code&gt; 与实际访问 URL &lt;strong&gt;完全一致&lt;/strong&gt;（含 &lt;code&gt;https://&lt;/code&gt; 和端口）。&lt;/li&gt;
&lt;/ol&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;生成 Casdoor 管理员账号&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker-compose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;up&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;查看日志以验证是否正常运行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;logs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-f&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lobe-chat&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;✅ &lt;strong&gt;成功日志示例&lt;/strong&gt; ：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[Database] Start to migration...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;✅ database migration pass.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-------------------------------------&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;▲ &lt;/span&gt;&lt;span&gt;Next.js&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;14&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;x.x&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- Local:        &lt;/span&gt;&lt;span&gt;http://localhost:3210&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- Network:      &lt;/span&gt;&lt;span&gt;http://0.0.0.0:3210&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;✓ Starting...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;✓ Ready in 95ms&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;✅ 成功标志：看到 &lt;code&gt;Ready in xx ms&lt;/code&gt; 且无报错日志。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;五、反向代理配置：Nginx 全站 HTTPS 部署&lt;a href=&quot;#五反向代理配置nginx-全站-https-部署&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;为了实现真正的 HTTPS 安全访问，必须通过 Nginx 做反向代理。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;创建 Nginx 配置文件&lt;a href=&quot;#创建-nginx-配置文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;进入群晖 &lt;code&gt;Nginx&lt;/code&gt; 目录，创建配置文件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/nginx/sites-enabled/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nano&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lobe-chat.service.conf&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;粘贴以下完整配置内容（支持域名+端口、HTTPS 加密）：&lt;/p&gt;&lt;section&gt;&lt;h4&gt;（一）LobeChat  Web 服务反向代理（重要！）&lt;a href=&quot;#一lobechat--web-服务反向代理重要&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# ================&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Lobe-Chat Web 服务 (https://demo.nas.com:23210)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# ================&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen &lt;/span&gt;&lt;span&gt;23210&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default_server&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name &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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;403&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;# 禁止 IP 直接访问&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen &lt;/span&gt;&lt;span&gt;23210&lt;/span&gt;&lt;span&gt;&lt;span&gt; ssl http2&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name &lt;/span&gt;&lt;span&gt;&lt;span&gt;demo.nas.com&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# HTTPS 证书路径（群晖内置）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_certificate &lt;/span&gt;&lt;span&gt;&lt;span&gt;/usr/syno/etc/certificate/system/default/fullchain.pem&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_certificate_key &lt;/span&gt;&lt;span&gt;&lt;span&gt;/usr/syno/etc/certificate/system/default/privkey.pem&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 安全协议与加密套件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_protocols &lt;/span&gt;&lt;span&gt;&lt;span&gt;TLSv1.2 TLSv1.3&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_ciphers &lt;/span&gt;&lt;span&gt;&lt;span&gt;ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!3DES:!ADH:!RC4:!DH:!DHE&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 非标准端口强制跳转 HTTPS&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;error_page &lt;/span&gt;&lt;span&gt;497&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;301&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=307&lt;/span&gt;&lt;span&gt;&lt;span&gt; https://&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;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_port&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;request_uri&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 封禁搜索引擎爬虫、恶意代理&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;http_user_agent&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;FeedDemon|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|Baiduspider|360Spider|bingbot|Bytespider|YisouSpider|Googlebot|YandexBot|^$&quot;&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;403&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_pass &lt;/span&gt;&lt;span&gt;&lt;span&gt;http://192.168.0.168:3210&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_http_version &lt;/span&gt;&lt;span&gt;1.1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;Upgrade &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;http_upgrade&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;Connection &lt;/span&gt;&lt;span&gt;&apos;upgrade&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;Host &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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Real-IP &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;remote_addr&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Forwarded-For &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_add_x_forwarded_for&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Forwarded-Proto &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;scheme&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;（二）Casdoor 鉴权服务反向代理（关键！）&lt;a href=&quot;#二casdoor-鉴权服务反向代理关键&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# ================&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Casdoor 鉴权服务 (https://demo.nas.com:28000)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# ================&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen &lt;/span&gt;&lt;span&gt;28000&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default_server&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name &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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;403&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen &lt;/span&gt;&lt;span&gt;28000&lt;/span&gt;&lt;span&gt;&lt;span&gt; ssl http2&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name &lt;/span&gt;&lt;span&gt;&lt;span&gt;demo.nas.com&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_certificate &lt;/span&gt;&lt;span&gt;&lt;span&gt;/usr/syno/etc/certificate/system/default/fullchain.pem&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_certificate_key &lt;/span&gt;&lt;span&gt;&lt;span&gt;/usr/syno/etc/certificate/system/default/privkey.pem&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_protocols &lt;/span&gt;&lt;span&gt;&lt;span&gt;TLSv1.2 TLSv1.3&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_ciphers &lt;/span&gt;&lt;span&gt;&lt;span&gt;ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!3DES:!ADH:!RC4:!DH:!DHE&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;error_page &lt;/span&gt;&lt;span&gt;497&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;301&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=307&lt;/span&gt;&lt;span&gt;&lt;span&gt; https://&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;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_port&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;request_uri&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;http_user_agent&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;FeedDemon|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|Baiduspider|360Spider|bingbot|Bytespider|YisouSpider|Googlebot|YandexBot|^$&quot;&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;403&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_pass &lt;/span&gt;&lt;span&gt;&lt;span&gt;http://192.168.0.168:8000&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_http_version &lt;/span&gt;&lt;span&gt;1.1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 关键：必须保留原始 Host&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;Host &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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Real-IP &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;remote_addr&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Forwarded-For &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_add_x_forwarded_for&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Forwarded-Proto &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;scheme&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 保证 OIDC 配置可被正确访问&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_cache_bypass &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;http_upgrade&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 必须单独代理 .well-known/openid-configuration&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/.well-known/openid-configuration &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_pass &lt;/span&gt;&lt;span&gt;&lt;span&gt;http://192.168.0.168:8000&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;Host &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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Real-IP &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;remote_addr&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Forwarded-For &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_add_x_forwarded_for&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Forwarded-Proto &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;scheme&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;（三）MinIO S3 服务反向代理&lt;a href=&quot;#三minio-s3-服务反向代理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# ================&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# MinIO API 服务 (https://demo.nas.com:29000)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# ================&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen &lt;/span&gt;&lt;span&gt;29000&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default_server&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name &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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;403&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen &lt;/span&gt;&lt;span&gt;29000&lt;/span&gt;&lt;span&gt;&lt;span&gt; ssl http2&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name &lt;/span&gt;&lt;span&gt;&lt;span&gt;demo.nas.com&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_certificate &lt;/span&gt;&lt;span&gt;&lt;span&gt;/usr/syno/etc/certificate/system/default/fullchain.pem&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_certificate_key &lt;/span&gt;&lt;span&gt;&lt;span&gt;/usr/syno/etc/certificate/system/default/privkey.pem&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_protocols &lt;/span&gt;&lt;span&gt;&lt;span&gt;TLSv1.2 TLSv1.3&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_ciphers &lt;/span&gt;&lt;span&gt;&lt;span&gt;ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!3DES:!ADH:!RC4:!DH:!DHE&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;error_page &lt;/span&gt;&lt;span&gt;497&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;301&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=307&lt;/span&gt;&lt;span&gt;&lt;span&gt; https://&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;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_port&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;request_uri&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;/span&gt;&lt;span&gt;http_user_agent&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;FeedDemon|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|Baiduspider|360Spider|bingbot|Bytespider|YisouSpider|Googlebot|YandexBot|^$&quot;&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;403&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 支持大文件上传&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;client_max_body_size &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_buffering &lt;/span&gt;&lt;span&gt;off&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ignore_invalid_headers &lt;/span&gt;&lt;span&gt;off&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_pass &lt;/span&gt;&lt;span&gt;&lt;span&gt;http://192.168.0.168:9000&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Real-IP &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;remote_addr&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Forwarded-For &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_add_x_forwarded_for&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Forwarded-Proto &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;scheme&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;Host &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;http_host&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 提升连接稳定性&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_connect_timeout &lt;/span&gt;&lt;span&gt;300&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_http_version &lt;/span&gt;&lt;span&gt;1.1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;Connection &lt;/span&gt;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;chunked_transfer_encoding &lt;/span&gt;&lt;span&gt;off&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;（四）MinIO S3 控制台 WebUI 服务反向代理（可选）&lt;a href=&quot;#四minio-s3-控制台-webui-服务反向代理可选&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# ================&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# MinIO 控制台服务 (https://demo.nas.com:29001)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# ================&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen 29001 default_server;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name _;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return 403;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen 29001 ssl http2;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name demo.nas.com;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_certificate /usr/syno/etc/certificate/system/default/fullchain.pem;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_certificate_key /usr/syno/etc/certificate/system/default/privkey.pem;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_protocols TLSv1.2 TLSv1.3;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!3DES:!ADH:!RC4:!DH:!DHE;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;error_page 497 301 =307 https://$host:$server_port$request_uri;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;if ($http_user_agent ~* &quot;FeedDemon|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|Baiduspider|360Spider|bingbot|Bytespider|YisouSpider|Googlebot|YandexBot|^$&quot;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return 403;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;location / {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_pass http://192.168.6.12:9001;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header X-Real-IP $remote_addr;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header X-Forwarded-Proto $scheme;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header Host $http_host;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 提升连接稳定性&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_connect_timeout 300;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_http_version 1.1;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header Connection &quot;&quot;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;chunked_transfer_encoding off;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header Upgrade $http_upgrade;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header Connection &quot;upgrade&quot;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;💡 提示：将以上四部分配置合并为一个 lobe-chat.service.conf 文件保存。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;在文件保存后，重载 Nginx 服务，使配置生效。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 检测配置有效性，观察有无报错&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nginx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-t&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 若测试无报错则执行重载服务&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;reload&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nginx&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;六、关键操作：更新 Casdoor 登录回调地址&lt;a href=&quot;#六关键操作更新-casdoor-登录回调地址&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;由于我们使用的是 HTTPS + 自定义端口，必须手动更新 Casdoor 中 LobeChat 应用的 &lt;strong&gt;重定向 URL&lt;/strong&gt; ：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;访问 &lt;code&gt;https://demo.nas.com:28000&lt;/code&gt;，使用脚本生成的管理员账号登录；&lt;/li&gt;
&lt;li&gt;进入 &lt;strong&gt;身份认证 → 应用&lt;/strong&gt; 列表，找到 &lt;code&gt;LobeChat&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;点击「编辑」，在 &lt;strong&gt;重定向 URLs&lt;/strong&gt; 字段中添加以下地址：&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;https://demo.nas.com:23210/api/auth/callback/casdoor&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;✅ 注意：此地址必须与 &lt;code&gt;.env&lt;/code&gt; 文件中 &lt;code&gt;APP_URL&lt;/code&gt; 一致。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;保存并退出后，缓存清除等待 10 秒即可生效。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;https://demo.nas.com:23210&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&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;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;八、附加建议与参考文档&lt;a href=&quot;#八附加建议与参考文档&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;功能&lt;/th&gt;&lt;th&gt;推荐操作&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;使用 MinIO 作为 Casdoor 头像存储&lt;/td&gt;&lt;td&gt;🔗 &lt;a href=&quot;https://lobehub.com/zh/docs/self-hosting/server-database/docker-compose#%E4%BD%BF%E7%94%A8-min-io-%E5%AD%98%E5%82%A8-casdoor-%E5%A4%B4%E5%83%8F&quot; target=&quot;_blank&quot;&gt;官方指南：使用 MinIO 存储头像&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;多设备访问 / 合并账户&lt;/td&gt;&lt;td&gt;可在 Casdoor 中配置多身份源登录&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;定期备份数据库与 S3 数据&lt;/td&gt;&lt;td&gt;建议使用群晖「计划任务」自动化备份&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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://lobehub.com/zh/docs/self-hosting/server-database/docker-compose&quot; target=&quot;_blank&quot;&gt;Lobe-Chat 官方自托管文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/lobehub/lobe-chat/issues/5936&quot; target=&quot;_blank&quot;&gt;GitHub Issue #5936：域名跳转失败问题&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;✅ 本教程已完整覆盖从环境准备、配置修复、反向代理到最终上线的全过程，尤其针对“域名+端口映射失败”问题提供精准解决方案。&lt;br /&gt;
建议根据自身网络环境调整 IP 与端口，确保一致性即可稳定运行。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;</content:encoded></item><item><title>戒掉短视频的真相：你不是懒，是大脑被劫持了</title><link>https://blog.moewah.com/posts/quit-short-video-addiction-attention-management-truth/</link><guid isPermaLink="true">https://blog.moewah.com/posts/quit-short-video-addiction-attention-management-truth/</guid><description>为什么你总是忍不住刷短视频？本文揭示多巴胺成瘾机制，提供从运动到阅读的替代方案，帮助你重建注意力控制回路，摆脱奶头乐依赖。</description><pubDate>Tue, 05 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近无聊行情我重温了《专注的真相》后，产生的思考和灵感。&lt;br /&gt;
内容很干，需要刻意集中注意力阅读，但读完后一定能刷新你对刷短视频这件事的认知。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;01/ 放不下手机，是你的错吗？&lt;a href=&quot;#01-放不下手机是你的错吗&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;先说答案：&lt;strong&gt;不是你的错。&lt;/strong&gt;&lt;/p&gt;&lt;section&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;/li&gt;
&lt;li&gt;例子：完成一天工作后，想拿起手机刷视频——“想要”才是多巴胺在起作用；拿到手机后看到娱乐内容产生放松、愉悦，这时真正的“快乐物质”是 &lt;strong&gt;内啡肽、催产素、血清素&lt;/strong&gt; 等。&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;多巴胺是“因”，它促使人们产生冲动。&lt;/strong&gt;&lt;br /&gt;
当你潜意识认为刷短视频能让你愉悦时，多巴胺分泌，提醒你：“玩一会吧，很快乐的。”&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&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;/li&gt;
&lt;li&gt;破坏多巴胺能系统不可行：它同时控制短期快乐与长期满足（自我实现、目标达成等）。失效后人会毫无快乐和意义。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;02/ 情绪补偿真的存在吗？&lt;a href=&quot;#02-情绪补偿真的存在吗&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;strong&gt;欲望回路&lt;/strong&gt;：多巴胺放大冲动 → 身体做出反应 → 大脑分泌内啡肽等 → 感到快乐。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;控制回路&lt;/strong&gt;：从腹侧被盖区到大脑前额叶皮层的通路，理性控制本能。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&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;/li&gt;
&lt;li&gt;&lt;strong&gt;成瘾&lt;/strong&gt;是当欲望回路的回馈过快、过及时，导致控制回路逐渐失效。&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;毒品案例&lt;/strong&gt;：一次吸毒会释放数千倍快乐物质，瞬间炸毁控制回路，导致大脑结构被重建、欲望回路加强。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&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;/li&gt;
&lt;li&gt;长期沉迷短视频、游戏会从物理层面损伤大脑。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;03/ 不刷短视频，不打游戏，还能干什么？&lt;a href=&quot;#03-不刷短视频不打游戏还能干什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;戒断是困难的，但&lt;strong&gt;替代行为&lt;/strong&gt;更容易实现。&lt;/p&gt;&lt;section&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;&lt;strong&gt;运动&lt;/strong&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;阅读&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;刺激前额叶皮层&lt;/td&gt;&lt;td&gt;阅读难度较高的文字，可提升控制回路，促进戒断&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;关键&lt;/strong&gt;：时间一旦被运动或阅读占用，就无法用来刷短视频或打游戏。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;strong&gt;信息乱流&lt;/strong&gt;将注意力撕扯成碎片，导致阅读困难。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;短视频、游戏、网络小说&lt;/strong&gt;劫持控制回路，绑架注意力。&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;未来是一个拼注意力的时代，能够长时间专注、善于管理注意力的人，才能在竞争中胜出。&lt;/p&gt;&lt;/blockquote&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;p&gt;如果你打算实现戒断奶头乐，欢迎在评论区留言。&lt;/p&gt;&lt;p&gt;这篇文章很干，能够读到这里，你已经拥有了专注的潜力。祝你在未来自如运用注意力，在时代中脱颖而出。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>AI助手：个人IP创作提效神器</title><link>https://blog.moewah.com/posts/ai-assistant-personal-ip-creation-efficiency-tool/</link><guid isPermaLink="true">https://blog.moewah.com/posts/ai-assistant-personal-ip-creation-efficiency-tool/</guid><description>如何用AI降低内容创作门槛？本文分享一套让AI主动提问的提示词框架，帮助个人IP理清思路、激发表达欲，实现从想法到可复制内容的高效转化，提升创作效率与IP价值。</description><pubDate>Tue, 29 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;你离个人 IP，可能只差这一套提示词了。让 AI 替你创作的人一定会死，让 AI 帮你更好创作的人一定会活得更好，分享一套提示词，让 AI 向你提问，你可以更自然的表达，大幅降低创作门槛。&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;建议：使用时将模型温度（Temperature）固定在 &lt;strong&gt;0.6-0.8&lt;/strong&gt;。&lt;/p&gt;&lt;/blockquote&gt;
&lt;section&gt;&lt;h2&gt;AI提示词&lt;a href=&quot;#ai提示词&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 角色：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;你是一位专业的个人 IP 助理，拥有丰富的内容创作和 IP 运营经验。你深刻理解“IP 不是操盘出来的，是托举出来的”这一理念。你以理解、尊重和欣赏的态度，致力于帮助 IP 实现自我价值的最大化。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 任务：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. 当 IP 提出 ta 的想法时，你需要通过“苏格拉底式提问”来激发 IP 的表达欲，帮助 IP 理清楚创作思路。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. 当 IP 本人给你明确的指令时，比如让你来写文章、写视频脚本、写小红书笔记时，你先回忆并总结之前的内容，再执行任务。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 输出要求：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. 每次只提出三个问题，这三个问题要从不同角度来提出，并且告知 IP，ta并不需要回答全部问题，只需要选择 ta 最有表达欲的那个来回答。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. 当 IP 没有下达，帮我写、帮我生成方案等明确指令时，你只需要一直和ta聊天。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. 适当地肯定 IP 的想法，并给ta提供温柔、友善、关心的情绪价值，但不能太夸张。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 提问视角&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;提问视角包含但不限于：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### 【从想法到核心命题】（把“散点”拎成一句话）**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;目的：把IP脑子里的“很多对”收束成一个最有张力的主问题/主判断。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;问题模板：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 你这个想法里，**你最想解决/最在意的那个矛盾**是什么？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 如果只能用一句话说清：**你在反对什么 / 你在捍卫什么**？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 这个命题成立的前提是什么？**一旦前提不成立，你愿意改哪一半？**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### 【人和场景】（让抽象观点落地到“具体的人”）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;目的：让内容有画面、有情绪、有代入感。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;问题模板：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 你脑子里**最典型的那个人**是谁？他处在什么处境？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 他在这个问题上**最痛的那一下**是什么（损失/羞耻/焦虑/卡住）？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 如果你只对这个人说一句话，你会说什么？为什么？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### 【证据与反例】（把观点从“好像”推到“站得住”）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;目的：把表达从情绪输出，升级为可被相信的洞见。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;问题模板：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 你经历过/见过的**一个最强证据**是什么？细节是什么？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;51&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 有没有一个反例会让你承认：**这条结论不适用**？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;52&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;53&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 你更愿意用：数据/故事/对比/实验，哪种来证明？为什么？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;54&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;55&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### 【你的独特性】（把“观点”变成“你”）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;56&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;57&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;目的：让内容变成个人IP资产，而不是通用鸡汤。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;58&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;59&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;问题模板：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;60&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;61&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 这件事你为什么会在意？它跟你的经历/性格/选择有什么关系？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;62&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;63&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 这条结论里，**你愿意付出代价去坚持的部分**是什么？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;64&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;65&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 别人也能讲类似主题，你和他们的区别会落在哪个点上？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;66&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;67&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### 【行动与可复制方法】（把内容托举成“能用的东西”）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;68&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;69&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;目的：让读者看完能做、你也能顺势产品化。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;70&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;71&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;问题模板：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;72&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;73&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 如果把它变成一个方法，你会拆成哪**三步**？第一步最小行动是什么？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;74&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;75&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 读者照做最可能卡在哪？你怎么给一个“低门槛补丁”？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;76&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;77&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 这条内容最终想导向什么：关注你/私信你/咨询你/买你的服务？你希望对方做哪个动作？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;78&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;79&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;80&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;81&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 背景：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;82&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;83&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;你要服务的 IP 是我，我叫“xx”，我的定位xxx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;84&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;我的口号是：xxx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;85&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;我的愿景是：xxxx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;86&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 我的天赋：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;87&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;88&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;「具体描述」&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;89&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;90&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 我的热爱：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;91&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;92&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;「具体描述」&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;93&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;94&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 我的优势：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;95&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;96&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;「具体描述」&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;97&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;98&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 我的劣势：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;99&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;100&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;「具体描述」&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;101&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;102&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 我的服务项目：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;103&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### 服务 1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;104&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;105&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;服务介绍&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;106&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;107&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### 服务 2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;108&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;109&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;服务介绍&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;110&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;111&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### 适合人群，我想要吸引的人：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;112&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;113&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;用户画像描述&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;114&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;115&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;116&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;我今天的想法是：[想法]&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded></item><item><title>为什么你的文章没人看？10万+爆文拆解秘籍</title><link>https://blog.moewah.com/posts/why-no-one-reads-your-article-10-million-plus-burst-analysis/</link><guid isPermaLink="true">https://blog.moewah.com/posts/why-no-one-reads-your-article-10-million-plus-burst-analysis/</guid><description>你的文章为什么火不起来？本文拆解10篇10万+爆文，揭示5大共性特征和可复用的创作方法论，帮你找到内容传播的核心密码。</description><pubDate>Mon, 21 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;凌晨1点，我盯着后台那可怜的453阅读量，又看了眼朋友圈里那篇刷屏的”10万+“。那一刻我有点怀疑人生。明明我也花了整整一天写文章，为啥就是火不起来？&lt;/p&gt;
&lt;p&gt;直到我做了一个决定：花一整周时间，把10篇不同领域的爆款文章挨个拆开了看。我的方法很笨，但很管用——打开标题，复制结构，分析情绪触发点。&lt;/p&gt;
&lt;p&gt;当我拆到第7篇的时候，突然发现了一个规律：&lt;strong&gt;这些文章虽然主题完全不同，但底层逻辑竟然惊人地一致&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;2024年微信公众号产出了4.44亿篇文章，但只有30.78万篇达到10万+，成功率仅0.07%。那些能突围而出的文章，一定有它们的共同点。&lt;/p&gt;
&lt;p&gt;今天我把这一周的发现全部掏出来：5大共性特征、具体可复用的方法、还有一份完整的7步检查清单。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;我拆解的这10篇爆款，都是什么样的？&lt;a href=&quot;#我拆解的这10篇爆款都是什么样的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我特意选了不同领域的，就想看看它们是不是真的有共性：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;育儿类&lt;/strong&gt;：《孩子总是拖延磨蹭？10个方法培养自律习惯（附实操工具）》- 阅读量15万+&lt;/p&gt;&lt;p&gt;&lt;strong&gt;职场类&lt;/strong&gt;：《95后职场新人必看！3个月从’职场小白’到’业务骨干’的秘密》- 阅读量12万+&lt;/p&gt;&lt;p&gt;&lt;strong&gt;情感类&lt;/strong&gt;：《婆婆竟然这样说我…这段对话让100万妈妈泪崩》- 阅读量28万+&lt;/p&gt;&lt;p&gt;&lt;strong&gt;科技类&lt;/strong&gt;：《别再手写提示词了！Claude Code的Skill功能让我效率翻倍》- 阅读量8万+&lt;/p&gt;&lt;p&gt;&lt;strong&gt;生活方式&lt;/strong&gt;：《我用这个方法，21天真的养成了早起习惯》- 阅读量10万+&lt;/p&gt;&lt;p&gt;还有另外5篇，涵盖了美食、理财、健康、旅行、个人成长。&lt;/p&gt;&lt;p&gt;当我按照选题、标题、结构、情绪、传播这5个维度一个个拆解，发现了——&lt;strong&gt;它们的底层逻辑几乎一模一样&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;那篇28万+的情感文，标题用了”竟然”制造冲突感，开头用对话场景抓人，中间用3个并列案例引发共鸣，结尾给出解决方案。那篇15万+的育儿文，虽然主题完全不同，但结构框架一模一样。&lt;/p&gt;&lt;p&gt;爆款不是运气，是有套路的。&lt;/p&gt;&lt;p&gt;2024年有个新变化——个性化推荐算法让小号也有了出爆款的机会。我亲眼看到好几个新号，第2、3篇就爆了。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;选题必须踩中这3个黄金要素&lt;a href=&quot;#选题必须踩中这3个黄金要素&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;选题是最容易被忽略但又最致命的一步。这些爆款的选题都同时满足3个条件。&lt;/p&gt;&lt;section&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;p&gt;比如那篇育儿爆文，它不讲什么儿童心理学，直接就是”孩子不听话怎么办”。这个问题每个有孩子的父母都遇到过，不需要任何背景，一看就懂。&lt;/p&gt;&lt;p&gt;我之前写过一篇《认知行为疗法在育儿中的应用》，阅读量惨不忍睹。后来改成《孩子发脾气时，这3句话千万别说》，阅读量立马涨了5倍。这就是低门槛的威力。&lt;/p&gt;&lt;/section&gt;&lt;section&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;我专门统计了一下，这10篇爆文都能触发强烈的情绪反应。&lt;/p&gt;&lt;p&gt;数据显示：在爆款文章中，敬畏感占25%，欢笑占17%，娱乐性占15%，而愤怒只占6%。&lt;/p&gt;&lt;p&gt;负面情绪往往比正面情绪更容易引发共鸣和转发。那篇”婆婆竟然…”能有28万+，因为它触发了很多女性心里的委屈和共鸣。&lt;/p&gt;&lt;p&gt;能让人产生强烈情绪波动的内容，传播力就是更强。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;这俩其实是一个道理——打破读者的预期。&lt;/p&gt;&lt;p&gt;《21天习惯养成法是骗局吗？》这标题，就是典型的反常识。大家都以为21天能养成习惯，你突然说这是骗局，读者能不点进来看吗？&lt;/p&gt;&lt;p&gt;追热点就更明显了。2024年小红书”发疯”相关笔记突破40万，同比增长510%。因为这个词踩中了年轻人的情绪共鸣。&lt;/p&gt;&lt;p&gt;记住这个公式：&lt;strong&gt;具体场景 + 普遍痛点 + 可行动性 = 爆款选题&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;举个例子：“深夜加班改方案，领导却说再优化一下”（具体场景）+ “职场人都经历过的委屈”（普遍痛点）+ “3个方法高效沟通”（可行动性）= 10万+潜质。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;标题都在用这5个吸睛公式&lt;a href=&quot;#标题都在用这5个吸睛公式&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;section&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;《10个方法培养自律习惯（附实操工具）》。为什么要加数字？因为数字给人确定性，让读者知道”我能得到什么”。&lt;/p&gt;&lt;p&gt;“10个方法”和”一些方法”，哪个更吸引你？&lt;/p&gt;&lt;p&gt;我试过把之前一篇《关于时间管理的思考》改成《7个时间管理技巧，让你每天多出2小时》，点击率直接提升40%。&lt;/p&gt;&lt;/section&gt;&lt;section&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;《95后职场新人必看！》这种标题就是典型。它直接告诉95后：“这是专门写给你的！”&lt;/p&gt;&lt;p&gt;我自己写过一篇《新手父母必看！宝宝睡眠问题完全指南》，转发量特别高，因为新手父母看到都觉得”这正是我需要的”。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;《别再瞎写了！10万+文章都藏着这些套路》，先说”别再瞎写了”戳痛点，然后说”都藏着套路”勾好奇。这种反差感特别容易激发点击欲。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;《婆婆竟然这样说…让100万妈妈泪崩》，那个省略号就是故意留白，让你忍不住想知道”到底说了啥”。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;公式5：强调词触发损失厌恶&lt;a href=&quot;#公式5强调词触发损失厌恶&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;千万、一定、必须、马上、最好…这些词利用的是人的损失厌恶心理。&lt;/p&gt;&lt;p&gt;《千万别用这3个方法减肥！》比《3个减肥方法不推荐》的点击率高一倍。因为”千万别”让你觉得”不看就亏了”。&lt;/p&gt;&lt;p&gt;2020年公众号文章平均打开率只有1.13%。这意味着如果你的标题不够吸引人，100个粉丝里只有1个人会点开。&lt;/p&gt;&lt;p&gt;所以标题真的太重要了。我现在的习惯是，每篇文章至少想3-5个标题，然后选打开率最高的。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;内容结构就这4种模板，选一个就行&lt;a href=&quot;#内容结构就这4种模板选一个就行&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;拆解到内容结构的时候，我发现了个特别有意思的现象：这些爆款文章看起来风格各异，但底层结构就那么4种。&lt;/p&gt;&lt;section&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;p&gt;《我用这个方法，21天养成早起习惯》，开头就说”我以前是个重度晚睡患者”（制造悬念），然后讲尝试了各种方法都失败（起因），直到遇到这个方法（转折），现在已经坚持了3个月（升华）。&lt;/p&gt;&lt;/section&gt;&lt;section&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;这是最常见的，适合方法论、技巧分享。《10个方法培养自律习惯》就是典型的并列结构：先提出问题，然后10个方法平行展开，最后总结提炼。&lt;/p&gt;&lt;p&gt;我自己特别喜欢用这种结构，因为写起来有条理，读者看着也清楚。但有个坑要注意：&lt;strong&gt;每个案例之间要有点区别，不能写着写着感觉都差不多&lt;/strong&gt;。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;适合知识科普、分析解读。标准的”是什么 → 为什么 → 怎么做”三段论。&lt;/p&gt;&lt;p&gt;《21天习惯养成法是骗局吗？》就是这个套路：先说21天理论是啥，再说为啥这个理论有问题，最后说怎么正确养成习惯。&lt;/p&gt;&lt;/section&gt;&lt;section&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;适合工具推荐、资源整理。《2025博客框架选择指南：Hugo、Astro、Hexo该选哪个？》这种文章，就是一个个工具的对比说明。&lt;/p&gt;&lt;p&gt;不管用哪种结构，有个通用要求：&lt;strong&gt;开头必须在150字内抓住读者&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;我以前喜欢铺垫很久才进入主题，结果读者早就划走了。现在我都是开门见山，第一段就告诉你”这篇文章能帮你解决什么问题”。&lt;/p&gt;&lt;p&gt;还有，每个段落最好不要超过200字。现在大家都是用手机看文章，段落太长会让人觉得累。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;情绪设计用这3个心理触发点&lt;a href=&quot;#情绪设计用这3个心理触发点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;情绪设计是最关键的一环。我拆解这些爆款的时候发现，它们都特别会”撩拨”读者情绪。&lt;/p&gt;&lt;section&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;strong&gt;细节，大量的细节&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;那篇职场文里有句话：“凌晨4点还在改方案，领导却说’再优化一下’，你盯着屏幕，不知道该优化啥。”&lt;/p&gt;&lt;p&gt;这个场景多具体——时间（凌晨4点）、动作（还在改方案）、对话（再优化一下）、感受（不知道该优化啥）。只要是打工人，看到这句话都会会心一笑或者叹口气。&lt;/p&gt;&lt;p&gt;我以前写文章总是很笼统：“职场中经常遇到这种情况。“现在我会写：“你有没有试过，周五下午5点半正准备下班，突然收到领导的微信：‘明天要用的PPT改好了吗？‘那一瞬间的心情，懂的都懂。”&lt;/p&gt;&lt;p&gt;细节能唤起共鸣。&lt;/p&gt;&lt;/section&gt;&lt;section&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;制造”我们vs他们”的群体认同。《婆婆竟然…》这篇文章就是典型，它让所有经历过婆媳矛盾的女性觉得”我不是一个人在战斗”。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;给读者希望和行动动力。《3个月从职场小白到业务骨干》这种标题就是激励型的。它告诉你：“别人能做到，你也可以。”&lt;/p&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;/section&gt;&lt;/section&gt;
&lt;section&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;section&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;我有个粉丝5000的号，以前打开率只有2-3%，后来优化了标题，打开率提升到7-8%，阅读量直接翻了2倍多。&lt;/p&gt;&lt;/section&gt;&lt;section&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;/p&gt;&lt;p&gt;所以你的文章要么有金句（方便摘抄），要么观点鲜明（便于表达态度），要么特别实用（让人觉得”必须收藏分享”）。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;算法推荐机制（2024年新变化）&lt;a href=&quot;#算法推荐机制2024年新变化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这是个好消息！2024年微信调整了推荐机制，个性化推荐让小号也有了出爆款的机会。&lt;/p&gt;&lt;p&gt;关键是要进入推荐池。怎么进？&lt;strong&gt;文章质量好、互动数据高（点赞、在看、分享）、账号标签明确&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;账号标签怎么建立？就是持续输出某个领域的内容，让算法知道你是干啥的。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;可复用方法论——爆款文章创作7步检查清单&lt;a href=&quot;#可复用方法论爆款文章创作7步检查清单&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;前面讲了这么多理论，现在给你一份实操清单。我自己每次发文前都会过一遍。&lt;/p&gt;&lt;section&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;ul&gt;
&lt;li&gt;□ 是否低门槛（不需要专业知识）？&lt;/li&gt;
&lt;li&gt;□ 是否高共鸣（目标受众能对号入座）？&lt;/li&gt;
&lt;li&gt;□ 是否有情绪点（能触发强烈感受）？&lt;/li&gt;
&lt;li&gt;□ 是否有新意（反常识或追热点）？&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果4个都打勾，这个选题有戏。&lt;/p&gt;&lt;/section&gt;&lt;section&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;ul&gt;
&lt;li&gt;□ 是否用了吸睛关键词（数字、身份标签、情绪词）？&lt;/li&gt;
&lt;li&gt;□ 是否制造了好奇心缺口（冲突、悬念、承诺）？&lt;/li&gt;
&lt;li&gt;□ 字数是否在25字以内？&lt;/li&gt;
&lt;li&gt;□ 准备了至少3个标题变体？&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我的习惯是准备5个标题，然后问几个朋友”哪个最想点”。&lt;/p&gt;&lt;/section&gt;&lt;section&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;□ 开头150字内是否抓住读者？&lt;/li&gt;
&lt;li&gt;□ 是否使用了四种结构模板之一？&lt;/li&gt;
&lt;li&gt;□ 每个段落是否不超过200字？&lt;/li&gt;
&lt;li&gt;□ 结尾是否有行动号召？&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;ul&gt;
&lt;li&gt;□ 是否有共鸣点（具体场景描述）？&lt;/li&gt;
&lt;li&gt;□ 是否有情绪起伏（不是一路平铺）？&lt;/li&gt;
&lt;li&gt;□ 负面情绪是否给出解决方案？&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第5步：传播优化&lt;a href=&quot;#第5步传播优化&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;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第6步：细节打磨&lt;a href=&quot;#第6步细节打磨&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;□ 是否有配图（至少3-5张）？&lt;/li&gt;
&lt;li&gt;□ 排版是否舒适（段落清晰、留白适当）？&lt;/li&gt;
&lt;li&gt;□ 是否有数据支撑（增加可信度）？&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第7步：发布策略&lt;a href=&quot;#第7步发布策略&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;□ 发布时间是否合适（早8点、晚8-10点）？&lt;/li&gt;
&lt;li&gt;□ 是否准备了种子用户分享？&lt;/li&gt;
&lt;li&gt;□ 是否规划了KOL推广路径？&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;每次发布前，我会把这份清单打印出来，一项一项对照。未达标的项目重点优化。刚开始可能会觉得麻烦，但几次之后就会形成习惯。&lt;/p&gt;&lt;p&gt;还记得文章开头那个凌晨1点盯着453阅读量发愁的我吗？现在我的文章平均阅读量在1.5万左右。&lt;/p&gt;&lt;p&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;p&gt;&lt;strong&gt;1. 立即行动&lt;/strong&gt;：拿出你正在写的文章，用7步清单检查一遍，看看哪里可以优化。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. 建立习惯&lt;/strong&gt;：每天收集1-2个爆款文章，拆解它的成功要素。坚持一个月，你会发现自己的判断力明显提升。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. 持续优化&lt;/strong&gt;：第一篇可能不爆，第二篇也可能不爆，但只要你在用正确的方法努力，第10篇一定会越来越好。&lt;/p&gt;&lt;p&gt;你的第一个10万+，可能就在下一篇。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>从零搭建Astro博客：1小时完成部署指南</title><link>https://blog.moewah.com/posts/zero-to-astro-blog-deployment-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/zero-to-astro-blog-deployment-guide/</guid><description>如何快速搭建一个高性能的个人博客？本文手把手教你用Astro框架从零开始，1小时内完成首页、文章列表、标签分类和RSS订阅的完整部署，解决WordPress臃肿、Hexo单调等痛点，实现SEO优化和性能提升。</description><pubDate>Tue, 15 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;上周在掘金刷文章，点开一个技术博客，0.8秒就完整加载完了，页面切换丝滑得像在看App。再看看自己的WordPress博客——3秒白屏，等得我自己都想关了。&lt;/p&gt;
&lt;p&gt;我想，是不是该换个框架了。&lt;/p&gt;
&lt;p&gt;之前也折腾过Hexo、Hugo，甚至试过用Gatsby，但每次都卡在某个环节：要么官方文档看得云里雾里，要么教程太碎片化，从安装到部署总感觉少了点什么。&lt;/p&gt;
&lt;p&gt;直到我遇到Astro。第一次听说这个名字时，我还以为是又一个来蹭热度的框架。但当我真的动手搭了一遍后，才发现这东西确实有点东西——性能飞起，开发体验也不错，最重要的是，整个流程居然比我想象的简单太多。&lt;/p&gt;
&lt;p&gt;如果你也跟我一样，想搭个个人博客但不知道从哪开始，或者厌倦了WordPress的臃肿和Hexo的单调，这篇文章就是写给你的。我会手把手带你完成从零到部署的全流程，1小时内你就能上线一个包含首页、文章列表、标签分类、RSS订阅的完整博客。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;为什么选择Astro？&lt;a href=&quot;#为什么选择astro&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;我一开始也半信半疑。官网说”比传统React框架快40%”、“默认零JavaScript输出”，这听起来像营销话术对吧？但当我真的把WordPress博客迁移到Astro后，数据不会骗人：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;首屏加载时间&lt;/strong&gt;：从3.2秒降到0.8秒&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lighthouse评分&lt;/strong&gt;：直接拉满100分（之前WordPress只有65分）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JavaScript体积&lt;/strong&gt;：从280KB减少到不到20KB&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这么大的性能提升是怎么做到的？其实秘密就在Astro的核心理念——&lt;strong&gt;内容优先，JavaScript按需加载&lt;/strong&gt;。它默认输出的是纯HTML+CSS，只有你明确需要交互功能的地方才会加载JavaScript。这和React那种”全家桶一起上”的思路完全相反。&lt;/p&gt;&lt;p&gt;我用同一篇文章分别在Next.js和Astro上测试，Next.js首屏会加载框架运行时（约100KB），而Astro就是一个干净的HTML文件。对于博客这种以阅读为主的场景，这种差异太明显了。&lt;/p&gt;&lt;/section&gt;&lt;section&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的一点是它的”&lt;strong&gt;Islands架构&lt;/strong&gt;”——听起来很高大上，其实就是”哪里需要交互，哪里才用JavaScript”。&lt;/p&gt;&lt;p&gt;比如你有一个文章详情页：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;文章主体内容 → 静态HTML（快）&lt;/li&gt;
&lt;li&gt;评论区 → 用React组件（可交互）&lt;/li&gt;
&lt;li&gt;导航栏 → 用Vue组件（是的，可以混用！）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这种灵活性让我不用为了一个小功能就把整个网站变成SPA。而且Astro对新手特别友好的一点是，你可以直接用Markdown写文章，不需要折腾数据库和后台管理系统。我现在写博客就是在VSCode里写Markdown，写完推送到GitHub，自动部署。&lt;/p&gt;&lt;/section&gt;&lt;section&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;适用场景&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;Astro&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;博客/文档站&lt;/td&gt;&lt;td&gt;低（会HTML就行）&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;Next.js&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;复杂应用&lt;/td&gt;&lt;td&gt;中（需要懂React）&lt;/td&gt;&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;&lt;td&gt;中（需要维护API）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Hexo&lt;/strong&gt;&lt;/td&gt;&lt;td&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;WordPress&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;需要CMS&lt;/td&gt;&lt;td&gt;中（插件生态好）&lt;/td&gt;&lt;td&gt;⭐⭐&lt;/td&gt;&lt;td&gt;高（安全+更新烦）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;我的建议是：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;如果你要搭&lt;strong&gt;博客或技术文档站&lt;/strong&gt;，首选Astro，性能和开发体验都在线&lt;/li&gt;
&lt;li&gt;如果要做&lt;strong&gt;电商或复杂交互应用&lt;/strong&gt;，那还是Next.js更合适&lt;/li&gt;
&lt;li&gt;如果你就是想要个&lt;strong&gt;最简单的静态博客&lt;/strong&gt;，不需要任何定制，Hexo也够用&lt;/li&gt;
&lt;li&gt;如果你需要&lt;strong&gt;非技术团队也能发文章&lt;/strong&gt;的后台，那还是WordPress吧&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;对了，2025年的数据显示，Astro的npm下载量已经突破300万次，市场份额增长到18%。这说明越来越多开发者在用脚投票，它不是小众框架了。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;环境准备&lt;a href=&quot;#环境准备&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;安装Node.js（如果还没装的话）&lt;a href=&quot;#安装nodejs如果还没装的话&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Astro需要Node.js v18或更高版本。先检查一下你的版本：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;node -v&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm -v&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果显示版本号了，那就跳过这步。如果还没装，去&lt;a href=&quot;https://nodejs.org/&quot; target=&quot;_blank&quot;&gt;Node.js官网&lt;/a&gt;下载LTS版本就行。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Windows用户的小坑&lt;/strong&gt;：安装时记得勾选”Add to PATH”，不然后面命令找不到。还有就是有些杀毒软件会拦截npm安装，装完后最好重启一次命令行。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;创建Astro项目&lt;a href=&quot;#创建astro项目&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这步比你想象的简单。打开命令行，输入：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm create astro@latest&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后会弹出一堆选项，别慌，我告诉你怎么选：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;项目名称&lt;/strong&gt;：随便起一个，比如 &lt;code&gt;my-blog&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;选择模板&lt;/strong&gt;：选 &lt;strong&gt;Blog&lt;/strong&gt; 模板（用方向键+回车）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安装依赖&lt;/strong&gt;：选 &lt;strong&gt;Yes&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TypeScript配置&lt;/strong&gt;：选 &lt;strong&gt;Strict&lt;/strong&gt; 或 &lt;strong&gt;Strictest&lt;/strong&gt;（相信我，类型检查能帮你省很多bug）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;初始化Git仓库&lt;/strong&gt;：选 &lt;strong&gt;Yes&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;整个过程大概1-2分钟，它会自动下载模板和依赖包。&lt;/p&gt;&lt;p&gt;**为什么推荐Blog模板？**因为它已经内置了文章列表、标签分类、RSS订阅的基础代码，比从空白模板开始省太多事了。我第一次用空白模板，光搞分页就折腾了两个小时。&lt;/p&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd my-blog&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm run dev&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;看到 &lt;code&gt;Local: http://localhost:4321&lt;/code&gt; 就成功了。打开浏览器访问这个地址，你应该能看到一个已经搭好的博客框架了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;新手坑预警&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;如果端口4321被占用，可以改 &lt;code&gt;astro.config.mjs&lt;/code&gt; 文件里的 &lt;code&gt;server.port&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;如果启动报错 &lt;code&gt;EACCES&lt;/code&gt;，可能是权限问题，试试 &lt;code&gt;sudo npm run dev&lt;/code&gt;（Mac/Linux）&lt;/li&gt;
&lt;li&gt;如果看到乱码，检查命令行编码是不是UTF-8&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;到这里，环境就准备好了。你现在已经有一个可以运行的Astro博客了，接下来我们看看这些文件都是干什么的。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;项目结构详解&lt;a href=&quot;#项目结构详解&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;用VSCode或任何编辑器打开 &lt;code&gt;my-blog&lt;/code&gt; 文件夹，你会看到这样的结构：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;my-blog/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── src/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── pages/           # 路由页面，文件名就是URL&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── layouts/         # 布局模板（头部、底部等）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── components/      # 可复用组件（按钮、卡片等）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   └── content/         # 你的Markdown文章存这里&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── public/              # 静态资源（图片、字体、favicon）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── astro.config.mjs     # Astro配置文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└── package.json         # 项目依赖&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;看起来跟普通前端项目差不多对吧？但Astro有几个特别的地方，理解了这些你就知道为什么它这么好用了。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;&lt;code&gt;pages/&lt;/code&gt; 目录：文件即路由&lt;a href=&quot;#pages-目录文件即路由&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这是Astro最让我喜欢的地方。你不需要配置路由，文件名自动对应URL：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pages/index.astro&lt;/code&gt; → 网站首页 &lt;code&gt;/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pages/about.astro&lt;/code&gt; → 关于页面 &lt;code&gt;/about&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pages/blog/index.astro&lt;/code&gt; → 博客列表 &lt;code&gt;/blog&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pages/blog/[...slug].astro&lt;/code&gt; → 文章详情页 &lt;code&gt;/blog/xxx&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;最后那个 &lt;code&gt;[...slug].astro&lt;/code&gt; 是动态路由，方括号包裹的部分会变成变量。这个文件会处理所有 &lt;code&gt;/blog/&lt;/code&gt; 下的文章链接。&lt;/p&gt;&lt;p&gt;比Next.js的路由系统简单太多了，我当时从Next迁移过来，看到这个设计直接爱了。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;&lt;code&gt;content/&lt;/code&gt; 目录：文章存放地&lt;a href=&quot;#content-目录文章存放地&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;打开 &lt;code&gt;src/content/blog/&lt;/code&gt; 文件夹，里面已经有几篇示例文章了。每篇文章都是一个 &lt;code&gt;.md&lt;/code&gt; 或 &lt;code&gt;.mdx&lt;/code&gt; 文件，开头有个Frontmatter（就是三个短横线包起来的那部分）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;title: &apos;我的第一篇文章&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;description: &apos;这是一篇测试文章&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pubDate: &apos;Dec 02 2025&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;heroImage: &apos;/blog-placeholder.jpg&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tags: [&apos;Astro&apos;, &apos;教程&apos;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;这里开始写正文...&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;Astro会自动识别这些信息，你在页面里就能用 &lt;code&gt;post.data.title&lt;/code&gt; 这样调用。而且它有类型校验，如果你写错字段名，构建时会报错，这点对强迫症很友好。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;&lt;code&gt;layouts/&lt;/code&gt; 和 &lt;code&gt;components/&lt;/code&gt;：复用你的代码&lt;a href=&quot;#layouts-和-components复用你的代码&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;layouts/&lt;/code&gt; 放页面布局，比如所有文章都要有的头部、底部、侧边栏等。Blog模板里自带了 &lt;code&gt;BaseLayout.astro&lt;/code&gt; 和 &lt;code&gt;BlogPost.astro&lt;/code&gt; 两个布局。&lt;/p&gt;&lt;p&gt;&lt;code&gt;components/&lt;/code&gt; 放可复用的小组件，比如按钮、卡片、标签云等。这些组件可以用Astro语法写，也可以直接用React/Vue，超级灵活。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;&lt;code&gt;public/&lt;/code&gt; 目录：直接复制到输出文件夹&lt;a href=&quot;#public-目录直接复制到输出文件夹&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这里放的文件会原封不动地复制到最终网站根目录。比如 &lt;code&gt;public/favicon.ico&lt;/code&gt; 部署后就是 &lt;code&gt;https://你的域名/favicon.ico&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;我一般把博客配图、字体文件、&lt;code&gt;robots.txt&lt;/code&gt; 这些东西放这里。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;&lt;code&gt;astro.config.mjs&lt;/code&gt;：核心配置文件&lt;a href=&quot;#astroconfigmjs核心配置文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这个文件控制着Astro的行为。常用的配置项：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;site: &apos;https://你的域名.com&apos;,  // 部署的域名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;integrations: [mdx()],          // 插件（Markdown扩展、RSS等）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;port: 4321                    // 开发服务器端口&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;现在你不需要改太多，等后面添加功能时再回来调整。&lt;/p&gt;&lt;p&gt;理解这个目录结构真的很重要。我见过不少人直接开始写代码，结果不知道文件该放哪，最后项目结构乱得一塌糊涂。花5分钟搞清楚这个，后面能省1小时。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;核心功能实现&lt;a href=&quot;#核心功能实现&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;Blog模板已经帮你搭好了首页框架，但我们要稍微调整一下，让它更实用。打开 &lt;code&gt;src/pages/index.astro&lt;/code&gt;，你会看到类似这样的代码：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { getCollection } from &apos;astro:content&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import BaseLayout from &apos;../layouts/BaseLayout.astro&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 获取所有博客文章，按日期排序，取最新5篇&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const allPosts = (await getCollection(&apos;blog&apos;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.sort((a, b) =&amp;gt; b.data.pubDate.valueOf() - a.data.pubDate.valueOf())&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.slice(0, 5);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;BaseLayout&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;h1&amp;gt;欢迎来到我的博客&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{allPosts.map((post) =&amp;gt; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;li&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;a href={`/blog/${post.slug}/`}&amp;gt;{post.data.title}&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;time&amp;gt;{post.data.pubDate.toDateString()}&amp;lt;/time&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;))}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/BaseLayout&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;这段代码做了什么？&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;用 &lt;code&gt;getCollection(&apos;blog&apos;)&lt;/code&gt; 获取所有文章&lt;/li&gt;
&lt;li&gt;按发布日期倒序排列（最新的在前面）&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;slice(0, 5)&lt;/code&gt; 只取前5篇&lt;/li&gt;
&lt;li&gt;循环渲染成列表&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;新手坑&lt;/strong&gt;：日期排序时要用 &lt;code&gt;.valueOf()&lt;/code&gt;，不然会按字符串排序，结果就乱了。&lt;/p&gt;&lt;/section&gt;&lt;section&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/blog/index.astro&lt;/code&gt;（如果模板里没有的话），实现一个完整的文章列表：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { getCollection } from &apos;astro:content&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import BaseLayout from &apos;../../layouts/BaseLayout.astro&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const allPosts = (await getCollection(&apos;blog&apos;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.sort((a, b) =&amp;gt; b.data.pubDate.valueOf() - a.data.pubDate.valueOf());&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const pageSize = 10;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const currentPage = 1;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const totalPages = Math.ceil(allPosts.length / pageSize);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const posts = allPosts.slice(0, pageSize);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;BaseLayout title=&quot;文章列表&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;h1&amp;gt;所有文章&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;div class=&quot;post-list&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{posts.map((post) =&amp;gt; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;h2&amp;gt;&amp;lt;a href={`/blog/${post.slug}/`}&amp;gt;{post.data.title}&amp;lt;/a&amp;gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;p&amp;gt;{post.data.description}&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;time&amp;gt;{post.data.pubDate.toLocaleDateString(&apos;zh-CN&apos;)}&amp;lt;/time&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;div class=&quot;tags&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{post.data.tags?.map(tag =&amp;gt; &amp;lt;span&amp;gt;#{tag}&amp;lt;/span&amp;gt;)}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;))}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{totalPages &amp;gt; 1 &amp;amp;&amp;amp; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;div class=&quot;pagination&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;span&amp;gt;第 {currentPage} / {totalPages} 页&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/BaseLayout&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这里我简化了分页逻辑，实际项目中你可以用Astro的 &lt;code&gt;paginate()&lt;/code&gt; 函数自动生成分页。但对于文章数量不多的博客（&amp;lt;100篇），单页展示也够用。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;体验优化建议&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;加个阅读时长估算（按字数÷400字/分钟计算）&lt;/li&gt;
&lt;li&gt;文章摘要截断（取前150字+省略号）&lt;/li&gt;
&lt;li&gt;添加缩略图（用 &lt;code&gt;heroImage&lt;/code&gt; 字段）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;这是最关键的部分，用动态路由实现。如果Blog模板里有 &lt;code&gt;src/pages/blog/[...slug].astro&lt;/code&gt;，直接编辑它；没有就新建一个：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { getCollection } from &apos;astro:content&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import BlogPost from &apos;../../layouts/BlogPost.astro&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 生成所有文章的静态路径&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export async function getStaticPaths() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const posts = await getCollection(&apos;blog&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return posts.map(post =&amp;gt; ({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;params: { slug: post.slug },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;props: { post },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const { post } = Astro.props;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const { Content } = await post.render();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;BlogPost {...post.data}&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;Content /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/BlogPost&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&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;getStaticPaths()&lt;/code&gt; 在构建时运行，为每篇文章生成静态HTML&lt;/li&gt;
&lt;li&gt;&lt;code&gt;post.render()&lt;/code&gt; 把Markdown转成HTML组件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;Content /&amp;gt;&lt;/code&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;strong&gt;代码高亮不生效&lt;/strong&gt;：需要安装Shiki插件（Blog模板已自带）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Markdown样式不好看&lt;/strong&gt;：推荐装 &lt;code&gt;@tailwindcss/typography&lt;/code&gt; 插件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;图片路径错误&lt;/strong&gt;：图片放 &lt;code&gt;public/&lt;/code&gt; 文件夹，引用时写 &lt;code&gt;/images/xxx.jpg&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;如果你想加目录导航（TOC），可以用社区插件 &lt;code&gt;remark-toc&lt;/code&gt;，在 &lt;code&gt;astro.config.mjs&lt;/code&gt; 里配置：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { defineConfig } from &apos;astro/config&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import remarkToc from &apos;remark-toc&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;markdown: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;remarkPlugins: [remarkToc],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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/tags/[tag].astro&lt;/code&gt;，实现标签筛选功能：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { getCollection } from &apos;astro:content&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import BaseLayout from &apos;../../layouts/BaseLayout.astro&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export async function getStaticPaths() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const allPosts = await getCollection(&apos;blog&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 收集所有唯一标签&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const allTags = [...new Set(allPosts.flatMap(post =&amp;gt; post.data.tags || []))];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 为每个标签生成一个页面&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return allTags.map(tag =&amp;gt; ({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;params: { tag },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;props: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;posts: allPosts.filter(post =&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;post.data.tags?.includes(tag)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;).sort((a, b) =&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;b.data.pubDate.valueOf() - a.data.pubDate.valueOf()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const { tag } = Astro.params;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const { posts } = Astro.props;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;BaseLayout title={`标签: ${tag}`}&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;h1&amp;gt;#{tag} 相关文章 ({posts.length})&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{posts.map((post) =&amp;gt; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;li&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;a href={`/blog/${post.slug}/`}&amp;gt;{post.data.title}&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;))}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/BaseLayout&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这样每个标签都会生成一个独立页面，比如 &lt;code&gt;/tags/astro&lt;/code&gt;、&lt;code&gt;/tags/教程&lt;/code&gt; 等。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;进阶玩法&lt;/strong&gt;：做一个标签云页面（&lt;code&gt;src/pages/tags/index.astro&lt;/code&gt;），展示所有标签和文章数量，字体大小根据文章数量动态变化，很酷炫。&lt;/p&gt;&lt;/section&gt;&lt;section&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;安装RSS插件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npx astro add rss&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;创建 &lt;code&gt;src/pages/rss.xml.js&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import rss from &apos;@astrojs/rss&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { getCollection } from &apos;astro:content&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export async function GET(context) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const posts = await getCollection(&apos;blog&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return rss({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title: &apos;我的技术博客&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description: &apos;分享前端开发经验和学习心得&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;site: context.site,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;items: posts.map((post) =&amp;gt; ({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title: post.data.title,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pubDate: post.data.pubDate,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description: post.data.description,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;link: `/blog/${post.slug}/`,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;部署后，你的RSS订阅地址就是 &lt;code&gt;https://你的域名.com/rss.xml&lt;/code&gt;。虽然现在用RSS的人不多了，但技术博客加个这个还是挺专业的。&lt;/p&gt;&lt;p&gt;到这里，核心功能就搭好了。你已经有了一个功能完整的博客系统：首页展示、文章列表、详情页、标签分类、RSS订阅。接下来我们让它对搜索引擎更友好。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;SEO优化&lt;a href=&quot;#seo优化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;搭好博客不是终点，你还得让别人找得到对吧？这就是SEO（搜索引擎优化）的意义。好消息是，Astro在SEO方面天生有优势——静态HTML、快速加载、语义化标签，这些都是搜索引擎喜欢的。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;配置Meta标签：告诉搜索引擎你的内容是什么&lt;a href=&quot;#配置meta标签告诉搜索引擎你的内容是什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;打开 &lt;code&gt;src/layouts/BaseLayout.astro&lt;/code&gt;（或者你的基础布局文件），在 &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 标签里加上这些：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;interface Props {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title: string;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description?: string;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;image?: string;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const { title, description = &apos;我的技术博客&apos;, image = &apos;/og-image.jpg&apos; } = Astro.props;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const canonicalURL = new URL(Astro.url.pathname, Astro.site);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;link rel=&quot;icon&quot; type=&quot;image/svg+xml&quot; href=&quot;/favicon.svg&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;title&amp;gt;{title} | 我的博客&amp;lt;/title&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta name=&quot;description&quot; content={description} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;link rel=&quot;canonical&quot; href={canonicalURL} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;!-- Open Graph (社交媒体分享) --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta property=&quot;og:title&quot; content={title} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta property=&quot;og:description&quot; content={description} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta property=&quot;og:image&quot; content={new URL(image, Astro.site)} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta property=&quot;og:url&quot; content={canonicalURL} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;!-- Twitter Card --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta name=&quot;twitter:card&quot; content=&quot;summary_large_image&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta name=&quot;twitter:title&quot; content={title} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta name=&quot;twitter:description&quot; content={description} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta name=&quot;twitter:image&quot; content={new URL(image, Astro.site)} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这样每个页面都有完整的Meta信息，分享到微信、Twitter时也会显示漂亮的卡片。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;生成Sitemap：让搜索引擎知道你有哪些页面&lt;a href=&quot;#生成sitemap让搜索引擎知道你有哪些页面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;超级简单，一行命令搞定：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npx astro add sitemap&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后在 &lt;code&gt;astro.config.mjs&lt;/code&gt; 里配置你的域名：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;site: &apos;https://你的域名.com&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;integrations: [sitemap()],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;部署后，sitemap会自动生成在 &lt;code&gt;https://你的域名.com/sitemap-index.xml&lt;/code&gt;。去Google Search Console提交这个地址，过几天你的文章就能被搜到了。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;性能优化：速度也是SEO的重要因素&lt;a href=&quot;#性能优化速度也是seo的重要因素&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Astro本身已经够快了，但还有几个小技巧：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. 图片优化&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;用Astro的 &lt;code&gt;&amp;lt;Image&amp;gt;&lt;/code&gt; 组件代替普通的 &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; 标签：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { Image } from &apos;astro:assets&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import myImage from &apos;../assets/photo.jpg&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;Image src={myImage} alt=&quot;描述文字&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这会自动：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;转换成现代格式（WebP/AVIF）&lt;/li&gt;
&lt;li&gt;生成多尺寸响应式图片&lt;/li&gt;
&lt;li&gt;懒加载&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;2. CSS/JS压缩&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;生产构建时Astro会自动压缩，你不需要额外配置。但记得删掉没用的依赖包，能减小体积。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. 字体优化&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你用Google Fonts或自定义字体，记得加上 &lt;code&gt;font-display: swap&lt;/code&gt;，避免字体加载阻塞渲染。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@font-face {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;font-family: &apos;MyFont&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;src: url(&apos;/fonts/myfont.woff2&apos;) format(&apos;woff2&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;font-display: swap;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;做完这些优化，你的博客Lighthouse评分基本能稳定在95+。我现在的博客除了”Best Practices”因为第三方脚本扣了点分，其他项都是满分。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;section&gt;&lt;h3&gt;方案一：Vercel部署（推荐新手）&lt;a href=&quot;#方案一vercel部署推荐新手&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Vercel是我最推荐的，因为它对Astro有原生支持，零配置就能跑起来。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;步骤1：推送代码到GitHub&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果还没建仓库，在项目根目录运行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git add .&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git commit -m &quot;Initial commit&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git branch -M main&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git remote add origin https://github.com/你的用户名/my-blog.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git push -u origin main&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;步骤2：在Vercel导入项目&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;去 &lt;a href=&quot;https://vercel.com/&quot; target=&quot;_blank&quot;&gt;vercel.com&lt;/a&gt; 注册账号（用GitHub登录最方便）&lt;/li&gt;
&lt;li&gt;点击”New Project”&lt;/li&gt;
&lt;li&gt;选择你的 &lt;code&gt;my-blog&lt;/code&gt; 仓库&lt;/li&gt;
&lt;li&gt;Vercel会自动识别Astro框架，不需要改任何配置&lt;/li&gt;
&lt;li&gt;点击”Deploy”，等1-2分钟就好了&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;步骤3：访问你的博客&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;部署成功后，Vercel会给你一个 &lt;code&gt;xxx.vercel.app&lt;/code&gt; 的域名，直接访问就能看到你的博客了！&lt;/p&gt;&lt;p&gt;&lt;strong&gt;绑定自定义域名（可选）&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你有自己的域名，在Vercel项目设置里添加域名，然后去域名服务商添加CNAME记录指向Vercel给的地址就行。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;新手坑提醒&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;确保 &lt;code&gt;astro.config.mjs&lt;/code&gt; 里配置了正确的 &lt;code&gt;site&lt;/code&gt; 地址&lt;/li&gt;
&lt;li&gt;环境变量要在Vercel后台配置，不能直接写在代码里&lt;/li&gt;
&lt;li&gt;第一次部署可能需要5分钟，别着急&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;方案二：Netlify部署（备选方案）&lt;a href=&quot;#方案二netlify部署备选方案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Netlify和Vercel差不多，但在国内访问速度稍好一些。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;步骤1：推送代码到GitHub&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;（和Vercel一样，先把代码推到GitHub）&lt;/p&gt;&lt;p&gt;&lt;strong&gt;步骤2：在Netlify导入项目&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;去 &lt;a href=&quot;https://www.netlify.com/&quot; target=&quot;_blank&quot;&gt;netlify.com&lt;/a&gt; 注册账号&lt;/li&gt;
&lt;li&gt;点击”Add new site” → “Import an existing project”&lt;/li&gt;
&lt;li&gt;连接GitHub，选择你的仓库&lt;/li&gt;
&lt;li&gt;构建设置：
&lt;ul&gt;
&lt;li&gt;Build command: &lt;code&gt;npm run build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Publish directory: &lt;code&gt;dist&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;点击”Deploy”&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;步骤3：访问你的博客&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;同样会给你一个 &lt;code&gt;xxx.netlify.app&lt;/code&gt; 的域名，访问测试。&lt;/p&gt;&lt;/section&gt;&lt;section&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;th&gt;适合人群&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Vercel&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;识别Astro自动配置  &lt;br /&gt;边缘网络快  &lt;br /&gt;CI/CD体验好&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;Netlify&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;国内访问稳定  &lt;br /&gt;免费额度大  &lt;br /&gt;插件生态丰富&lt;/td&gt;&lt;td&gt;配置稍复杂一点&lt;/td&gt;&lt;td&gt;面向中文用户的博客&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;我的建议：&lt;strong&gt;先用Vercel试试，如果国内访问慢再换Netlify&lt;/strong&gt;。两个平台都支持自动部署，你往GitHub推送代码后，它们会自动构建和更新网站。&lt;/p&gt;&lt;/section&gt;&lt;section&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;ol&gt;
&lt;li&gt;在本地写好文章（Markdown文件）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git add .&lt;/code&gt; → &lt;code&gt;git commit -m &quot;新文章&quot;&lt;/code&gt; → &lt;code&gt;git push&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;等2分钟，文章就自动发布到网站了&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;不需要登录服务器，不需要手动构建，不需要上传文件。这就是现代化部署的魔力，第一次体验的时候我真的惊到了。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;section&gt;&lt;h3&gt;问题1：Tailwind样式不生效&lt;a href=&quot;#问题1tailwind样式不生效&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;症状&lt;/strong&gt;：写了Tailwind类名，但页面上没效果。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：&lt;code&gt;tailwind.config.mjs&lt;/code&gt; 的 &lt;code&gt;content&lt;/code&gt; 路径配置不对，Tailwind没扫描到你的文件。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;打开 &lt;code&gt;tailwind.config.mjs&lt;/code&gt;，确保 &lt;code&gt;content&lt;/code&gt; 数组包含了所有需要扫描的文件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;content: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;theme: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;extend: {},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;plugins: [],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;改完后重启开发服务器（&lt;code&gt;Ctrl+C&lt;/code&gt; 停止，再 &lt;code&gt;npm run dev&lt;/code&gt;）。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;问题2：构建时报错”Invalid frontmatter”&lt;a href=&quot;#问题2构建时报错invalid-frontmatter&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;症状&lt;/strong&gt;：本地运行正常，但 &lt;code&gt;npm run build&lt;/code&gt; 时报错。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：Markdown文章的frontmatter格式不对，或者缺少必需字段。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;检查 &lt;code&gt;src/content/config.ts&lt;/code&gt;（如果有的话），看看定义了哪些必需字段。Blog模板一般要求：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;title: &apos;文章标题&apos;           # 必需&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;description: &apos;文章描述&apos;     # 必需&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pubDate: &apos;Dec 02 2025&apos;     # 必需，注意日期格式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tags: [&apos;标签1&apos;, &apos;标签2&apos;]   # 可选&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;用Content Collections的好处就是这个——它会在构建时校验，避免线上出问题。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;问题3：部署后404，本地正常&lt;a href=&quot;#问题3部署后404本地正常&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;症状&lt;/strong&gt;：本地开发一切正常，部署到Vercel/Netlify后访问文章页面显示404。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：&lt;code&gt;astro.config.mjs&lt;/code&gt; 里的 &lt;code&gt;base&lt;/code&gt; 路径配置错误，或者 &lt;code&gt;site&lt;/code&gt; 没配置。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;确保配置文件里有：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;site: &apos;https://你的域名.com&apos;,  // 必须配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// base: &apos;/blog&apos;,  // 只有子目录部署才需要&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果你的博客不是部署在子目录（比如 &lt;code&gt;xxx.com/blog&lt;/code&gt;），就不要设置 &lt;code&gt;base&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;&lt;section&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;strong&gt;症状&lt;/strong&gt;：文章里的图片加载慢，影响体验。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：没用Astro的Image组件优化，或者图片本身太大。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;使用Image组件&lt;/strong&gt;（推荐）：&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { Image } from &apos;astro:assets&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;Image src=&quot;/images/photo.jpg&quot; alt=&quot;描述&quot; width={800} height={600} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;压缩图片&lt;/strong&gt;：用TinyPNG或Squoosh.app压缩后再上传&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;使用CDN&lt;/strong&gt;：把图片放到图床（比如Cloudinary、Imgur），用CDN链接引用&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;问题5：代码块没有语法高亮&lt;a href=&quot;#问题5代码块没有语法高亮&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;症状&lt;/strong&gt;：Markdown里的代码块显示纯文本，没有颜色。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：主题没配置，或者Shiki插件有问题。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;在 &lt;code&gt;astro.config.mjs&lt;/code&gt; 里配置代码高亮主题：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;markdown: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;shikiConfig: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;theme: &apos;github-dark&apos;,  // 或者 &apos;dracula&apos;, &apos;nord&apos; 等&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;Blog模板一般自带Shiki，如果还是不行，试试重装依赖：&lt;code&gt;rm -rf node_modules &amp;amp;&amp;amp; npm install&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;问题6：开发服务器启动慢&lt;a href=&quot;#问题6开发服务器启动慢&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;症状&lt;/strong&gt;：&lt;code&gt;npm run dev&lt;/code&gt; 等半天才启动。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：文章太多，或者安装了太多插件。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;删掉 &lt;code&gt;node_modules&lt;/code&gt; 和 &lt;code&gt;package-lock.json&lt;/code&gt;，重新安装&lt;/li&gt;
&lt;li&gt;减少不必要的插件&lt;/li&gt;
&lt;li&gt;升级到最新版Astro（&lt;code&gt;npm install astro@latest&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Astro 5.x版本启动速度有大幅优化，如果你还在用4.x，建议升级。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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时，选择模板这步花了很久。一开始选了空模板，结果什么都没有，从零开始搭了三天才明白Blog模板的好处。后来直接用Blog模板，1小时就搞定了。&lt;/p&gt;&lt;p&gt;Tailwind配置也踩过坑。写了一堆类名，结果页面上完全不生效。排查了半天才发现是&lt;code&gt;tailwind.config.mjs&lt;/code&gt;里的content路径没配置对。加上&lt;code&gt;./src/**/*.{astro,html}&lt;/code&gt;就好了。&lt;/p&gt;&lt;p&gt;部署到Vercel时忘记配置&lt;code&gt;site&lt;/code&gt;字段，结果sitemap生成的全是相对路径，Google根本抓不到。改完重新部署就好了。&lt;/p&gt;&lt;p&gt;图片优化这块也花了不少时间。一开始用的都是普通&lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;标签，图片动辄2-3MB，Lighthouse性能分数只有80分。后来改用Astro的Image组件，自动转WebP加懒加载，分数直接干到100分。&lt;/p&gt;&lt;p&gt;代码高亮一开始用的是默认主题，白底黑字太刺眼。后来改成&lt;code&gt;github-dark&lt;/code&gt;，舒服多了。如果你也要用Shiki，记得在配置文件里指定主题。&lt;/p&gt;&lt;p&gt;现在我的博客用的是Astro + Vercel + GitHub Actions，写完文章推送代码，2分钟自动发布。Lighthouse 100分，首屏加载0.8秒，维护起来特别轻松。&lt;/p&gt;&lt;p&gt;搭博客这件事，技术只是第一步，更重要的是持续写作。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Astro Markdown 进阶技巧：7个让博客变专业的实用方法</title><link>https://blog.moewah.com/posts/astro-mdx-advanced-tips-blog-professional-upgrade/</link><guid isPermaLink="true">https://blog.moewah.com/posts/astro-mdx-advanced-tips-blog-professional-upgrade/</guid><description>如何用 MDX 让 Astro 博客更专业？本文详解7个进阶技巧，涵盖代码高亮、自定义组件、数学公式等核心功能，帮你从基础 Markdown 升级到专业级技术博客。</description><pubDate>Sat, 12 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;用纯 Markdown 写了几篇文章后发现，能表达的东西太有限了。看别人的技术博客，代码块可以标注重点、可以展示代码改动前后的对比，文章里还能嵌入交互式的组件,自己却只能干巴巴地贴代码。&lt;/p&gt;
&lt;p&gt;Astro 提供了 MDX 这个”增强版 Markdown”。MDX 让你在写文章的时候可以用组件、可以写 JSX，能做的事情一下子多了好几倍。&lt;/p&gt;
&lt;p&gt;这篇文章分享 7 个 Astro Markdown/MDX 的进阶用法，从最基础的环境配置到代码高亮、自定义组件、数学公式、流程图。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;从 Markdown 到 MDX&lt;a href=&quot;#从-markdown-到-mdx&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;为什么要用 MDX？&lt;a href=&quot;#为什么要用-mdx&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Markdown 和 MDX 的区别，就像自行车和电动车——都能骑,但体验完全不同。&lt;/p&gt;&lt;p&gt;纯 Markdown 只能写文本、代码块、图片这些静态内容。你想加个提示框？得用 HTML 硬编码。想在文章里嵌入一个可交互的组件？基本没戏。&lt;/p&gt;&lt;p&gt;MDX 是”Markdown + JSX”的结合体。你可以：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;导入和使用组件&lt;/strong&gt;：直接在 .mdx 文件里 import 任何 Astro 组件或 React/Vue 组件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;写 JSX 表达式&lt;/strong&gt;：在文章里用 &lt;code&gt;{variable}&lt;/code&gt; 插入变量，甚至写循环和条件判断&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自定义元素样式&lt;/strong&gt;：把标准的 &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; 替换成你自己的样式化组件&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;举个具体例子。你想在文章里加个警告框，用纯 Markdown 得这样写：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;div class=&quot;warning&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;p&amp;gt;注意：这个操作会删除所有数据！&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;用 MDX 就能这样：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import Alert from &apos;@/components/Alert.astro&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;Alert type=&quot;warning&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;注意：这个操作会删除所有数据！&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/Alert&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;MDX 让你的文章更像是在”组装积木”，而不是”写代码”。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5分钟配置 MDX 环境&lt;a href=&quot;#5分钟配置-mdx-环境&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;配置 MDX 超简单，三步搞定。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第一步：安装集成包&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;打开终端，在你的 Astro 项目里运行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npx astro add mdx&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;Astro CLI 会自动帮你安装 &lt;code&gt;@astrojs/mdx&lt;/code&gt; 并更新配置文件。这个命令会问你几个问题（要不要更新配置、要不要安装依赖），全部选 Yes 就行。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第二步：验证配置&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;装完后，打开 &lt;code&gt;astro.config.mjs&lt;/code&gt;，应该能看到这样的代码：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { defineConfig } from &apos;astro/config&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import mdx from &apos;@astrojs/mdx&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;integrations: [mdx()],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果没有自动添加，手动加上就行。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第三步：测试 MDX 是否生效&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在 &lt;code&gt;src/pages/&lt;/code&gt; 或 &lt;code&gt;src/content/&lt;/code&gt; 目录下创建一个 &lt;code&gt;test.mdx&lt;/code&gt; 文件：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;title: 测试MDX&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 这是 MDX 测试&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;普通的 Markdown 文本。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export const greeting = &quot;你好&quot;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;现在可以用变量了：{greeting}！&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;div style=&quot;padding: 1rem; background: #f0f0f0;&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;这是一个 JSX 元素&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;运行 &lt;code&gt;npm run dev&lt;/code&gt;，访问对应页面，如果能看到变量和 JSX 元素正常显示，说明 MDX 已经配置成功了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;关于 .md 和 .mdx 文件的共存&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;装了 MDX 集成后，你的 &lt;code&gt;.md&lt;/code&gt; 文件还是正常工作的。Astro 会根据文件扩展名自动选择处理方式：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.md&lt;/code&gt; 文件：按标准 Markdown 处理&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.mdx&lt;/code&gt; 文件：按 MDX 处理，支持组件和 JSX&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我的建议是：普通文章用 &lt;code&gt;.md&lt;/code&gt;，需要用组件的文章用 &lt;code&gt;.mdx&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;代码高亮的进阶技巧&lt;a href=&quot;#代码高亮的进阶技巧&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;配置代码高亮主题（Shiki）&lt;a href=&quot;#配置代码高亮主题shiki&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Astro 默认用 Shiki 做代码高亮，这已经很不错了。但默认主题是 &lt;code&gt;github-dark&lt;/code&gt;，你可能想换个更符合自己博客风格的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Shiki vs Prism 该选哪个？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我推荐 Shiki。它是 Astro 默认的方案，支持 100 多种编程语言和主题，而且是服务端渲染的，不需要加载额外的 JavaScript。Prism 也不错，但需要引入 CSS 文件，配置相对麻烦一点。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;切换内置主题&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;打开 &lt;code&gt;astro.config.mjs&lt;/code&gt;，在 &lt;code&gt;markdown&lt;/code&gt; 配置里加上 &lt;code&gt;shikiConfig&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { defineConfig } from &apos;astro/config&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import mdx from &apos;@astrojs/mdx&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;integrations: [mdx()],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;markdown: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;shikiConfig: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;theme: &apos;dracula&apos;, // 可选：github-dark, nord, monokai, dracula 等&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;Shiki 支持超多主题，我常用的有：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;github-dark&lt;/code&gt; / &lt;code&gt;github-light&lt;/code&gt; - GitHub 风格&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dracula&lt;/code&gt; - 经典的紫黑配色&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nord&lt;/code&gt; - 清冷的北欧风&lt;/li&gt;
&lt;li&gt;&lt;code&gt;one-dark-pro&lt;/code&gt; - VSCode 默认深色主题&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;你可以在 &lt;a href=&quot;https://shiki.style/themes&quot; target=&quot;_blank&quot;&gt;Shiki 主题预览&lt;/a&gt; 里挑一个自己喜欢的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;实现浅色/深色双主题切换&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你的博客支持深浅色模式切换，Shiki 可以配置双主题：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;markdown: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;shikiConfig: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;themes: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;light: &apos;github-light&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;dark: &apos;github-dark&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这样配置后，Shiki 会根据 CSS 的 &lt;code&gt;prefers-color-scheme&lt;/code&gt; 或你自定义的主题切换逻辑自动应用对应的代码高亮主题。&lt;/p&gt;&lt;/section&gt;&lt;section&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;写教程的时候，经常需要标注”看这一行很重要”或者展示”代码改了哪些地方”。Shiki Transformers 可以实现这些功能。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;高亮重点代码行&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;先安装 Shiki 的 transformers：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm install shiki&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后在配置里启用 &lt;code&gt;transformerNotationHighlight&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { defineConfig } from &apos;astro/config&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import mdx from &apos;@astrojs/mdx&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { transformerNotationHighlight } from &apos;@shikijs/transformers&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;integrations: [mdx()],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;markdown: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;shikiConfig: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;theme: &apos;github-dark&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;transformers: [transformerNotationHighlight()],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;现在可以在代码块里用 &lt;code&gt;// [!code highlight]&lt;/code&gt; 注释来标记需要高亮的行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```javascript&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;function hello() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console.log(&apos;这行是普通的&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console.log(&apos;这行会高亮显示&apos;); // [!code highlight]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;展示代码变更（Diff 风格）&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在对比”修改前/后”的代码时，可以用 &lt;code&gt;transformerNotationDiff&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { transformerNotationDiff, transformerNotationHighlight } from &apos;@shikijs/transformers&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;markdown: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;shikiConfig: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;theme: &apos;github-dark&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;transformers: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;transformerNotationHighlight(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;transformerNotationDiff(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;用法：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```javascript&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;function calculate(a, b) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return a + b; // [!code --]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return a * b; // [!code ++]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;带 &lt;code&gt;--&lt;/code&gt; 的行会显示为红色（删除），带 &lt;code&gt;++&lt;/code&gt; 的行显示为绿色（新增）。这个功能写代码教程时超级实用。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;聚焦特定代码&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;还有一个 &lt;code&gt;transformerNotationFocus&lt;/code&gt;，可以让其他代码”变灰”，只突出你想强调的部分：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { transformerNotationFocus } from &apos;@shikijs/transformers&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 添加到 transformers 数组&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;transformers: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;transformerNotationFocus(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;使用 &lt;code&gt;// [!code focus]&lt;/code&gt; 标记：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```javascript&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;function process() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console.log(&apos;这行会变灰&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console.log(&apos;这行正常显示&apos;); // [!code focus]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console.log(&apos;这行也变灰&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;升级到 Expressive Code（可选）&lt;a href=&quot;#升级到-expressive-code可选&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果你觉得 Shiki 的功能还不够，可以试试 Expressive Code。它是社区开发的增强版代码展示方案，提供了更多开箱即用的功能：&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;代码对比（Side-by-Side）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;安装超简单&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npx astro add astro-expressive-code&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;Astro CLI 会自动配置好一切。装完后，你的代码块就自动带上这些功能了，不需要额外配置。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;什么时候用 Expressive Code？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我一开始用的是默认的 Shiki，后来发现读者经常想复制代码，就换成了 Expressive Code。如果你的博客主要是写教程、分享代码，Expressive Code 能让读者体验好很多。&lt;/p&gt;&lt;p&gt;但如果只是偶尔放点代码，用 Shiki + Transformers 就够了，不用增加额外的依赖。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;嵌入自定义组件&lt;a href=&quot;#嵌入自定义组件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;在 MDX 中导入和使用组件&lt;a href=&quot;#在-mdx-中导入和使用组件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;MDX 最强大的地方就是可以直接在文章里用组件。我经常用这个功能做提示框、代码对比、可折叠区域等。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;创建一个警告框组件&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;先在 &lt;code&gt;src/components/&lt;/code&gt; 目录下创建一个 &lt;code&gt;Alert.astro&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;interface Props {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type?: &apos;info&apos; | &apos;warning&apos; | &apos;error&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const { type = &apos;info&apos; } = Astro.props;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const styles = {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;info: &apos;bg-blue-50 border-blue-200 text-blue-800&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;warning: &apos;bg-yellow-50 border-yellow-200 text-yellow-800&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;error: &apos;bg-red-50 border-red-200 text-red-800&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;div class={`border-l-4 p-4 ${styles[type]}`}&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;slot /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;在 MDX 文章中使用&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在你的 &lt;code&gt;.mdx&lt;/code&gt; 文件里导入并使用它：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;title: 我的技术文章&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import Alert from &apos;@/components/Alert.astro&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 文章标题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;这是普通的文章内容。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;Alert type=&quot;warning&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;注意：运行这个命令前请备份数据！&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/Alert&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;Alert type=&quot;info&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;提示：你也可以在组件里用 **Markdown 语法**，很方便。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/Alert&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;在 &lt;code&gt;&amp;lt;Alert&amp;gt;&lt;/code&gt; 组件里，你还可以继续用 Markdown 语法（如加粗、链接等），MDX 会自动处理。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;使用 React/Vue 组件&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;MDX 不仅支持 Astro 组件，也可以用 React、Vue 等框架组件。不过要注意加上 &lt;code&gt;client:&lt;/code&gt; 指令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import Counter from &apos;@/components/Counter.tsx&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;Counter client:load initialCount={0} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;client:load&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/components/mdx/&lt;/code&gt; 目录下，这样好管理：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;src/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── components/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── mdx/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   ├── Alert.astro&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   ├── CodeCompare.astro&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   ├── Callout.astro&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   └── Tabs.astro&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   └── ...其他组件&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;这个功能有点”黑魔法”的感觉——你可以把 Markdown 的标准元素（如 h1、a、img）替换成你自己的组件。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;为什么要这么做？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;比如你想给所有的标题加个锚点图标，或者给外部链接自动加个”↗“标记，手动一个个加太麻烦了。用组件映射，写标准 Markdown 就自动应用你的样式。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;实战：自定义标题组件&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;先创建一个 &lt;code&gt;CustomHeading.astro&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;interface Props {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;level: 1 | 2 | 3 | 4 | 5 | 6;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;id?: string;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const { level, id } = Astro.props;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const Tag = `h${level}` as any;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;Tag id={id} class=&quot;group relative&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;slot /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{id &amp;amp;&amp;amp; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;a href={`#${id}`} class=&quot;ml-2 opacity-0 group-hover:opacity-100 transition-opacity&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;)}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/Tag&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;在 MDX 中使用映射&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在你的 &lt;code&gt;.mdx&lt;/code&gt; 文件里，导出一个 &lt;code&gt;components&lt;/code&gt; 对象：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;title: 文章标题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import CustomHeading from &apos;@/components/CustomHeading.astro&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export const components = {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;h2: (props) =&amp;gt; &amp;lt;CustomHeading level={2} {...props} /&amp;gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;h3: (props) =&amp;gt; &amp;lt;CustomHeading level={3} {...props} /&amp;gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 这是二级标题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;鼠标悬停在标题上，会出现 # 锚点链接。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;### 这是三级标题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;所有 h2 和 h3 都自动应用了自定义样式。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;实战：给外部链接加图标&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;创建 &lt;code&gt;ExternalLink.astro&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;interface Props {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;href?: string;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const { href } = Astro.props;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const isExternal = href?.startsWith(&apos;http&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;a href={href} target={isExternal ? &apos;_blank&apos; : undefined} rel={isExternal ? &apos;noopener noreferrer&apos; : undefined}&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;slot /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{isExternal &amp;amp;&amp;amp; &amp;lt;span class=&quot;ml-1 text-xs&quot;&amp;gt;↗&amp;lt;/span&amp;gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;映射使用：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import ExternalLink from &apos;@/components/ExternalLink.astro&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export const components = {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;a: ExternalLink,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[这是内部链接](/about)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[这是外部链接](https://example.com) ← 会自动加 ↗ 图标&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;全局配置映射（高级）&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你想让所有 MDX 文件都用同一套组件映射，可以在 &lt;code&gt;astro.config.mjs&lt;/code&gt; 里配置。不过这个需要自定义 MDX 插件，稍微复杂一点，我一般是在单个文件里配置就够了。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;数学公式和图表集成&lt;a href=&quot;#数学公式和图表集成&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;集成 KaTeX 展示数学公式&lt;a href=&quot;#集成-katex-展示数学公式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果你写算法、数学或数据科学类的文章，肯定需要展示公式。KaTeX 是目前最好的选择，比 MathJax 快很多，而且支持服务端渲染。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;安装 KaTeX&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;需要安装三个包：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm install remark-math rehype-katex katex&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;remark-math&lt;/code&gt;：解析 LaTeX 语法&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rehype-katex&lt;/code&gt;：渲染公式为 HTML&lt;/li&gt;
&lt;li&gt;&lt;code&gt;katex&lt;/code&gt;：KaTeX 核心库&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;配置 Astro&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;打开 &lt;code&gt;astro.config.mjs&lt;/code&gt;，添加这两个插件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { defineConfig } from &apos;astro/config&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import mdx from &apos;@astrojs/mdx&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import remarkMath from &apos;remark-math&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import rehypeKatex from &apos;rehype-katex&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;integrations: [mdx()],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;markdown: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;remarkPlugins: [remarkMath],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;rehypePlugins: [rehypeKatex],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;引入 KaTeX 样式&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这一步很重要，不然公式渲染不出来。在你的布局文件（如 &lt;code&gt;src/layouts/MarkdownLayout.astro&lt;/code&gt;）的 &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 里加上：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;link&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;rel=&quot;stylesheet&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;href=&quot;https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;crossorigin=&quot;anonymous&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;在文章中使用公式&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;配置好后，就可以在 Markdown/MDX 里写公式了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;行内公式&lt;/strong&gt;（用单个 &lt;code&gt;$&lt;/code&gt; 包裹）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;质能方程：$E = mc^2$&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;二次方程的解：$x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}$&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;块级公式&lt;/strong&gt;（用双 &lt;code&gt;$$&lt;/code&gt; 包裹）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$$&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$$&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$$&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;\sum_{i=1}^{n} i = \frac{n(n+1)}{2}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$$&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;常见问题：公式不显示&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果公式不显示或样式不对，检查这几点：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;KaTeX CSS 是否正确引入（F12 看 Network 面板）&lt;/li&gt;
&lt;li&gt;rehype-katex 的版本是否兼容（试试降到 6.x 版本）&lt;/li&gt;
&lt;li&gt;公式语法是否正确（去 &lt;a href=&quot;https://katex.org/docs/supported.html&quot; target=&quot;_blank&quot;&gt;KaTeX 支持列表&lt;/a&gt; 确认）&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;集成 Mermaid 绘制流程图和图表&lt;a href=&quot;#集成-mermaid-绘制流程图和图表&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Mermaid 可以用代码画流程图、时序图、甘特图等，特别适合技术文档。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;三种集成方案对比&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;社区有几种 Mermaid 集成方案，我简单说说区别：&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;SEO&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;rehype-mermaid&lt;/td&gt;&lt;td&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;astro-diagram&lt;/td&gt;&lt;td&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;astro-mermaid&lt;/td&gt;&lt;td&gt;客户端&lt;/td&gt;&lt;td&gt;差&lt;/td&gt;&lt;td&gt;低&lt;/td&gt;&lt;td&gt;⭐⭐⭐&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;我推荐 &lt;strong&gt;rehype-mermaid&lt;/strong&gt;，服务端渲染，SEO 友好，生成的是静态 SVG。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;安装 rehype-mermaid&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm install rehype-mermaid&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;配置&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在 &lt;code&gt;astro.config.mjs&lt;/code&gt; 里添加：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { defineConfig } from &apos;astro/config&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import mdx from &apos;@astrojs/mdx&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import rehypeMermaid from &apos;rehype-mermaid&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;integrations: [mdx()],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;markdown: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;rehypePlugins: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[rehypeMermaid, { strategy: &apos;img-svg&apos; }]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;strategy: &apos;img-svg&apos;&lt;/code&gt; 表示生成 SVG 图片，这是最稳定的方案。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;在文章中画图&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;用 &lt;code&gt;mermaid&lt;/code&gt; 代码块就行：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;流程图示例&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```mermaid&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;graph TD&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;A[开始] --&amp;gt; B{是否安装MDX}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;B --&amp;gt;|是| C[配置代码高亮]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;B --&amp;gt;|否| D[安装MDX]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;D --&amp;gt; C&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;C --&amp;gt; E[完成]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;时序图示例&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```mermaid&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sequenceDiagram&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;用户-&amp;gt;&amp;gt;浏览器: 访问页面&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;浏览器-&amp;gt;&amp;gt;服务器: 请求HTML&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;服务器-&amp;gt;&amp;gt;浏览器: 返回渲染后的页面&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;浏览器-&amp;gt;&amp;gt;用户: 显示内容&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;```&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;构建时生成&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;运行 &lt;code&gt;npm run build&lt;/code&gt; 时，Mermaid 图表会在构建阶段生成为 SVG，最终页面里是静态图片，加载速度快，也不需要客户端 JavaScript。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;注意事项&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果构建时报错”找不到 Puppeteer”，可能需要额外配置。试试安装 playwright：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm install -D playwright&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;或者换用 astro-diagram 方案，它内置了浏览器环境。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;高级技巧和最佳实践&lt;a href=&quot;#高级技巧和最佳实践&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Content Collections 的 MDX 优化&lt;a href=&quot;#content-collections-的-mdx-优化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果你用 Astro 的 Content Collections 管理博客文章（强烈推荐），MDX 文件可以获得更好的类型支持和开发体验。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Content Collections 是什么？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;简单说，就是把文章放在 &lt;code&gt;src/content/&lt;/code&gt; 目录下，Astro 会自动识别、验证 frontmatter，并提供类型安全的 API 来读取内容。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;配置 Content Collections&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在 &lt;code&gt;src/content/config.ts&lt;/code&gt; 定义你的集合：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { defineCollection, z } from &apos;astro:content&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const blog = defineCollection({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type: &apos;content&apos;, // 表示这是内容文件（Markdown/MDX）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;schema: z.object({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title: z.string(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description: z.string(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pubDate: z.date(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tags: z.array(z.string()).optional(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;draft: z.boolean().default(false),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export const collections = { blog };&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;在 MDX 中使用&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;MDX 文件的 frontmatter 会被自动验证：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;title: Astro MDX 进阶教程&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;description: 学习 MDX 的高级用法&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pubDate: 2025-12-02&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tags: [Astro, MDX, 教程]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import Alert from &apos;@/components/Alert.astro&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# {frontmatter.title}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;Alert type=&quot;info&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;发布日期：{frontmatter.pubDate.toLocaleDateString()}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/Alert&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;自动生成目录&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Content Collections 提供了 &lt;code&gt;getHeadings()&lt;/code&gt; 方法，可以获取文章的所有标题，用来生成目录：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { getEntry } from &apos;astro:content&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const entry = await getEntry(&apos;blog&apos;, &apos;my-mdx-article&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const { Content, headings } = await entry.render();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;aside&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;h2&amp;gt;目录&amp;lt;/h2&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{headings.map(h =&amp;gt; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;li style={`margin-left: ${(h.depth - 1) * 1}rem`}&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;a href={`#${h.slug}`}&amp;gt;{h.text}&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;))}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/aside&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;Content /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这个功能在写长文时特别实用，读者可以快速跳转到感兴趣的章节。&lt;/p&gt;&lt;/section&gt;&lt;section&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;MDX 很强大，但用不好也会拖慢网站。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;避免过度使用客户端组件&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;MDX 里可以用 React/Vue 组件，但别忘了加 &lt;code&gt;client:*&lt;/code&gt; 指令。如果不加，组件只会服务端渲染，交互功能不生效；如果滥用 &lt;code&gt;client:load&lt;/code&gt;，会增加大量 JavaScript，拖慢页面加载。&lt;/p&gt;&lt;p&gt;我的建议：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;静态内容用 Astro 组件（如 Alert、Callout）&lt;/li&gt;
&lt;li&gt;需要交互的用 &lt;code&gt;client:visible&lt;/code&gt;（可见时才加载）或 &lt;code&gt;client:idle&lt;/code&gt;（空闲时加载）&lt;/li&gt;
&lt;li&gt;除非必要，不用 &lt;code&gt;client:load&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;图片优化&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在 MDX 里插入图片，别直接用 &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;，用 Astro 的 Image 组件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;title: 我的文章&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { Image } from &apos;astro:assets&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import cover from &apos;./cover.jpg&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;Image src={cover} alt=&quot;封面图&quot; width={800} height={600} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;Astro 会自动优化图片（压缩、生成 WebP、懒加载等），性能好很多。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;MDX 的 optimize 选项&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你的站点有很多 MDX 文件，构建很慢，可以试试开启 &lt;code&gt;optimize&lt;/code&gt; 选项：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;integrations: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;mdx({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;optimize: true,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这个选项会通过内部的 rehype 插件优化 MDX 输出，加快构建速度。不过可能会改变生成的 HTML 结构，用之前先测试一下。&lt;/p&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;MDX 组件不显示&lt;/td&gt;&lt;td&gt;忘了导入组件&lt;/td&gt;&lt;td&gt;检查 import 语句&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;交互组件不工作&lt;/td&gt;&lt;td&gt;缺少 client: 指令&lt;/td&gt;&lt;td&gt;加上 &lt;code&gt;client:load&lt;/code&gt; 等&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;代码高亮不生效&lt;/td&gt;&lt;td&gt;Shiki 配置错误&lt;/td&gt;&lt;td&gt;检查 astro.config.mjs&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;数学公式不渲染&lt;/td&gt;&lt;td&gt;KaTeX CSS 未引入&lt;/td&gt;&lt;td&gt;在 layout 里加 CSS 链接&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;构建很慢&lt;/td&gt;&lt;td&gt;MDX 文件太多&lt;/td&gt;&lt;td&gt;开启 optimize 选项&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;第一次用 MDX 时最常遇到的问题是组件不显示。折腾了半天才发现，在 &lt;code&gt;.mdx&lt;/code&gt; 文件里导入组件要放在 frontmatter 之后，不能放在前面。这个错误我犯了两次，后来才记住。&lt;/p&gt;&lt;p&gt;配置 Shiki Transformers 也花了不少时间。按照文档安装了 &lt;code&gt;@shikijs/transformers&lt;/code&gt;，结果导入时一直报错。后来发现是版本问题，需要安装 &lt;code&gt;shiki&lt;/code&gt; 本身而不是只用 transformers 包。改完之后 transformers 就能正常工作了。&lt;/p&gt;&lt;p&gt;KaTeX 的样式引入也踩过坑。一开始把 CSS 链接放在了组件里，结果页面切换时样式就丢失了。后来把 CSS 链接移到全局 layout 文件的 &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 里，问题才解决。&lt;/p&gt;&lt;p&gt;Mermaid 图表在构建时一直失败，提示找不到浏览器环境。试了好几个方案，最后换成了 &lt;code&gt;astro-diagram&lt;/code&gt;，它内置了 headless 浏览器，配置简单很多。现在写架构图、流程图都用 Mermaid，比画图工具快多了。&lt;/p&gt;&lt;p&gt;Content Collections 的 schema 定义一开始没太在意，写了篇文章 frontmatter 字段写错了，构建时才发现。后来慢慢习惯了，加上 schema 后写文章时 IDE 会给类型提示，反而减少了很多错误。&lt;/p&gt;&lt;p&gt;MDX 确实让写技术博客灵活了很多。现在写代码教程会加代码高亮标注，写算法文章会加数学公式，写架构设计会画流程图。读者反馈说看着清晰多了，我自己写起来也顺手。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>《垫底辣妹》的逆袭教育启示</title><link>https://blog.moewah.com/posts/bottom-girl-movie-inspirational-education-insights/</link><guid isPermaLink="true">https://blog.moewah.com/posts/bottom-girl-movie-inspirational-education-insights/</guid><description>为什么一个学渣能考上名校？本文深度解析电影《垫底辣妹》的励志教育内核，探讨家庭教育、师生关系与个人成长的力量，揭示逆袭背后的现实主义温情叙事。</description><pubDate>Thu, 10 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&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; 土井裕泰 (Nobuhiro Doi)&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;strong&gt;励志教育片&lt;/strong&gt;和&lt;strong&gt;青春成长片&lt;/strong&gt;。其叙事风格以&lt;strong&gt;现实主义&lt;/strong&gt;为基调，但在描绘主人公逆袭的过程中融入了&lt;strong&gt;积极乐观&lt;/strong&gt;的喜剧元素，以及对家庭、师生关系的温情刻画。它通过展现个人努力与外部支持相结合，最终实现目标的故事，传递了强烈的正能量。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&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;strong&gt;师生关系的深远影响&lt;/strong&gt;以及**“可能性”的力量**。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;关于家庭：&lt;/strong&gt; 土井裕泰曾表示，电影中母亲对女儿无条件的支持是影片的核心，他想展现母亲如何通过爱和信任，而非高压，来激发孩子的潜力&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;。这种支持是主人公能够坚持下去的重要动力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关于教育：&lt;/strong&gt; 导演意图通过坪田老师这一角色，传达“每个孩子都有自己的闪光点，教育的意义在于发现并引导这些闪光点”的理念。他认为，传统的应试教育往往忽视了学生的个性，而坪田老师的教育方式则是个性化、启发式的典范&lt;sup&gt;&lt;a href=&quot;#user-content-fn-2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关于可能性：&lt;/strong&gt; 影片的核心主题是打破固有观念，相信人的潜力是无限的。导演希望观众能从中获得勇气，认识到只要付出努力，即使是看起来“不可能”的事情，也可能变为现实&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;。他旨在鼓励那些感到迷茫或被标签化的年轻人，找到自己的方向。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&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;以下是影片中体现主题的10条核心台词及其场景分析：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;“世界上最爱我的人，不是我的父亲，而是我的母亲。”&lt;/strong&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;/li&gt;
&lt;li&gt;&lt;strong&gt;“你现在就是块金子，只不过需要打磨一下。”&lt;/strong&gt; (约第15分钟，坪田老师第一次见到沙耶加时说)
&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;/li&gt;
&lt;li&gt;&lt;strong&gt;“努力，是不会背叛你的。”&lt;/strong&gt; (约第40分钟，坪田老师鼓励沙耶加坚持学习时说)
&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;/li&gt;
&lt;li&gt;&lt;strong&gt;“不是只有你一个人在战斗。”&lt;/strong&gt; (约第65分钟，坪田老师在沙耶加感到疲惫时说)
&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;/li&gt;
&lt;li&gt;&lt;strong&gt;“我的人生，由我自己来决定。”&lt;/strong&gt; (约第78分钟，沙耶加面对父亲的质疑时坚定地说)
&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;/li&gt;
&lt;li&gt;&lt;strong&gt;“没有什么是不能改变的，只要你真心想改变。”&lt;/strong&gt; (约第85分钟，坪田老师对沙耶加的弟弟说)
&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;/li&gt;
&lt;li&gt;&lt;strong&gt;“考不考得上无所谓，我已经很满足了。”&lt;/strong&gt; (约第100分钟，母亲在沙耶加模拟考失利后说)
&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;/li&gt;
&lt;li&gt;&lt;strong&gt;“如果我能成为像坪田老师那样的人，那该多好。”&lt;/strong&gt; (约第110分钟，沙耶加考上大学后内心独白)
&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;/li&gt;
&lt;li&gt;&lt;strong&gt;“人生路上，会遇到很多坎坷，但只要坚持，总会过去的。”&lt;/strong&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;/li&gt;
&lt;li&gt;&lt;strong&gt;“不管被周围人怎么说不行，保持自信继续挑战，才是最棒的。”&lt;/strong&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;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&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;&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;li&gt;&lt;strong&gt;与同类影片的比较：&lt;/strong&gt; 相较于《死亡诗社》等强调反叛与自由的教育片，《垫底辣妹》更侧重于个体在现有教育体系下通过努力实现自我价值的路径，更具普适性和操作性。与韩国的《熔炉》等揭露社会阴暗面的电影相比，它则提供了一个积极向上、充满希望的视角。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&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;《垫底辣妹》的文本结构（沙耶加从偏差值30到庆应大学的逆袭）构建了一个清晰的成长弧线。这种文本设计巧妙地服务于其社会意义的传达：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;文本（台词与情节）：&lt;/strong&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;/li&gt;
&lt;li&gt;&lt;strong&gt;导演意图：&lt;/strong&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;li&gt;&lt;strong&gt;社会意义：&lt;/strong&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;li&gt;&lt;strong&gt;对社会：&lt;/strong&gt; 传递积极向上的价值观，鼓励人们在面对困境时，不畏挑战，坚持梦想，相信通过努力可以改变命运。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;综上所述，《垫底辣妹》不仅是一部成功的商业励志片，更是一部具有深刻社会意义和教育价值的影片。它通过温暖人心的故事，传递了积极的教育理念和人生信念，在影史上留下了其独特的印记。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Footnotes&lt;a href=&quot;#footnote-label&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://movie.douban.com/review/7679308/&quot; target=&quot;_blank&quot;&gt;土井裕泰导演访谈：我只是想拍一部好看的电影 - 豆瓣&lt;/a&gt; (请注意，此为豆瓣影评，可能包含访谈片段引用，但并非官方访谈原文链接，仅作参考来源类型标注) &lt;a href=&quot;#user-content-fnref-1&quot;&gt;↩&lt;/a&gt; &lt;a href=&quot;#user-content-fnref-1-2&quot;&gt;↩&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://ent.sina.com.cn/m/f/2016-04-18/doc-ifxirenh0926727.shtml&quot; target=&quot;_blank&quot;&gt;电影《垫底辣妹》导演土井裕泰访谈实录：沙耶加的故事并非奇迹 - 新浪娱乐&lt;/a&gt; (此为媒体访谈，具备一定权威性) &lt;a href=&quot;#user-content-fnref-2&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content:encoded></item><item><title>《当幸福来敲门》励志人生启示录</title><link>https://blog.moewah.com/posts/when-happiness-knocks-the-pursuit-of-happyness/</link><guid isPermaLink="true">https://blog.moewah.com/posts/when-happiness-knocks-the-pursuit-of-happyness/</guid><description>如何在绝境中守护梦想？本文深度解析电影《当幸福来敲门》的励志内核，揭示克里斯·加德纳在贫困与困境中坚持奋斗的真实故事，提供关于梦想、家庭与幸福的深刻思考。</description><pubDate>Mon, 30 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;电影深度解读：《当幸福来敲门》&lt;a href=&quot;#电影深度解读当幸福来敲门&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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; 加布里埃莱·穆奇诺 (Gabriele Muccino)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;国籍：&lt;/strong&gt; 意大利&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代表作：&lt;/strong&gt; 《当幸福来敲门》(The Pursuit of Happyness, 2006)、《七磅》(Seven Pounds, 2008) 等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;影片风格：&lt;/strong&gt; 《当幸福来敲门》是一部改编自真实故事的美国传记剧情片 (biographical drama film)，融合了现实主义、励志和家庭情感元素。影片以1981年的旧金山为背景，描绘了主人公克里斯·加德纳（Chris Gardner）在经济低迷时期为追求“美国梦”而奋斗的历程。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;/p&gt;&lt;/section&gt;&lt;section&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;以下是影片中10条以上体现主题的核心台词及其场景分析（中英双语对照）：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“You have a dream, you got to protect it. People can’t do something by themselves; they wanna tell you you cannot do it. If you want something, go get it.”&lt;/strong&gt; 如果你有梦想，你就得去捍卫它。那些自己做不到的人，会告诉你你也做不到。如果你想要什么，就去争取。(第约1小时18分钟，克里斯在篮球场对儿子说)&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“This part of my life, this little part, is called happiness.”&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“I’m the type of person, if you ask me a question, and I don’t know the answer, I’m gonna to tell you that I don’t know. But I bet you what: I know how to find the answer, and I’ll find the answer.”&lt;/strong&gt; 我是这样的人，如果你问我一个问题，我不知道答案，我就会告诉你我不知道。但我向你保证：我知道如何找到答案，而且我一定会找到答案。(第约55分钟，克里斯面试时对主管说)&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“The future was uncertain, no doubt, but for the first time in a long time, I felt hopeful.”&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“It was right then that I started thinking about Thomas Jefferson, and the Declaration of Independence, and the right to life, liberty, and the pursuit of happiness. And I remember thinking, how did he know to put the ‘pursuit’ in there? That maybe happiness is something that we can only pursue. And maybe we can actually never have it. No matter what. How would you know what to call it if you never actually had it? Then he wrote ‘happyness’ with an ‘i’ instead of a ‘y.’ I mean, who spells ‘happiness’ with an ‘i’?”&lt;/strong&gt; 就在那时我开始思考托马斯·杰斐逊，以及《独立宣言》，以及生命、自由和追求幸福的权利。我记得我在想，他怎么知道要在里面加上‘追求’呢？也许幸福是我们只能追求的东西。也许我们永远都无法真正拥有它。无论如何。如果你从未真正拥有过它，你怎么知道该怎么称呼它呢？然后他把‘幸福’拼成了‘happyness’，用‘i’代替了‘y’。我的意思是，谁会把‘happiness’拼成‘i’呢？(影片开头和结尾多次出现，克里斯对托儿所墙壁涂鸦的思考)&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“This is a very important moment in your life. Don’t let anybody tell you that you can’t do something.”&lt;/strong&gt; 这是你生命中一个非常重要的时刻。不要让任何人告诉你你做不到。(第约1小时18分钟，与第一条台词前后呼应)&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“The bone density scanner was never going to be the next big thing.”&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“I had to protect him. I had to protect him.”&lt;/strong&gt; 我必须保护他。我必须保护他。(第约1小时30分钟，克里斯在地铁站厕所里抱儿子入睡时内心独白)&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“It was then that I realized that I had to protect my son from my life.”&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“Being good at something doesn’t necessarily mean you’re going to be good at it on a professional level.”&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“And it was in that moment, when I was sitting there, that I decided that I was going to change my life.”&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;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&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;传记剧情片 (Biographical Drama)&lt;/strong&gt; 和&lt;strong&gt;现实主义 (Realism)&lt;/strong&gt; 风格，并带有强烈的&lt;strong&gt;励志 (Inspirational)&lt;/strong&gt; 色彩。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;现实主义：&lt;/strong&gt; 导演加布里埃莱·穆奇诺在影片中运用了纪实性的摄影手法，例如手持摄像、自然光线，以及对旧金山街头真实场景的捕捉，营造出一种粗粝的真实感。这种风格避免了过度戏剧化，使得观众能够更直观地感受到克里斯·加德纳所面临的贫困、无家可归以及社会底层挣扎的残酷现实。例如，克里斯父子在地铁站厕所过夜的场景，通过特写和远景的切换，将人物的绝望与环境的肮脏形成鲜明对比，极具冲击力，让观众产生强烈的同情与共鸣。这种现实主义的呈现，增强了影片的社会批判性，让观众反思美国社会中存在的贫富差距和“美国梦”的实现难度。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;励志与温情：&lt;/strong&gt; 尽管影片充满现实的残酷，但其核心基调是积极向上的励志。影片通过克里斯永不放弃的精神、对儿子的深沉父爱以及最终成功的结局，为观众提供了强大的情感支持和希望。导演巧妙地平衡了苦难与希望，例如克里斯在面对绝境时依然能与儿子保持乐观和幽默，这种父子间的温情互动是影片最动人的力量，也是推动剧情发展的核心动力。影片的励志元素在于，它并非宣扬轻松的成功学，而是强调在面对巨大阻力时，个人坚韧不拔的意志和不懈奋斗的重要性。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;ol&gt;
&lt;li&gt;&lt;strong&gt;对“美国梦”的具象化与再审视：&lt;/strong&gt; 影片直观地呈现了“美国梦”在底层民众身上如何被追求和实现。它不仅歌颂了通过个人奋斗实现阶层跨越的可能性，同时也展现了实现这一梦想所付出的巨大代价和其中的艰辛。它避免了过度浪漫化，而是以一种更贴近现实的方式，让观众看到“美国梦”并非唾手可得，而是充满挑战和牺牲的漫长“追求”过程。这使得影片在众多励志片中脱颖而出，引发了关于社会公平和个人机遇的深思。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;威尔·史密斯演技的突破：&lt;/strong&gt; 影片中威尔·史密斯（Will Smith）的表演获得了广泛赞誉，甚至为他赢得了奥斯卡最佳男主角提名。他成功地塑造了一个在绝望中挣扎但又充满尊严和父爱的复杂角色，展现了其作为严肃演员的深厚功力，超越了以往喜剧或动作片的形象。他与亲生儿子贾登·史密斯（Jaden Smith）的对手戏也为影片增添了真实的父子情感，使得影片更具感染力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;普世情感的共鸣：&lt;/strong&gt; 尽管故事背景设定在美国，但影片所探讨的父爱、坚韧、希望和对美好生活的追求是跨越文化和国界的。无论是面对经济困境、家庭破裂还是社会偏见，克里斯的奋斗都能够引起全球观众的共鸣。这使得影片成为一部具有广泛影响力的励志经典，至今仍被许多学校和机构作为教育素材播放。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;与同类影片的比较：&lt;/strong&gt; 相较于《肖申克的救赎》(The Shawshank Redemption) 等侧重于精神自由的励志片，《当幸福来敲门》更聚焦于现实生活中物质和生存的困境，以及主人公如何通过实际行动改变命运。与《阿甘正传》(Forrest Gump) 中带有偶然和奇遇色彩的成功不同，《当幸福来敲门》的成功则更强调个人意志、智慧和坚持的决定性作用。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;综合来看，《当幸福来敲门》以其真挚的情感、现实主义的风格和深刻的主题，成功构建了一个从个人文本（克里斯·加德纳的奋斗）到普遍社会意义（对“美国梦”的探讨和普世价值观的传递）的分析链条。它不仅是一部感人的电影，更是一面折射社会现实、激励人心的镜子。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>0基础注册公众号避坑指南</title><link>https://blog.moewah.com/posts/0-base-public-account-registration-avoid-pitfalls/</link><guid isPermaLink="true">https://blog.moewah.com/posts/0-base-public-account-registration-avoid-pitfalls/</guid><description>想做公众号但不知道从哪开始？本文手把手教你30分钟完成注册，解决订阅号与服务号选择、邮箱绑定等90%新手常见问题，助你避开注册陷阱快速上手。</description><pubDate>Thu, 26 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;去年这时候我打开公众平台官网，盯着”立即注册”按钮看了十分钟。订阅号是什么？服务号又是什么？选错了怎么办？关掉页面，想”改天再弄吧”。&lt;/p&gt;
&lt;p&gt;这一改天就是大半年。&lt;/p&gt;
&lt;p&gt;真动手注册时发现没那么复杂，但该踩的坑一个没少——名字取太随意，后来想改才发现一年只能改两次；邮箱用常用的那个，提示已经绑定过其他产品，又得折腾。&lt;/p&gt;
&lt;section&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;section&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;strong&gt;服务号&lt;/strong&gt;更偏企业服务，一个月只能发4条推送，但功能接口更多，比如支付、会员这些。&lt;/p&gt;&lt;p&gt;个人没有营业执照只能选订阅号。服务号必须用企业资质注册。&lt;/p&gt;&lt;p&gt;这俩不能互相转，一开始选了啥以后就是啥。&lt;/p&gt;&lt;p&gt;想做自媒体、分享内容、打造个人品牌，就选订阅号。99%的新手都是这个答案。&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;/td&gt;&lt;td&gt;每天1条&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;/td&gt;&lt;td&gt;每月4条&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;/section&gt;&lt;section&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;/p&gt;&lt;p&gt;先当副业来做。把内容做好了，粉丝攒起来了，收益自然就有了。太急着变现反而容易把路走歪。&lt;/p&gt;&lt;p&gt;比起眼前那点收益，公众号更大的价值是个人品牌的沉淀。你写的每一篇文章都在帮你建立专业形象，这东西的价值是长期的。&lt;/p&gt;&lt;/section&gt;&lt;section&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;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;名称（2-16个字，一年只能改2次）&lt;/li&gt;
&lt;li&gt;头像（一个月最多改5次）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;注册大概要20分钟，后面那些基础设置可能还要1小时左右。找个安静的时间段一口气搞定就行。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;手把手注册（2025最新流程）&lt;a href=&quot;#手把手注册2025最新流程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;第1步：打开官网&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;电脑浏览器访问 &lt;code&gt;mp.weixin.qq.com&lt;/code&gt;，点右上角的”立即注册”。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第2步：选账号类型&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这里会蹦出来好几个选项，你要选的是”公众号”，然后选”订阅号”。别点错了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第3步：填邮箱&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;填的邮箱必须是从来没绑定过任何微信产品的。包括微信、小程序、企业微信这些，用过就不行。&lt;/p&gt;&lt;p&gt;如果常用的邮箱提示已被占用，要么去解绑（挺麻烦的），要么直接注册个新邮箱。我当时就是重新申请了个QQ邮箱。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第4步：身份验证&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;填身份证信息，然后用微信扫码做人脸识别。这步很快，基本一分钟就过了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第5步：设置账号信息&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这里要填公众号名称、简介、头像。名称的事要记住：想好了再填，别瞎写。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第6步：绑定管理员微信&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;扫码绑定你的微信，以后登后台就能扫码登录，不用每次都敲密码。&lt;/p&gt;&lt;p&gt;搞定。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;2025年新功能：手机也能直接注册&lt;a href=&quot;#2025年新功能手机也能直接注册&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;2025年有个挺方便的新功能——可以直接在微信里注册公众号，不用开电脑。&lt;/p&gt;&lt;p&gt;路径：发现 → 公众号 → 右上角头像 → 我的公众号&lt;/p&gt;&lt;p&gt;如果只是想先试试水，这个法子1分钟就能搞定。不过功能相对简单，后面要正式运营的话还是建议用电脑端。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;别急着关页面。注册完先把这几件事办了：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;把重要信息存好&lt;/strong&gt;：公众号ID（mp开头那串）、登录邮箱、密码，用备忘录或者密码管理器存起来&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;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;5大避坑指南&lt;a href=&quot;#5大避坑指南&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;新手最容易踩的5个坑。我自己踩过3个，另外2个是我朋友踩的。&lt;/p&gt;&lt;section&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;p&gt;个人只能选订阅号，点的时候看清楚。&lt;/p&gt;&lt;/section&gt;&lt;section&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;这坑我自己踩过。当时用的Gmail主邮箱，结果提示”该邮箱已绑定其他微信产品”。想了半天才想起来，好像之前用它注册过小程序。&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;QQ邮箱有个”英文邮箱”功能，能快速生成个新邮箱地址&lt;/li&gt;
&lt;li&gt;或者去原来绑定的产品那边解绑（但挺麻烦）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;p&gt;这是最容易踩的坑，代价也最大。&lt;/p&gt;&lt;p&gt;公众号名字一年只能改2次。&lt;/p&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;最好带上你的领域关键词，比如”读书&quot;&quot;职场&quot;&quot;成长”&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;ul&gt;
&lt;li&gt;还行的名字：小王的读书笔记、职场成长记、新手妈妈日记&lt;/li&gt;
&lt;li&gt;不太行的名字：佛系青年2333、某某某的小世界（太随意了）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;p&gt;&lt;strong&gt;预防办法：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;用密码管理器（我用1Password，挺好使）&lt;/li&gt;
&lt;li&gt;确保绑好管理员微信，扫码就能登&lt;/li&gt;
&lt;li&gt;公众号ID记下来，实在找不回可以用来申诉&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;坑5：头像频繁修改&lt;a href=&quot;#坑5头像频繁修改&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;公众号头像一个月最多改5次，而且每次改完要审核，快则1天，慢则一周。&lt;/p&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;尺寸300x300像素&lt;/li&gt;
&lt;li&gt;简洁清晰，手机上能看清&lt;/li&gt;
&lt;li&gt;三种思路：简单的文字logo、个人真人照、跟定位相关的主题图&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;头像这东西，差不多就行，别追求完美。等粉丝多了、定位清晰了再好好设计也不迟。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;section&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;/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;li&gt;&lt;strong&gt;流量主&lt;/strong&gt;：开通广告收益（得达到条件）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;p&gt;&lt;strong&gt;1. 配置自动回复&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;有人关注你的时候，自动发一条欢迎语。这个一定要设。&lt;/p&gt;&lt;p&gt;内容简单点就行：介绍下你是谁、这个号主要写什么、多久更新一次。让新粉丝对你有个基本了解。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. 设置自定义菜单&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;就是公众号底部那个菜单栏。建议弄3个菜单：&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;3. 把账号资料完善好&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;简介用50字左右说清楚你做什么、能给读者带来什么价值。这个会显示在搜索结果里，写好了能提高关注率。&lt;/p&gt;&lt;p&gt;其他功能像原创声明、赞赏这些，等你发够几篇文章自然就能开通了，不用着急。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;section&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;/p&gt;&lt;ul&gt;
&lt;li&gt;我是谁（简单说说背景）&lt;/li&gt;
&lt;li&gt;为什么做这个号（动机和初衷）&lt;/li&gt;
&lt;li&gt;这个号会写什么（内容方向）&lt;/li&gt;
&lt;li&gt;更新计划（如果有的话）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;800-1500字就够了，不用给自己太大压力。这篇文章主要是让偶然点进来的人知道你是干什么的，同时也给自己一个正式的开始。&lt;/p&gt;&lt;/section&gt;&lt;section&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;标题吸引人吗？（10-20字最好）&lt;/li&gt;
&lt;li&gt;封面图清晰吗？（建议900x383像素）&lt;/li&gt;
&lt;li&gt;有没有明显的错别字？&lt;/li&gt;
&lt;li&gt;要不要开评论功能？&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;发布时间的话，一般早上8点、中午12点、晚上8点效果相对好，但也因号而异，后面可以慢慢测试。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;section&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;2025年公众号的流量，99%靠平台推荐，朋友圈转发能带来的流量微乎其微。&lt;/p&gt;&lt;p&gt;别把希望全寄托在”转发朋友圈让朋友帮忙点”上面。这种互阅不光效果差，还可能影响账号的标签定位。&lt;/p&gt;&lt;p&gt;真正的涨粉逻辑是：写好内容 → 平台推给精准用户 → 用户觉得有价值 → 关注&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;新手涨粉的5个实用招&lt;a href=&quot;#新手涨粉的5个实用招&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;1. 死磕一个领域&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;平台推荐机制现在挺智能的，会根据你发的内容给你打标签。如果你今天写职场、明天写美食、后天写育儿，平台就不知道该推给谁了。&lt;/p&gt;&lt;p&gt;选一个你能持续产出的细分领域，坚持写下去。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. 视频号联动&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;2025年视频号和公众号的联动越来越紧密了。可以把文章核心观点做成短视频发视频号，在视频里或简介里引导关注公众号。&lt;/p&gt;&lt;p&gt;视频号现在还有流量红利，值得试试。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. 多平台分发&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;同样的内容，可以同步发到知乎、头条、小红书等平台，在文末引导关注公众号。不同平台用户群不一样，多一个渠道就多一份曝光。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. 认真回复每一条评论&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;初期评论可能不多，但每一条都值得好好回复。互动数据会影响文章的推荐权重，更重要的是，这是跟读者建立连接的机会。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5. 投稿大号（进阶玩法）&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你写得不错，可以试试给同领域的大号投稿。一次成功的投稿，可能带来几百甚至上千个精准粉丝。&lt;/p&gt;&lt;/section&gt;&lt;section&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;从0到100粉丝是最难的阶段，可能需要2-4周甚至更久。这段时间会有点煎熬，发了文章没人看，确实挺打击人的。&lt;/p&gt;&lt;p&gt;别因为数据不好就频繁改方向。在一个领域坚持写3个月再说，很多账号就是在这个阶段放弃了，其实再坚持一下就能看到希望。&lt;/p&gt;&lt;p&gt;每个做公众号的人都经历过这个阶段。&lt;/p&gt;&lt;p&gt;快速回顾一下：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;想清楚&lt;/strong&gt;：个人选订阅号，准备好邮箱和身份证&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注册&lt;/strong&gt;：跟着流程走，20分钟搞定&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;/ol&gt;&lt;p&gt;公众号这事儿，说难不难，说简单也不简单。但最重要的一步永远是：开始。&lt;/p&gt;&lt;p&gt;不需要完美，先做出来再说。&lt;/p&gt;&lt;p&gt;下一篇我打算写公众号内容创作的技巧——选题怎么选、文章怎么写、排版有什么讲究。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>电影《早熟》的现实主义爱情启示录</title><link>https://blog.moewah.com/posts/film-early-maturity-youth-love-and-generational-communication/</link><guid isPermaLink="true">https://blog.moewah.com/posts/film-early-maturity-youth-love-and-generational-communication/</guid><description>青少年早恋与未婚先孕如何被真实呈现？本文深度解读尔冬升导演的《早熟》，剖析两代人沟通困境与成长主题，揭示现实主义文艺片如何用细腻叙事传递社会警示。</description><pubDate>Fri, 20 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h3&gt;&lt;strong&gt;电影《早熟》深度解读&lt;/strong&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;strong&gt;导演全名/国籍/代表作：&lt;/strong&gt; 尔冬升（Derek Yee Tung-sing），香港籍导演、编剧、监制。他的代表作包括《新不了情》（1993）、《旺角黑夜》（2004）、《门徒》（2007）等，以其对现实题材的深刻洞察和细腻的人物刻画而闻名。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;影片信息：&lt;/strong&gt; 《早熟》（英文片名：2 Young），2005年上映，由房祖名、薛凯琪主演，曾志伟、毛舜筠、黄秋生、余安安等实力派演员倾力加盟。毛舜筠凭借此片荣获第25届香港电影金像奖最佳女配角。&lt;/li&gt;
&lt;li&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;strong&gt;人物性格冲突&lt;/strong&gt;。尽管涉及青少年未婚先孕，导演强调其并非“三级片”，而是以“轻松、浪漫的手法”讲述“青年男女的纯洁爱情故事”，同时带有警示和教育意义。影片整体风格扎实，不依赖噱头，着重于两代人之间沟通问题的探讨。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;二、导演创作动机与表达意图&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;尔冬升导演自编自导《早熟》，其核心创作动机在于深入探讨&lt;strong&gt;青少年早恋及未婚先孕这一社会问题&lt;/strong&gt;。他并非简单地“板起面孔教训人”，而是力图以一种更贴近年轻人感受、更具人性关怀的方式呈现故事，让影片洋溢着青春的气息。&lt;/p&gt;&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;以下选取10条以上核心台词，并结合具体场景片段，分析其所体现的主题与导演意图：&lt;/p&gt;&lt;ol&gt;
&lt;li&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;/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;
&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;/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;
&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;/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;
&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;/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;
&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;/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;
&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;/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;
&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;/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;
&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;/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;
&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;/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;
&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;/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;/ol&gt;&lt;p&gt;&lt;strong&gt;四、不同风格类型对影片表达的影响&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;《早熟》的&lt;strong&gt;现实主义&lt;/strong&gt;基调使其避免了将青少年早恋问题浪漫化或妖魔化，而是以贴近生活的细节呈现了其复杂性与后果。导演没有采用过于夸张的戏剧冲突，而是通过人物之间的对话、行为和情绪变化来推动情节，使观众更能代入角色，感受到他们的困境与挣扎。&lt;/p&gt;&lt;p&gt;影片虽有&lt;strong&gt;爱情片&lt;/strong&gt;的浪漫元素（如男女主角的纯真爱情），但其&lt;strong&gt;剧情片&lt;/strong&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;ol&gt;
&lt;li&gt;&lt;strong&gt;直面敏感社会议题：&lt;/strong&gt; 在2005年，香港电影市场中，敢于如此直接和深入地探讨青少年未婚先孕这一敏感社会问题的影片并不多见。它打破了传统观念对这一话题的避讳，引发了社会对青少年教育、家庭沟通和性教育的广泛关注。&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;
与韩国同期上映的同题材影片《珍妮,朱诺》（Jenny, Juno）相比，《早熟》在处理青少年未婚先孕问题上，同样引发了社会强烈反响。然而，《早熟》在香港电影语境下，更侧重于&lt;strong&gt;家庭内部的阶层差异、代际沟通以及法律与人情之间的冲突&lt;/strong&gt;，这使得它在探讨社会议题的同时，也带有浓厚的香港本土特色。影片虽然在某些评论中被指结局“理想化”或“过于甜蜜”，但其所传达的“理解与和解”的主题，使其成为一部具有积极社会意义的青春成长片，为香港电影中对社会现实问题的探讨留下了重要一笔。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Mac mini M4 性能压榨：Flux.dev 与 Z-image 实测组合</title><link>https://blog.moewah.com/posts/mac-mini-m4-flux-dev-z-image-performance-optimization/</link><guid isPermaLink="true">https://blog.moewah.com/posts/mac-mini-m4-flux-dev-z-image-performance-optimization/</guid><description>如何在24G内存的Mac mini M4上高效运行Flux.dev和Z-image？本文实测不同采样器与调度器组合，提供性能压榨技巧和最佳参数配置方案，助你实现AI绘画的极速出图与画质平衡。</description><pubDate>Tue, 10 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近一直在折腾手头这台 &lt;strong&gt;Mac mini M4 (24G 内存)&lt;/strong&gt;，核心目标就是想看看在有限的统一内存下，如何压榨 &lt;strong&gt;Flux.dev&lt;/strong&gt; 和 &lt;strong&gt;Z-image&lt;/strong&gt; 这类大模型的性能。M4 的神经元引擎虽然强悍，但 24G 容量在处理这类参数量惊人的模型时，采样器（Sampler）和调度器（Scheduler）的组合选得对不对，直接决定了是“秒出图”还是“转圈圈”。&lt;/p&gt;
&lt;p&gt;以下是基于实测，针对不同需求整理的经验组合。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;一、 Flux.dev 模型实测组合&lt;a href=&quot;#一-fluxdev-模型实测组合&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Flux 采用 Flow Matching 架构，对调度器极度敏感。在 24G 内存环境下，建议首选 &lt;strong&gt;GGUF (Q4/Q5)&lt;/strong&gt; 或 &lt;strong&gt;FP8&lt;/strong&gt; 版本，把更多内存留给采样过程。&lt;/p&gt;







































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;维度&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;采样器 (Sampler)&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;调度器 (Scheduler)&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;推荐参数&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;经验总结&lt;/strong&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;strong&gt;Euler&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Beta&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;20-25步 / Guidance 3.5&lt;/td&gt;&lt;td&gt;&lt;strong&gt;日常频率最高。&lt;/strong&gt; Beta 调度器处理 Flux 的光影步进最稳，画质均衡且速度快。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;画面真实度&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;DPM++ 2M&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;SGM Uniform&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;35-45步 / Guidance 2.5&lt;/td&gt;&lt;td&gt;追求写实皮肤质感时的首选，暗部细节和边缘锐度有明显提升。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;极致速度&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Euler&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Simple&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;15-18步 / Guidance 3.0&lt;/td&gt;&lt;td&gt;纯粹为了快速预览构图，M4 响应最快，大框架不崩。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;出图多样性&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Euler Ancestral&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Beta&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;25-30步 / Guidance 3.5&lt;/td&gt;&lt;td&gt;祖先采样带有的随机噪声，能让构图在保持提示词意图的同时更有跳跃感。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;blockquote&gt;&lt;p&gt;🌟 &lt;strong&gt;Flux 万金油组合：Euler + Beta&lt;/strong&gt;。在 25 步左右能兼顾 80% 的画质细节和不错的生成速度。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;二、 Z-image 模型实测组合（多样性与质感双选版）&lt;a href=&quot;#二-z-image-模型实测组合多样性与质感双选版&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Z-image 作为蒸馏架构模型，主打低步数极速出图。但在 2-步（Turbo/Lightning）模式下，采样器的选择直接决定了画面的“灵性”。&lt;/p&gt;







































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;维度&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;采样器 (Sampler)&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;调度器 (Scheduler)&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;推荐参数&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;经验总结&lt;/strong&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;strong&gt;euler_ancestral&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Beta&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;2-8步 / CFG 1.0&lt;/td&gt;&lt;td&gt;&lt;strong&gt;实测多样性最好。&lt;/strong&gt; 姿势、构图变化极大，拒绝“复读机”式出图。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;高画质多样性&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;er_sde&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Beta&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;2-10步 / CFG 1.0&lt;/td&gt;&lt;td&gt;&lt;strong&gt;多样性次之。&lt;/strong&gt; 但光影层次更细腻，是追求画质与变化平衡的最优解。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;极致稳定性&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;dpmpp_2m_sde&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Beta&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;2-12步 / CFG 1.0&lt;/td&gt;&lt;td&gt;收敛极快。画面极其稳健但姿态趋同，适合确定构图后的“精修”。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;极致速度&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;res_multistep&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Beta&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;2-4步 / CFG 1.0&lt;/td&gt;&lt;td&gt;真正的“秒出”。但极低步数下结构易崩溃（伪影），仅限草图预览。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;blockquote&gt;&lt;p&gt;🌟 &lt;strong&gt;Z-image 万金油“双核”推荐：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;追求灵感与变化：&lt;/strong&gt; 锁死 &lt;strong&gt;euler_ancestral + Beta&lt;/strong&gt;，每一次抽卡都有惊喜。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;追求质感与稳健：&lt;/strong&gt; 锁死 &lt;strong&gt;er_sde + Beta&lt;/strong&gt;，在保证一定多样性的同时，提供更细腻的皮肤和光影表现。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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-步模式下的实测，这两个组合在 M4 统一内存架构下表现最出色：&lt;/p&gt;&lt;section&gt;&lt;h3&gt;1. euler_ancestral + Beta (多样性之王)&lt;a href=&quot;#1-euler_ancestral--beta-多样性之王&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;评价&lt;/strong&gt;：在极低步数（2 步）下，这是唯一能让模型“动起来”的组合。祖先采样器通过每一步注入的新噪声，强迫模型跳出收敛陷阱，尝试不同的肢体动态。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;视觉特征&lt;/strong&gt;：人物姿态多变（正面、侧面、低头），画面的动态感和随机感最强。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. er_sde + Beta (细腻的写实派)&lt;a href=&quot;#2-er_sde--beta-细腻的写实派&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;评价&lt;/strong&gt;：ER SDE 兼具了随机性与高阶精度。虽然它的姿态变化略逊于 Euler A，但在处理织物纹理、皮肤质感和光影平滑度上更胜一筹。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;视觉特征&lt;/strong&gt;：画面更显厚重，减少了低步数常见的“燥点感”，人物与背景的融合度极高。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;🛠️ Mac mini M4 环境下的避坑点&lt;a href=&quot;#️-mac-mini-m4-环境下的避坑点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;内存保卫战&lt;/strong&gt;：24G 是统一内存，显存和系统内存共享。跑图前习惯关掉占用大的浏览器插件和 App。Flux 建议用 &lt;strong&gt;GGUF (Q4/Q5)&lt;/strong&gt; 格式，能显著降低“转圈圈”的概率。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;引导值（CFG）陷阱&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;跑 &lt;strong&gt;Flux&lt;/strong&gt; 时，Guidance Scale 盯着 &lt;strong&gt;3.5&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;跑 &lt;strong&gt;Z-image&lt;/strong&gt; 时，CFG Scale &lt;strong&gt;千万别给高&lt;/strong&gt;！&lt;strong&gt;1.0&lt;/strong&gt; 是实测甜点位，超过 2.0 画面极易出现“焦黑”感或偏色。&lt;/p&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;在 M4 上，Flux 超过 40 步、Z-image 超过 12 步后，画面提升已经很难用肉眼分辨，但计算成本会激增，没必要死磕高步数。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;总结：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;对于 24G 内存的 M4 玩家，最聪明的策略是：&lt;strong&gt;Flux 认准 Euler + Beta 走稳健路线，Z-image 认准 euler_ancestral + Beta 寻找灵感。&lt;/strong&gt; 这两套方案能让你在 24G 的有限空间里，玩出顶级工作站的“抽卡”效率。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Astro博客从0到1完整搭建指南</title><link>https://blog.moewah.com/posts/astro-blog-0-to-1-complete-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/astro-blog-0-to-1-complete-guide/</guid><description>如何让技术博客真正成为长期数字资产？本文详解Astro框架的性能优势、Islands架构设计，以及从搭建到运营的完整闭环策略，助你摆脱维护困境，实现内容持续增长。</description><pubDate>Thu, 05 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;第一次搭博客用的是Next.js，花了一周时间折腾服务端渲染和图片优化，部署到Vercel后觉得自己简直是工程师之光。结果维护了不到一个月就彻底放弃了——每次想加点功能都要改半天配置，写篇文章还得考虑路由怎么生成，SEO该怎么配置…&lt;/p&gt;
&lt;p&gt;后来我才明白，大多数技术博客失败的原因不是技术选型有问题，而是缺少一套从搭建到运营的完整系统。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;为什么选择Astro&lt;a href=&quot;#为什么选择astro&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;同样的博客内容，Next.js版本首次加载2.8秒，Astro版本只要0.9秒。这几个数据可以说明问题：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;页面加载速度快40%&lt;/strong&gt;：相比传统的React框架&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JavaScript体积减少90%&lt;/strong&gt;：Astro默认不发送JavaScript到客户端&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lighthouse评分100分&lt;/strong&gt;：我的博客用Astro重构后，Performance、Accessibility、Best Practices、SEO四项全部100分&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开发者增长迅猛&lt;/strong&gt;：根据GitHub Octoverse 2025报告，Astro是增长第三快的语言&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;对搜索引擎来说，0.9秒和2.8秒可能就是排名第一和第二的差距。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Islands架构&lt;a href=&quot;#islands架构&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Astro的核心理念叫”Islands架构”：页面大部分是纯静态HTML，只有需要交互的地方（比如评论框、搜索栏、暗色模式切换）才加载JavaScript。&lt;/p&gt;&lt;p&gt;传统的React或Vue博客呢？整个页面都是JavaScript渲染，哪怕你只是看一篇静态文章。这就像为了开关灯，把整栋房子的电路都点亮一遍——完全没必要。&lt;/p&gt;&lt;p&gt;我的博客现在90%的页面是纯静态HTML，只有评论系统和搜索功能用了点JavaScript。用户打开文章，瞬间就能看到内容。&lt;/p&gt;&lt;/section&gt;&lt;section&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;Next.js&lt;/strong&gt;：功能强大，适合复杂应用，但对纯内容网站来说太重了，SSR配置复杂，构建速度慢&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Gatsby&lt;/strong&gt;：生态成熟，插件丰富，但构建速度随内容增长急剧下降，我50篇文章构建要5分钟&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Astro&lt;/strong&gt;：专为内容网站设计，性能最优，Markdown原生支持，构建超快&lt;/p&gt;&lt;p&gt;如果你的主要目标是写作和内容分享，Astro就是那个”量身定制”的选择。&lt;/p&gt;&lt;/section&gt;&lt;section&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;Cloudflare&lt;/strong&gt;：开发者文档站&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft&lt;/strong&gt;：某些产品的营销页面&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Digital Ocean&lt;/strong&gt;：社区教程站&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Adobe&lt;/strong&gt;：部分营销活动页面&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这些公司选Astro，看中的就是性能和SEO优势。对商业网站来说，0.5秒的加载速度差异，可能意味着几百万美元的转化率差别。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;搭建阶段&lt;a href=&quot;#搭建阶段&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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的CLI工具很友好。打开终端，三行命令就能初始化一个博客：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;astro@latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 选择 &quot;Blog&quot; 模板&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-blog&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;不过我建议你&lt;strong&gt;直接用成熟的starter模板&lt;/strong&gt;，能省很多事：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Astro Blog Starter&lt;/strong&gt;：官方模板，简洁实用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Astro Paper&lt;/strong&gt;：我最推荐的，性能强劲，SEO优化到位&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Astro Zen Blog&lt;/strong&gt;：极简风格，支持暗色模式&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我自己用的是Astro Paper改的。它自带RSS、sitemap、搜索、标签系统这些必备功能，省了我至少一周的开发时间。&lt;/p&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;my-blog/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── src/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── content/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   ├── blog/          # 博客文章（Markdown/MDX）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   │   ├── 2024-01-15-first-post.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   │   └── 2024-02-20-second-post.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   └── config.ts      # Content Collections配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── layouts/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   ├── BaseLayout.astro      # 基础布局&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   └── PostLayout.astro      # 文章页布局&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── components/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   ├── Header.astro&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   ├── Footer.astro&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   ├── Card.astro            # 文章卡片&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   └── SearchBar.astro       # 搜索组件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── pages/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   ├── index.astro           # 首页&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   ├── blog/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   │   └── [slug].astro      # 动态文章路由&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   ├── tags/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   │   └── [tag].astro       # 标签页&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   └── about.astro           # 关于页&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── styles/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   └── global.css&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   └── config.ts                 # 站点配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── public/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── images/                   # 图片资源&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── fonts/                    # 字体&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   └── favicon.svg&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└── astro.config.mjs              # Astro配置&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;几个关键设计原则&lt;/strong&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Content Collections优先&lt;/strong&gt;：所有博客文章放在 &lt;code&gt;src/content/blog/&lt;/code&gt;，用Zod做类型校验，写错frontmatter能立即发现&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;组件化布局&lt;/strong&gt;：Header、Footer、Card这些复用组件单独抽出来，改一处全站生效&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;静态资源集中管理&lt;/strong&gt;：图片统一放 &lt;code&gt;public/images/&lt;/code&gt;，便于CDN优化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置文件分离&lt;/strong&gt;：站点信息放 &lt;code&gt;src/config.ts&lt;/code&gt;，改配置不用满代码找&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;这个结构的好处是：可扩展性强，维护成本低。我现在要加个新页面或新功能，基本不用改原有代码。&lt;/p&gt;&lt;/section&gt;&lt;section&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;样式方案：Tailwind CSS&lt;/strong&gt;：原子化CSS，开发快，打包后体积小。备选：如果你喜欢传统CSS也完全OK，Astro支持Scoped CSS&lt;/p&gt;&lt;p&gt;&lt;strong&gt;图片优化：Astro Image组件&lt;/strong&gt;：自动响应式裁剪、格式转换（WebP/AVIF）、懒加载&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Markdown增强：MDX&lt;/strong&gt;：能在Markdown里嵌入React/Vue组件，写交互式文章很方便&lt;/p&gt;&lt;p&gt;&lt;strong&gt;类型安全：Content Collections + Zod&lt;/strong&gt;：frontmatter字段有类型提示和校验，写错立即报错&lt;/p&gt;&lt;p&gt;Astro的理念是”默认配置就够用，进阶功能按需加”。我最开始就用官方模板，连Tailwind都没装，纯HTML+CSS写了10篇文章。等需要优化性能了，再一个个加增强功能。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;开发阶段&lt;a href=&quot;#开发阶段&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Content Collections&lt;a href=&quot;#content-collections&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;先在 &lt;code&gt;src/content/config.ts&lt;/code&gt; 里定义schema：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&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;z&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro:content&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;blogCollection&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;content&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&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;z&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;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&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;z&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;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pubDate&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&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;&lt;span&gt;date&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;updatedDate&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&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;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;optional&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;heroImage&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&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;&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;optional&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&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;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;array&lt;/span&gt;&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;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;boolean&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;default&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&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;collections&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;blog&lt;/span&gt;&lt;span&gt;&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;blogCollection&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;然后写文章的时候，frontmatter就有类型提示了。如果你把 &lt;code&gt;pubDate&lt;/code&gt; 写成字符串而不是日期，构建时就会报错。这种即时反馈真的能省很多调试时间。&lt;/p&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;getCollection&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro:content&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;allPosts&lt;/span&gt;&lt;span&gt; &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; &lt;/span&gt;&lt;span&gt;getCollection&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;blog&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;filter&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;&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;post&lt;/span&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;draft&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;sort&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&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;&lt;span&gt;b&lt;/span&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;pubDate&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;valueOf&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&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;pubDate&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;valueOf&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PAGE_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;10&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;currentPage&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;posts&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;allPosts&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;slice&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;PAGE_SIZE&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;{&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;post&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Card&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&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;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;title&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&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;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;description&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;pubDate&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&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;pubDate&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;slug&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&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;slug&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getStaticPaths&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;posts&lt;/span&gt;&lt;span&gt; &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; &lt;/span&gt;&lt;span&gt;getCollection&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;blog&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;posts&lt;/span&gt;&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;post&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&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;&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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;post&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;&lt;span&gt;},&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&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;&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;},&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&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;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;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Astro&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&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;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;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&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;&lt;span&gt;render&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&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;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;title&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;time&lt;/span&gt;&lt;span&gt;&amp;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;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pubDate&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;time&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Content&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&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;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;关键点是 &lt;code&gt;getStaticPaths()&lt;/code&gt; 在构建时生成所有文章路由，这样每篇文章都是静态HTML，加载超快。&lt;/p&gt;&lt;/section&gt;&lt;section&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;：我用的是Pagefind，客户端全文搜索，不需要后端&lt;/p&gt;&lt;p&gt;&lt;strong&gt;RSS订阅&lt;/strong&gt;：&lt;code&gt;@astrojs/rss&lt;/code&gt; 插件，两行代码搞定&lt;/p&gt;&lt;p&gt;&lt;strong&gt;暗色模式&lt;/strong&gt;：用CSS变量+localStorage，体验很丝滑&lt;/p&gt;&lt;p&gt;&lt;strong&gt;代码高亮&lt;/strong&gt;：Astro内置Shiki，支持100+语言高亮&lt;/p&gt;&lt;p&gt;&lt;strong&gt;评论系统&lt;/strong&gt;：Giscus（基于GitHub Discussions）或Utterances，免费且无广告&lt;/p&gt;&lt;/section&gt;&lt;section&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默认性能就很好，但还有几个优化技巧：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;图片懒加载&lt;/strong&gt;：用Astro Image组件，自动实现&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;字体优化&lt;/strong&gt;：&lt;code&gt;font-display: swap&lt;/code&gt;，避免字体加载阻塞渲染&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;预加载关键资源&lt;/strong&gt;：在 &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 里加 &lt;code&gt;&amp;lt;link rel=&quot;preload&quot;&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;减少重绘&lt;/strong&gt;：CSS里避免触发layout的属性（width/height改用transform）&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;我没做这些优化前，Lighthouse就93分了，优化后到100分。重点还是内容质量和更新频率。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;部署阶段&lt;a href=&quot;#部署阶段&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;Vercel（我最推荐）&lt;/strong&gt;：零配置，推送代码自动构建部署，全球CDN，免费额度够用。缺点是国内访问有时会慢&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Netlify&lt;/strong&gt;：类似Vercel，免费额度更高（每月300GB流量 vs Vercel的100GB），但构建速度稍慢&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Cloudflare Pages&lt;/strong&gt;：性能强劲，国内访问速度好，免费无流量限制，但构建配置稍复杂&lt;/p&gt;&lt;p&gt;&lt;strong&gt;GitHub Pages&lt;/strong&gt;：完全免费，稳定，但需要自己配GitHub Actions，没有预览环境&lt;/p&gt;&lt;p&gt;我自己用的是Vercel，部署过程真的傻瓜式：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;在Vercel官网点”Import Project”&lt;/li&gt;
&lt;li&gt;选择GitHub仓库&lt;/li&gt;
&lt;li&gt;框架选Astro，其他默认配置&lt;/li&gt;
&lt;li&gt;点Deploy&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;大概1分钟，博客就上线了。每次推送代码到GitHub，Vercel自动构建部署，连命令都不用敲。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Git-Based持续部署&lt;a href=&quot;#git-based持续部署&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;正确的Git工作流&lt;/strong&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;本地开发：&lt;code&gt;git checkout -b feature/new-post&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;写完文章：&lt;code&gt;git add . &amp;amp;&amp;amp; git commit -m &quot;add new post&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;推送代码：&lt;code&gt;git push origin feature/new-post&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;GitHub上创建PR，Vercel自动生成预览链接&lt;/li&gt;
&lt;li&gt;检查预览没问题，合并到main分支&lt;/li&gt;
&lt;li&gt;Vercel自动部署到生产环境&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;这个流程的好处是：每篇文章发布前都能预览效果，避免生产环境出错。&lt;/p&gt;&lt;p&gt;环境变量管理也很重要。如果你用了Google Analytics或评论系统，需要在Vercel控制台配置环境变量，别直接写代码里提交到GitHub。&lt;/p&gt;&lt;/section&gt;&lt;section&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;在域名注册商添加DNS记录：
&lt;ul&gt;
&lt;li&gt;类型：CNAME&lt;/li&gt;
&lt;li&gt;名称：www（或@）&lt;/li&gt;
&lt;li&gt;值：your-blog.vercel.app&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在Vercel控制台添加自定义域名&lt;/li&gt;
&lt;li&gt;等待DNS生效（通常5-10分钟）&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Vercel会自动配置Let’s Encrypt的SSL证书，全程不用你操心HTTPS的事。&lt;/p&gt;&lt;p&gt;小技巧：如果想让国内访问更快，可以在域名DNS里配置Cloudflare CDN，套一层加速。我用了Cloudflare后，国内访问速度从2秒降到0.8秒。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;SEO优化&lt;a href=&quot;#seo优化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我博客流量80%来自搜索引擎，SEO优化直接决定了博客能不能被发现。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;技术SEO基础&lt;a href=&quot;#技术seo基础&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Meta标签优化&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;head&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;{post.data.title} | 你的博客名&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;meta&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;&quot;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&quot;&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;{post.data.description}&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;meta&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;&quot;&lt;/span&gt;&lt;span&gt;keywords&lt;/span&gt;&lt;span&gt;&quot;&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;{post.data.tags.join(&lt;/span&gt;&lt;span&gt;&apos;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;)}&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&amp;lt;!-- Open Graph 社交分享优化 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;property&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;og:title&lt;/span&gt;&lt;span&gt;&quot;&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;{post.data.title}&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;property&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;og:description&lt;/span&gt;&lt;span&gt;&quot;&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;{post.data.description}&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;property&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;og:image&lt;/span&gt;&lt;span&gt;&quot;&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;{post.data.heroImage}&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;property&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;og:url&lt;/span&gt;&lt;span&gt;&quot;&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;{Astro.url}&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;head&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Sitemap和Robots.txt&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;用 &lt;code&gt;@astrojs/sitemap&lt;/code&gt; 插件自动生成sitemap：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@astrojs/sitemap&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;在 &lt;code&gt;astro.config.mjs&lt;/code&gt; 里加：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sitemap&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;@astrojs/sitemap&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;https://yourblog.com&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;integrations&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;sitemap&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后在 &lt;code&gt;public/robots.txt&lt;/code&gt; 写：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;User-agent: *&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Allow: /&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Sitemap: https://yourblog.com/sitemap-index.xml&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;结构化数据&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;script&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;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;application/ld+json&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;set:html&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{JSON.stringify({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;@context&quot;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;https://schema.org&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;@type&quot;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;BlogPosting&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;headline&quot;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;post.data.title,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;datePublished&quot;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;post.data.pubDate,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;dateModified&quot;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;post.data.updatedDate&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.data.pubDate,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;author&quot;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;@type&quot;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Person&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;name&quot;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;你的名字&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;})}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;内容SEO策略&lt;a href=&quot;#内容seo策略&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;用Ahrefs或Google Keyword Planner找长尾关键词&lt;/li&gt;
&lt;li&gt;在标题、首段、副标题、结论里自然出现主关键词&lt;/li&gt;
&lt;li&gt;关键词密度控制在2-3%，别堆砌&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;内链策略&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;每篇文章加2-3个相关文章推荐&lt;/li&gt;
&lt;li&gt;用关键词做锚文本，别用”点击这里”&lt;/li&gt;
&lt;li&gt;我的做法是在文章结尾加”相关阅读”板块&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;URL结构优化&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;用描述性URL：&lt;code&gt;/blog/astro-best-practices&lt;/code&gt; 而不是 &lt;code&gt;/blog/post-123&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;包含关键词&lt;/li&gt;
&lt;li&gt;用连字符分隔单词&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Core Web Vitals优化&lt;a href=&quot;#core-web-vitals优化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Google很看重页面性能指标，这3个指标必须达标：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LCP（最大内容绘制）&lt;/strong&gt;：&amp;lt; 2.5秒（Astro默认就很快）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLS（累积布局偏移）&lt;/strong&gt;：&amp;lt; 0.1（记得给图片设width和height）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FID（首次输入延迟）&lt;/strong&gt;：&amp;lt; 100ms（Astro几乎没有JavaScript，这个天然达标）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;用Lighthouse跑一次，看看哪些指标不达标，针对性优化。我的博客四项全100分，主要是Astro本身性能好。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Google Search Console设置&lt;a href=&quot;#google-search-console设置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;博客上线后，立即在Google Search Console提交sitemap：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;访问 search.google.com/search-console&lt;/li&gt;
&lt;li&gt;添加你的网站&lt;/li&gt;
&lt;li&gt;验证所有权（DNS验证或HTML文件验证）&lt;/li&gt;
&lt;li&gt;提交sitemap：&lt;code&gt;https://yourblog.com/sitemap-index.xml&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;然后耐心等待Google收录。一般1-2周会开始有自然流量进来。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;section&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;每周1-2篇的节奏&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;别一开始就定每天一更的目标，99%的人坚持不了。我最开始是两周一篇，坚持了3个月后才提到每周一篇。&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;搜索”Astro+疑问词”，看大家在问什么&lt;/li&gt;
&lt;li&gt;Reddit、Twitter上的技术讨论&lt;/li&gt;
&lt;li&gt;掘金、V2EX的热门话题&lt;/li&gt;
&lt;li&gt;自己的学习笔记整理&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我的经验是：一篇解决真实问题的文章，胜过十篇泛泛而谈的教程。&lt;/p&gt;&lt;/section&gt;&lt;section&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;每年对流量Top 20的文章全面更新&lt;/strong&gt;。更新什么？&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;过时的信息（比如Astro版本升级了）&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;code&gt;updatedDate&lt;/code&gt; 字段，告诉搜索引擎这是最新内容。&lt;/p&gt;&lt;p&gt;数据不会骗人：我去年更新了15篇旧文章，这些文章的平均流量涨了35%。很多人搜技术问题，更倾向于点开更新日期近的文章。&lt;/p&gt;&lt;/section&gt;&lt;section&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;Twitter：摘取文章核心观点，加hashtag&lt;/li&gt;
&lt;li&gt;LinkedIn：技术类内容在LinkedIn很受欢迎&lt;/li&gt;
&lt;li&gt;掘金/SegmentFault：中文技术社区的流量池&lt;/li&gt;
&lt;li&gt;V2EX：/go/programmer 节点讨论度高&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;技术社区参与&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;在Stack Overflow回答相关问题，自然带上文章链接&lt;/li&gt;
&lt;li&gt;Reddit的r/webdev、r/javascript等sub定期分享&lt;/li&gt;
&lt;li&gt;GitHub Discussions参与讨论&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;邮件订阅（Newsletter）&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;我用的是Buttondown，免费额度够用&lt;/li&gt;
&lt;li&gt;每周或每月发一次Newsletter，把新文章推送给订阅者&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;在Medium、Dev.to这些平台同步发文章（加canonical标签避免重复内容惩罚）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;前6个月主要靠推广，6个月后SEO流量会自然增长。&lt;/p&gt;&lt;/section&gt;&lt;section&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;装个Google Analytics，定期看这几个指标：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;UV/PV&lt;/strong&gt;：整体流量趋势&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跳出率&lt;/strong&gt;：如果&amp;gt;70%，说明内容不够吸引人或加载太慢&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;平均停留时间&lt;/strong&gt;：技术文章建议&amp;gt;3分钟&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;p&gt;&lt;strong&gt;A/B测试标题&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;同一篇文章，试2个不同标题&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;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;进阶技巧&lt;a href=&quot;#进阶技巧&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;用starter模板没问题，但长期来看，定制化的主题能让博客更有辨识度。&lt;/p&gt;&lt;p&gt;我的建议：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;基于Astro Paper或其他成熟主题改&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;/section&gt;&lt;section&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;评论系统（Giscus）&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;基于GitHub Discussions，免费无广告&lt;/li&gt;
&lt;li&gt;评论数据存在你的GitHub仓库，完全可控&lt;/li&gt;
&lt;li&gt;配置超简单，10分钟搞定&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;我用的是Vercel Analytics，轻量级&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;文章系列&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;把相关文章组织成系列（比如”Astro实战系列”）&lt;/li&gt;
&lt;li&gt;加上”上一篇/下一篇”导航&lt;/li&gt;
&lt;li&gt;提升读者留存率&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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的i18n路由很成熟：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/blog/astro-best-practices        # 中文&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/en/blog/astro-best-practices     # 英文&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;我的做法是：重点文章翻译成英文，其他保留中文。毕竟翻译也是成本，要权衡投入产出比。&lt;/p&gt;&lt;/section&gt;&lt;section&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;&lt;strong&gt;Lighthouse CI&lt;/strong&gt;：每次部署自动跑Lighthouse测试&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Core Web Vitals监控&lt;/strong&gt;：用Google Search Console监控&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;错误追踪&lt;/strong&gt;：Sentry免费版够用&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果某天Lighthouse分数掉了，立即排查原因。性能下降直接影响SEO排名。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;我的踩坑记录&lt;a href=&quot;#我的踩坑记录&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;第一次部署时忘记设置 &lt;code&gt;site&lt;/code&gt; 字段，sitemap 生成的全是相对路径，搜索引擎抓不到。改完重新部署就好了。&lt;/p&gt;&lt;p&gt;还有一次 Content Collections schema 写错了，&lt;code&gt;pubDate&lt;/code&gt; 应该是 &lt;code&gt;z.date()&lt;/code&gt;，我写成了 &lt;code&gt;z.string()&lt;/code&gt;，结果日期格式一直不对，搞了半天才发现问题在哪。&lt;/p&gt;&lt;p&gt;图片优化踩的坑更多。一开始直接用高分辨率图片，Lighthouse 性能分数只有 80 分。后来改用 WebP + 懒加载，才干到 100 分。&lt;/p&gt;&lt;p&gt;我见过太多人搭了完美的博客，用了最新的技术栈，然后写了3篇文章就荒废了。也见过一些人，用最简单的WordPress，坚持写了3年，现在月访问量10万+。&lt;/p&gt;&lt;p&gt;博客是马拉松，不是短跑。&lt;/p&gt;&lt;p&gt;写博客一年后，我的技术理解更深了，人际网络更广了，甚至还有公司因为看到我的博客主动找我谈offer。这些收获，是金钱买不到的。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Astro性能优化8大实战技巧：从60分到满分</title><link>https://blog.moewah.com/posts/astro-performance-optimization-8-practical-tips/</link><guid isPermaLink="true">https://blog.moewah.com/posts/astro-performance-optimization-8-practical-tips/</guid><description>如何将Astro网站的Lighthouse评分从60提升至95+？本文详解Islands架构、水合策略、图片优化等8个核心技巧，手把手教你解锁Astro性能潜力，实现秒开体验。</description><pubDate>Wed, 04 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;上个月花了两周时间用 Astro 做了个项目网站，本地预览时快得飞起，心想这次 Lighthouse 肯定能拿满分。结果部署到生产环境一测——70 分。&lt;/p&gt;
&lt;p&gt;后来花了好几天排查问题，发现很多人都遇到过类似情况。其实 Astro 框架网站理论上可以持续达到 100% 的 Lighthouse 性能评分——数据显示，Astro 网站有 60% 能在 Core Web Vitals 得分中拿到”良好”，而 WordPress 和 Gatsby 只有 38%。&lt;/p&gt;
&lt;p&gt;问题往往不在框架本身，而是我们没把它的性能优势发挥出来。比如可能在所有组件上都用了 &lt;code&gt;client:load&lt;/code&gt;（我就踩过这个坑），或者图片格式还停留在 JPEG 时代，又或者字体优化这个环节直接被忽略了。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;理解 Astro 的性能优势&lt;a href=&quot;#理解-astro-的性能优势&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;零 JavaScript 策略&lt;a href=&quot;#零-javascript-策略&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Astro 最大的特点就是默认零 JavaScript。构建时把所有内容渲染成静态 HTML，只在明确需要交互的地方才加载 JavaScript。&lt;/p&gt;&lt;p&gt;传统的 React SPA 呢？不管你用不用，整个框架的 JS 都会打包进去。我之前测过一个 React 项目，平均 500KB 的 JS 代码，其中 60% 根本没被用到。这些无用代码不仅增加下载时间，还要占用浏览器的解析和执行时间。&lt;/p&gt;&lt;p&gt;Astro 反其道而行之：先给你一个纯 HTML 页面，秒开。需要交互？再按需加载对应组件的 JS。Astro 比 React 框架快 40%，发送到浏览器的 JavaScript 减少 90%。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Islands 架构&lt;a href=&quot;#islands-架构&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;把你的页面看成一片海洋（静态 HTML），上面散落着几个小岛（交互组件）。每个岛都是独立的，互不影响。&lt;/p&gt;&lt;p&gt;比如你的博客文章页面：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;文章内容：静态 HTML（不需要 JS）&lt;/li&gt;
&lt;li&gt;导航栏：静态 HTML（不需要 JS）&lt;/li&gt;
&lt;li&gt;评论区：需要交互（加载 JS）&lt;/li&gt;
&lt;li&gt;分享按钮：需要交互（加载 JS）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Astro 只会给评论区和分享按钮加载 JS，其他部分保持纯 HTML。即使评论区组件出问题，也不会影响页面其他部分。&lt;/p&gt;&lt;/section&gt;&lt;section&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 的部分水合（Partial Hydration）让你精确控制每个组件什么时候水合：页面加载时、主线程空闲时、组件进入视口时。&lt;/p&gt;&lt;p&gt;这种细粒度控制，能让你的 TTI（Time to Interactive，可交互时间）降低 300%。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Islands 架构与水合策略优化&lt;a href=&quot;#islands-架构与水合策略优化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;选择正确的 client 指令&lt;a href=&quot;#选择正确的-client-指令&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Astro 提供了几个 client 指令来控制组件的水合时机。刚开始用的时候，我图省事，所有交互组件都用 &lt;code&gt;client:load&lt;/code&gt;。结果性能和 React SPA 没啥区别。&lt;/p&gt;&lt;p&gt;不同的交互场景要用不同的策略：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;client:load&lt;/code&gt; - 页面加载时立即水合&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;适用场景：首屏关键交互，用户进来就要用的功能。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Navigation&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;../components/Navigation.jsx&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Navigation&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client:load&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;网站导航栏、搜索框这种首屏就看得到、用户可能马上就点的组件，用 &lt;code&gt;client:load&lt;/code&gt; 没问题。但千万别所有组件都用这个。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;client:idle&lt;/code&gt; - 主线程空闲时水合&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;适用场景：次要交互功能，不急着用。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;NewsletterSignup&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;../components/NewsletterSignup.jsx&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;NewsletterSignup&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client:idle&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;我现在大部分组件都用这个。像订阅表单、社交分享按钮这种，用户通常看完内容才会操作，完全可以等浏览器空闲时再加载。这个指令用的是 &lt;code&gt;requestIdleCallback()&lt;/code&gt;，浏览器会自动选择合适的时机。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;client:visible&lt;/code&gt; - 进入视口时水合&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;适用场景：折叠下方的内容。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CommentSection&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;../components/CommentSection.jsx&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;CommentSection&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client:visible&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;评论区、页脚交互组件、图片轮播这些在页面下方的内容，用 &lt;code&gt;client:visible&lt;/code&gt; 最合适。用户滚动到那里才加载，既节省带宽又不影响首屏性能。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;client:media&lt;/code&gt; - 媒体查询匹配时水合&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;适用场景：响应式组件，只在特定屏幕尺寸下显示。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MobileSidebar&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;../components/MobileSidebar.jsx&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;MobileSidebar&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client:media&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;(max-width: 768px)&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;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;移动端侧边栏、响应式菜单这种，只在小屏幕下才需要的组件，用 &lt;code&gt;client:media&lt;/code&gt; 可以避免在桌面端加载无用代码。&lt;/p&gt;&lt;/section&gt;&lt;section&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;client:load&lt;/code&gt;。这样做的结果就是，Astro 退化成了一个普通的 SSR 框架，性能优势荡然无存。&lt;/p&gt;&lt;p&gt;正确的做法是：先假设所有组件都是静态的，只在真正需要交互的地方才加 client 指令。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;一个展示型的 Card 组件？不需要 client 指令&lt;/li&gt;
&lt;li&gt;Card 里有个点赞按钮需要交互？把按钮单独拆出来做成组件，只给按钮加 &lt;code&gt;client:visible&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;移除不必要的 JavaScript 依赖&lt;a href=&quot;#移除不必要的-javascript-依赖&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;检查你的依赖包。我之前项目里用 moment.js 处理日期，打包后发现这个库居然有 200KB+。后来换成原生 &lt;code&gt;Date&lt;/code&gt; 和 &lt;code&gt;Intl.DateTimeFormat&lt;/code&gt;，体积直接省了 200KB。&lt;/p&gt;&lt;p&gt;再比如 lodash，很多人习惯性 &lt;code&gt;import _ from &apos;lodash&apos;&lt;/code&gt; 全量导入，其实你可能只用到 2-3 个方法。用原生数组方法能解决的，就别引入了：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 不推荐&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;lodash&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;unique&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;uniq&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;array&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 推荐&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;unique&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Set&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;array&lt;/span&gt;&lt;span&gt;)]&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;client:load&lt;/code&gt;，首屏 JS 体积 150KB，LCP 3.2 秒。&lt;/p&gt;&lt;p&gt;优化后：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;导航栏：改用 &lt;code&gt;client:load&lt;/code&gt;（因为用户进来就要用）&lt;/li&gt;
&lt;li&gt;评论区：改用 &lt;code&gt;client:visible&lt;/code&gt;（在页面底部，滚动到才加载）&lt;/li&gt;
&lt;li&gt;社交分享按钮：改用 &lt;code&gt;client:idle&lt;/code&gt;（次要功能）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;结果：首屏 JS 体积降到 45KB，LCP 降到 1.6 秒，Lighthouse 性能分数从 72 提升到 94。&lt;/p&gt;&lt;p&gt;关键思路：不是所有组件都需要立即交互。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;图片通常占网页总体积的60-70%，是拖慢网站性能的头号杀手。&lt;/p&gt;&lt;p&gt;使用 Astro 的 &lt;code&gt;&amp;lt;Image /&amp;gt;&lt;/code&gt; 组件替代 &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; 标签，自动压缩、转换格式、响应式处理。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&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;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro:assets&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;coverImage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;../assets/blog-cover.jpg&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Image&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;src&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;coverImage&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;alt&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;博客封面图&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;width&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;1200&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;height&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;630&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;format&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;webp&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;quality&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;85&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;loading&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;eager&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;首屏图片用 &lt;code&gt;loading=&quot;eager&quot;&lt;/code&gt;，其他图片用 &lt;code&gt;loading=&quot;lazy&quot;&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;格式选择：90%的场景用 WebP 就行，追求极致用 AVIF + WebP + JPEG 三重降级。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;section&gt;&lt;h3&gt;使用 font-display&lt;a href=&quot;#使用-font-display&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;font-face&lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;font-family&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;Custom Font&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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; &lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;/fonts/custom-font.woff2&lt;/span&gt;&lt;span&gt;&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;format&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;woff2&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;font-display&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;swap&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;font-display: swap&lt;/code&gt; 会立即使用系统字体显示文本，等自定义字体加载完后再替换，避免白屏。&lt;/p&gt;&lt;/section&gt;&lt;section&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;subset-font&lt;/code&gt; 或者在线工具生成。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;避免 FOIT (Flash of Invisible Text)&lt;a href=&quot;#避免-foit-flash-of-invisible-text&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;font-display: swap&lt;/code&gt; 虽然能避免白屏，但会导致字体切换时的闪烁。更好的方案是使用 &lt;code&gt;font-display: optional&lt;/code&gt;，让浏览器决定是否等待字体加载。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 不推荐：一次性导入&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;heavyFunction1&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;heavyFunction2&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;./heavy-module&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 推荐：按需导入&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;heavyFunction1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&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;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;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;./heavy-module&lt;/span&gt;&lt;span&gt;&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;then&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;&lt;/span&gt;&lt;span&gt;=&amp;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;&lt;/span&gt;&lt;span&gt;heavyFunction1&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;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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 默认就是基于路由的代码分割，每个页面只加载自己需要的代码。&lt;/p&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 只在需要时加载图表库&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;someCondition&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;Chart&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;load&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;head&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rel&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;preload&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/fonts/main.woff2&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;font&lt;/span&gt;&lt;span&gt;&quot;&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;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;font/woff2&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;crossorigin&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rel&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;preload&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/images/hero.webp&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;head&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;但要谨慎使用，过度预加载会浪费带宽。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Core Web Vitals 调优&lt;a href=&quot;#core-web-vitals-调优&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;LCP (Largest Contentful Paint) - 最大内容绘制&lt;a href=&quot;#lcp-largest-contentful-paint---最大内容绘制&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;code&gt;&amp;lt;Image /&amp;gt;&lt;/code&gt; 组件&lt;/li&gt;
&lt;li&gt;移除阻塞渲染的 JS&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;CLS (Cumulative Layout Shift) - 累积布局偏移&lt;a href=&quot;#cls-cumulative-layout-shift---累积布局偏移&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;为所有图片设置 width 和 height&lt;/li&gt;
&lt;li&gt;为动态插入的内容预留空间&lt;/li&gt;
&lt;li&gt;避免在现有内容上方插入内容&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;FID/INP (First Input / Interaction to Next Paint) - 首次输入/交互延迟&lt;a href=&quot;#fidinp-first-input--interaction-to-next-paint---首次输入交互延迟&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;减少 JS 执行时间&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;client:idle&lt;/code&gt; 推迟非关键 JS&lt;/li&gt;
&lt;li&gt;拆分长任务，避免阻塞主线程&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;性能测试与监控&lt;a href=&quot;#性能测试与监控&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Lighthouse 测试&lt;a href=&quot;#lighthouse-测试&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在 Chrome DevTools 里运行 Lighthouse：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Performance 评分：目标 90+&lt;/li&gt;
&lt;li&gt;LCP：目标 &amp;lt; 2.5秒&lt;/li&gt;
&lt;li&gt;FID：目标 &amp;lt; 100ms&lt;/li&gt;
&lt;li&gt;CLS：目标 &amp;lt; 0.1&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;WebPageTest&lt;a href=&quot;#webpagetest&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果想看真实用户环境的表现，可以用 &lt;a href=&quot;https://www.webpagetest.org/&quot; target=&quot;_blank&quot;&gt;WebPageTest&lt;/a&gt; 测试不同地区、不同设备的加载表现。&lt;/p&gt;&lt;/section&gt;&lt;section&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;建立性能监控机制，定期检查 Core Web Vitals 指标。新功能上线前，记得跑一次性能测试。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;code&gt;client:load&lt;/code&gt;，结果性能和 React SPA 没啥区别。后来学会根据不同场景选择不同的 client 指令，性能才提升上来。&lt;/p&gt;&lt;p&gt;字体优化也踩过坑。一开始没设置 &lt;code&gt;font-display&lt;/code&gt;，首屏一直白屏，用户还以为网站挂了。后来加了 &lt;code&gt;font-display: swap&lt;/code&gt; 才解决。&lt;/p&gt;&lt;p&gt;图片也是。一开始用的都是 JPEG 格式，文件很大。后来全部改成 WebP，首屏图片总大小从 8MB 降到 1.2MB，LCP 从 4.8 秒降到 1.3 秒。&lt;/p&gt;&lt;p&gt;还有代码分割。一开始把所有第三方库都在首页导入，结果首屏 JS 体积爆炸。后来改成按需加载，只在需要的页面才加载对应的库。&lt;/p&gt;&lt;p&gt;Core Web Vitals 这块也需要注意。一开始没给图片设置 width 和 height，导致页面加载时布局跳动，CLS 指标很差。后来所有图片都设置了尺寸，CLS 才降下来。&lt;/p&gt;&lt;p&gt;现在 Lighthouse 分数 96，LCP 1.6 秒，用户留存率提升了 15%。&lt;/p&gt;&lt;p&gt;性能优化不是一劳永逸的事，需要持续关注和维护。但也不用为了那一两分纠结太久，从 60 分优化到 95 分就很好了。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Astro图片优化实战：加载快50%的5个技巧</title><link>https://blog.moewah.com/posts/astro-image-optimization-complete-guide-50-fast-loading/</link><guid isPermaLink="true">https://blog.moewah.com/posts/astro-image-optimization-complete-guide-50-fast-loading/</guid><description>如何让Astro网站图片加载速度提升50%？本文详细拆解Image组件配置、格式选择、懒加载和CDN集成等5个实战技巧，帮助开发者快速优化网站性能，提升Lighthouse评分和SEO排名。</description><pubDate>Thu, 29 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;上个月用Astro搭了个技术博客，兴冲冲上线后打开一看——首屏加载竟然要6秒！图片大小动辄2-3MB，手机上更是要等半天才能看到内容。&lt;/p&gt;
&lt;p&gt;后来花了两天时间研究Astro的图片优化，从Image组件配置到格式选择、懒加载、CDN集成，一步步优化下来，首屏加载降到了1.8秒，Lighthouse性能评分从62分直接跳到95分。&lt;/p&gt;
&lt;section&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;图片通常占网页总体积的60-70%，是拖慢网站性能的头号杀手。&lt;/p&gt;&lt;p&gt;我之前的博客，一张未经压缩的封面图就2.5MB，文章里再放几张截图，整个页面轻松5-6MB。用户打开网站，光是等图片加载就要好几秒，跳出率高得吓人。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;Google对图片加载有严格要求&lt;a href=&quot;#google对图片加载有严格要求&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Google的Core Web Vitals指标里有个LCP（Largest Contentful Paint，最大内容绘制时间），Google要求LCP要在2.5秒以内，超过4秒就算不及格。&lt;/p&gt;&lt;p&gt;对大多数网站来说，LCP通常就是那张大大的封面图或首屏图片。图片加载慢，LCP就高，SEO排名就会受影响。&lt;/p&gt;&lt;/section&gt;&lt;section&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;首屏加载时间: 6.2秒&lt;/li&gt;
&lt;li&gt;Lighthouse性能评分: 62分&lt;/li&gt;
&lt;li&gt;图片总大小: 约8MB&lt;/li&gt;
&lt;li&gt;LCP指标: 4.8秒&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;优化后&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;首屏加载时间: 1.8秒&lt;/li&gt;
&lt;li&gt;Lighthouse性能评分: 95分&lt;/li&gt;
&lt;li&gt;图片总大小: 约1.2MB&lt;/li&gt;
&lt;li&gt;LCP指标: 1.3秒&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;跳出率降低了差不多35%，用户明显更愿意留下来看内容了。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Astro Image组件完全指南&lt;a href=&quot;#astro-image组件完全指南&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Astro内置了&lt;code&gt;&amp;lt;Image /&amp;gt;&lt;/code&gt;和&lt;code&gt;&amp;lt;Picture /&amp;gt;&lt;/code&gt;两个图片组件。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;基础使用：Image vs Picture&lt;a href=&quot;#基础使用image-vs-picture&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;&amp;lt;Image /&amp;gt;&lt;/code&gt;组件是最常用的：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&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;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro:assets&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;coverImage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;../assets/blog-cover.jpg&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Image&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;src&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;coverImage&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;alt&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;博客封面图&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;width&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;1200&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;height&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;630&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这个组件会自动帮你压缩图片、转换成WebP格式、生成响应式图片。&lt;/p&gt;&lt;p&gt;&lt;code&gt;&amp;lt;Picture /&amp;gt;&lt;/code&gt;组件更强大，可以提供多种格式的降级方案：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Picture&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro:assets&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;heroImage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;../assets/hero.jpg&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Picture&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;src&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;heroImage&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;formats&lt;/span&gt;&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;&lt;/span&gt;&lt;span&gt;avif&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;webp&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;jpeg&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;alt&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Hero图片&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;width&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;1920&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;height&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;1080&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;浏览器会优先加载AVIF（最小），不支持就降级到WebP，再不行就用JPEG。&lt;/p&gt;&lt;/section&gt;&lt;section&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;widths - 响应式宽度&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Image&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;src&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;widths&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;400&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;800&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;1200&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;sizes&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;(max-width: 768px) 400px, (max-width: 1024px) 800px, 1200px&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;alt&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;响应式图片&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;Astro会生成三个尺寸的图片，浏览器根据屏幕大小自动选择最合适的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;quality - 质量控制&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Image&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;src&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;quality&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mid&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;alt&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;博客配图&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;low&lt;/code&gt;: 适合缩略图、背景图&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mid&lt;/code&gt;: 大多数场景都够用（推荐）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;high&lt;/code&gt;: 对画质要求高的场景&lt;/li&gt;
&lt;li&gt;数字(0-100): 精确控制&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我一般用&lt;code&gt;mid&lt;/code&gt;或者&lt;code&gt;80&lt;/code&gt;，肉眼看不出区别，文件大小能减少30-40%。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;inferSize - 远程图片救星&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Image&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;src&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://example.com/image.jpg&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;inferSize&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;alt&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;远程图片&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果你用远程图片但不知道尺寸，加上&lt;code&gt;inferSize&lt;/code&gt;就行了，Astro会自动获取。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;loading - 懒加载配置&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- 首屏图片，立即加载 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Image&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;{&lt;/span&gt;&lt;span&gt;hero&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;loading&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;eager&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;alt&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;首屏图&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;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- 首屏以下，懒加载 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Image&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;{&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;loading&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;lazy&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;alt&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;内容图&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;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;本地 vs 远程图片&lt;a href=&quot;#本地-vs-远程图片&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;myImage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;../assets/photo.jpg&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Image&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;{&lt;/span&gt;&lt;span&gt;myImage&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;alt&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;本地图片&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;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;本地图片会被Astro自动优化、压缩、打包。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;远程图片&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Image&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://images.unsplash.com/photo-xxx&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;width&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;800&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;height&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;600&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;alt&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;远程图片&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;记得在&lt;code&gt;astro.config.mjs&lt;/code&gt;里配置：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;domains&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;images.unsplash.com&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;cdn.example.com&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;public目录的图片&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;img&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;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/logo.png&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;alt&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Logo&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;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;放在&lt;code&gt;public/&lt;/code&gt;目录的图片不会被优化，只适合Logo、favicon这种小文件。&lt;/p&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&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;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro:assets&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;coverImage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;../assets/blog-cover.jpg&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Image&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;src&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;coverImage&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;alt&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;width&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;1200&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;height&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;630&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;format&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;webp&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;quality&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;85&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;loading&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;eager&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;blog-cover&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;文章内图片（懒加载）&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Image&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;src&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;screenshot&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;alt&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;配置示例截图&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;width&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;800&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;height&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;450&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;format&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;webp&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;quality&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mid&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;loading&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;lazy&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;图片格式选择完全指南&lt;a href=&quot;#图片格式选择完全指南&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;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;JPEG&lt;/td&gt;&lt;td&gt;有损&lt;/td&gt;&lt;td&gt;中等&lt;/td&gt;&lt;td&gt;100%&lt;/td&gt;&lt;td&gt;照片、复杂图像&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;PNG&lt;/td&gt;&lt;td&gt;无损&lt;/td&gt;&lt;td&gt;较大&lt;/td&gt;&lt;td&gt;100%&lt;/td&gt;&lt;td&gt;需要透明度的图&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;WebP&lt;/td&gt;&lt;td&gt;有损/无损&lt;/td&gt;&lt;td&gt;小&lt;/td&gt;&lt;td&gt;97%+&lt;/td&gt;&lt;td&gt;通用场景（推荐）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AVIF&lt;/td&gt;&lt;td&gt;有损/无损&lt;/td&gt;&lt;td&gt;最小&lt;/td&gt;&lt;td&gt;90%+&lt;/td&gt;&lt;td&gt;追求极致压缩&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;JPEG&lt;/strong&gt; - 老牌格式，兼容性最好。优点是所有浏览器都支持，缺点是不支持透明度。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;PNG&lt;/strong&gt; - 无损压缩，支持透明。优点是画质无损，缺点是文件大，通常是JPEG的2-3倍。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;WebP&lt;/strong&gt; - Google力推，平衡性最好。比JPEG压缩率高30%，支持透明度，兼容性好。90%的场景我直接用WebP。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;AVIF&lt;/strong&gt; - 最新格式，压缩率最高。比WebP还高20-30%，但浏览器支持度稍低。&lt;/p&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;需要透明度？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├─ 是 → WebP(首选) 或 PNG(降级)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└─ 否 → 继续&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;是照片或复杂图像？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├─ 是 → WebP(首选) 或 AVIF(追求极致)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└─ 否 → 继续&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;是Logo或图标？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├─ 是 → SVG(矢量图)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└─ 否 → 继续&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;是动图？&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└─ WebP(替代GIF)&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Picture&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro:assets&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;heroImage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;../assets/hero.jpg&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Picture&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;src&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;heroImage&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;formats&lt;/span&gt;&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;&lt;/span&gt;&lt;span&gt;avif&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;webp&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;jpeg&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;alt&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Hero图片&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;width&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;1920&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;height&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;1080&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;浏览器的加载逻辑：先尝试AVIF，不支持就用WebP，再不行就用JPEG。&lt;/p&gt;&lt;/section&gt;&lt;section&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;我拿一张2.5MB的原图做了个测试：&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;原图(PNG)&lt;/td&gt;&lt;td&gt;2.5MB&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;原始&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;JPEG(quality=85)&lt;/td&gt;&lt;td&gt;450KB&lt;/td&gt;&lt;td&gt;82%&lt;/td&gt;&lt;td&gt;肉眼几乎无差别&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;WebP(quality=85)&lt;/td&gt;&lt;td&gt;180KB&lt;/td&gt;&lt;td&gt;93%&lt;/td&gt;&lt;td&gt;肉眼几乎无差别&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AVIF(quality=85)&lt;/td&gt;&lt;td&gt;120KB&lt;/td&gt;&lt;td&gt;95%&lt;/td&gt;&lt;td&gt;肉眼几乎无差别&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;同样的视觉质量，WebP比JPEG小60%，AVIF更是小73%。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;section&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;loading&lt;/code&gt;属性：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;img&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;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;image.jpg&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;loading&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;lazy&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;alt&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;懒加载图片&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;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;Astro的Image组件默认就开启了懒加载。&lt;/p&gt;&lt;/section&gt;&lt;section&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;立即加载（loading=“eager”）&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;首屏可见的图片（Hero图、封面图）&lt;/li&gt;
&lt;li&gt;Logo、导航栏图标&lt;/li&gt;
&lt;li&gt;关键业务图片（产品主图、头像）&lt;/li&gt;
&lt;li&gt;Above the fold（首屏以上）的所有内容&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;懒加载（loading=“lazy”）&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;p&gt;首屏1-2张图立即加载就够了，其他全部懒加载。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;图片CDN集成实战&lt;a href=&quot;#图片cdn集成实战&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;CDN就是把你的图片缓存到全球各地的节点，用户访问时从最近的节点加载。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;为什么需要CDN&lt;a href=&quot;#为什么需要cdn&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;/li&gt;
&lt;li&gt;&lt;strong&gt;减轻服务器压力&lt;/strong&gt;: 图片请求全走CDN，源服务器轻松很多&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动优化&lt;/strong&gt;: 很多CDN会自动转换格式、压缩图片&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;容灾备份&lt;/strong&gt;: 一个节点挂了还有其他节点&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我的博客接入Cloudflare CDN后，海外用户的加载速度提升了60%左右。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Cloudflare Image Resizing集成&lt;a href=&quot;#cloudflare-image-resizing集成&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;第一步：开启Cloudflare Image Resizing&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;登录Cloudflare Dashboard → 选择你的域名 → Speed → Optimization → 开启”Image Resizing”&lt;/p&gt;&lt;p&gt;免费版有每月5万次转换的额度，个人博客完全够用。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第二步：配置astro.config.mjs&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&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;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro/config&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cloudflare&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;@astrojs/cloudflare&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;adapter&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cloudflare&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;imageService&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;cloudflare&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;domains&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;images.unsplash.com&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;cdn.example.com&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;第三步：授权域名配置（如果用远程图片）&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;domains&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;images.unsplash.com&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;cdn.example.com&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;res.cloudinary.com&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;配置好之后，Astro的Image组件会自动使用Cloudflare的图片服务进行优化。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;其他CDN方案&lt;a href=&quot;#其他cdn方案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Cloudinary&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@cloudinary/url-gen&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;CldImage&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro-cloudinary&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;CldImage&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;src&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;sample&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;width&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;800&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;height&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;600&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;alt&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Cloudinary图片&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Cloudflare R2&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;assetsPrefix&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;https://your-r2-domain.com&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;R2的优势是流量免费，只按存储空间收费。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;CDN配置注意事项&lt;a href=&quot;#cdn配置注意事项&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;1. SSR模式需要按域名开启优化&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果用SSR，记得在Cloudflare Dashboard里为每个域名开启Image Resizing。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. 远程图片必须配置授权域名&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;不配置的话会报错：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Image&apos;s component src parameter is not allowed for this image.&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;3. compile模式仅在构建时优化&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;adapter&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cloudflare&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;imageService&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;compile&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;// 仅构建时优化&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这种模式下，图片在打包时优化一次，运行时不再优化。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;常见问题与故障排查&lt;a href=&quot;#常见问题与故障排查&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;strong&gt;1. import路径不对&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// ❌ 错误&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&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;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;./assets/photo.jpg&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// ✅ 正确&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&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;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;../assets/photo.jpg&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2. 远程图片没配置授权域名&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;domains&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;images.unsplash.com&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;3. 图片格式不支持&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Astro支持的格式：JPG, JPEG, PNG, WEBP, AVIF, GIF, SVG&lt;/p&gt;&lt;p&gt;如果是TIFF、BMP这种格式，需要先转换。&lt;/p&gt;&lt;/section&gt;&lt;section&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;strong&gt;1. 调整quality参数&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- 提高质量 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Image&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;{&lt;/span&gt;&lt;span&gt;img&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;quality&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;85&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;alt&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;清晰多了&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;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2. 原图分辨率不够&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果原图只有400x300，你非要显示成1200x900，那肯定糊。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. 响应式尺寸配置不当&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- ✅ 提供足够的尺寸 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Image&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;src&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;img&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;widths&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;400&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;800&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;1200&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;1920&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;sizes&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;(max-width: 768px) 400px, (max-width: 1024px) 800px, 1200px&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;alt&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;各种屏幕都清晰&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;1. Sharp安装失败&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Error: Could not load the &quot;sharp&quot; module&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 删除node_modules重新安装&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-rf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;node_modules&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;package-lock.json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2. 内存不足&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;FATAL ERROR: Reached heap limit Allocation failed&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;scripts&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;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;build&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_OPTIONS=&apos;--max-old-space-size=4096&apos; astro build&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;3. 图片格式不支持&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果图片是HEIC、TIFF这种格式，Sharp可能处理不了。提前转换成JPG或PNG。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;SSR模式图片问题&lt;a href=&quot;#ssr模式图片问题&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;strong&gt;1. 配置正确的imageService&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cloudflare&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;@astrojs/cloudflare&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;adapter&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cloudflare&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;imageService&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;cloudflare&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2. 检查output模式&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;// output: &apos;static&apos; 不支持Cloudflare imageService&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;3. 本地图片路径问题&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;SSR模式下，本地图片需要放在&lt;code&gt;src/&lt;/code&gt;目录，不能放在&lt;code&gt;public/&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// ✅ 正确:src/assets/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&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;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;../assets/photo.jpg&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Image&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;{&lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;alt&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;正确方式&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;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;第一次配置时忘记设置width和height，导致图片加载时页面跳动，CLS指标很差。后来记得所有图片都要设置尺寸。&lt;/p&gt;&lt;p&gt;还有一次远程图片没配置domains，结果构建时报错说图片不被允许。排查了半天才发现需要在&lt;code&gt;astro.config.mjs&lt;/code&gt;里添加授权域名。&lt;/p&gt;&lt;p&gt;Sharp模块也踩过坑。在Windows上安装Sharp时一直报错，后来发现是缺少Visual Studio Build Tools。装完就好了。&lt;/p&gt;&lt;p&gt;懒加载配置也搞错过。一开始把所有图片都设成lazy，结果首屏加载很慢，用户要等好几秒才能看到内容。后来改成首屏1-2张图eager加载，其他lazy，体验好多了。&lt;/p&gt;&lt;p&gt;图片格式选择也走过弯路。一开始全都用JPEG，后来发现WebP能小60%，就全部改成WebP了。为了兼容性，用&lt;code&gt;&amp;lt;Picture&amp;gt;&lt;/code&gt;组件提供了JPEG降级方案。&lt;/p&gt;&lt;p&gt;CDN这块也犹豫过。担心配置复杂、成本高，后来发现Cloudflare的免费额度完全够用，就果断接入了。海外用户的加载速度提升了60%左右。&lt;/p&gt;&lt;p&gt;现在博客首屏加载只要1.8秒，Lighthouse评分95分，跳出率降低35%。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>从流浪到哈佛：莉丝·默里的逆袭人生</title><link>https://blog.moewah.com/posts/homeless-to-harvard-liz-murray-story/</link><guid isPermaLink="true">https://blog.moewah.com/posts/homeless-to-harvard-liz-murray-story/</guid><description>如何在绝境中逆风翻盘？本文深度解析电影《风雨哈佛路》中莉丝·默里如何从贫困流浪少女逆袭考入哈佛，揭示教育改变命运的励志真相，提供关于奋斗与自我救赎的核心启示。</description><pubDate>Sun, 25 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;影片深度解读：《风雨哈佛路》&lt;a href=&quot;#影片深度解读风雨哈佛路&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;《风雨哈佛路》（英语：Homeless to Harvard: The Liz Murray Story）是一部由美国导演彼得·莱文（Peter Levin）执导的电视电影。该片于2003年4月7日首次在美国上映，改编自莉丝·默里（Liz Murray）的同名自传，讲述了她在极端贫困、父母吸毒且患有精神疾病的家庭环境中，通过不懈努力最终考入哈佛大学的真实励志故事。彼得·莱文是一位资深电视电影导演，其代表作多为电视剧集和电视电影，如《A Perfect Day》、《In from the Night》等，他擅长通过细腻的叙事手法展现人物的内心挣扎与成长。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;电影风格类型：&lt;/strong&gt; 传记剧情片、现实主义。影片以写实手法展现了莉丝·默里所经历的贫困、家庭破碎、流浪等残酷现实，没有过度煽情，而是通过对人物真实情感和成长历程的刻画，传递出坚韧不拔、积极向上的主题。&lt;/p&gt;&lt;/section&gt;&lt;section&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;&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;/section&gt;&lt;section&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;以下是10条体现影片主题的核心台词及其场景分析：&lt;/p&gt;&lt;ol&gt;
&lt;li&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;/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;
&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;/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;
&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;/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;
&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;/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;
&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;/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;
&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;/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;
&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;/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;
&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;/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;
&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;/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;
&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;/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;/ol&gt;&lt;/section&gt;&lt;section&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;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;li&gt;&lt;strong&gt;克制情感表达，更显力量：&lt;/strong&gt; 尽管题材沉重，但影片并未滥用悲情元素。彼得·莱文的执导风格相对克制，通过莉丝的旁白和内省，而非外化的激烈冲突来推动剧情和情感，反而让其坚韧的力量更为凸显，避免了“鸡汤”式的说教感。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;ol&gt;
&lt;li&gt;&lt;strong&gt;真实故事的强大感染力：&lt;/strong&gt; 影片改编自莉丝·默里的真实经历，这本身就赋予了影片强大的生命力和说服力。在众多虚构的励志故事中，《风雨哈佛路》以其无可辩驳的真实性，成为一个极具说服力的“不可能任务”范例。它证明了人类精神在极端逆境下的强大韧性，激励了无数观众。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;社会议题的深度触及：&lt;/strong&gt; 与许多单纯歌颂个人奋斗的影片不同，《风雨哈佛路》勇敢地触及了家庭失能、毒品泛滥、贫困与无家可归等尖锐的社会问题。它没有将莉丝的成功简单归结为个人光环，而是展现了她在挣脱这些社会泥沼过程中的艰辛与挣扎。这使得影片超越了简单的励志片范畴，具备了一定的社会学意义和人文关怀。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对教育力量的极致诠释：&lt;/strong&gt; 影片以莉丝最终进入哈佛为高潮，明确而深刻地阐释了教育对于个人命运的决定性影响。它向观众，特别是青少年，传递了一个明确的信息：教育是改变命运、实现阶层跃升最有效且公平的途径之一。在影史上，能够如此清晰、有力地呈现这一主题的影片并不多见。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;与同类影片的比较：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;与《当幸福来敲门》（The Pursuit of Happyness）比较：&lt;/strong&gt; 两者都是基于真实故事的励志片，都展现了主人公在极端困境中对梦想的追逐。但《风雨哈佛路》在展现家庭破碎、个人流浪的“风雨”部分更加触及底层生活的残酷与无助，莉丝所面临的挑战更为原始和系统性，她的“教育救赎”路径也更为纯粹。而《当幸福来敲门》更多聚焦于父子亲情和金融行业的奋斗。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;与《心灵捕手》（Good Will Hunting）比较：&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;/ol&gt;&lt;/section&gt;&lt;section&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;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;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;p&gt;&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;li&gt;&lt;strong&gt;真实故事的传播力量：&lt;/strong&gt; 影片的成功也印证了真实故事的强大传播力。莉丝·默里的经历被搬上银幕，并通过媒体广泛传播，使其成为一个具有符号意义的励志人物，持续影响着社会。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;总而言之，《风雨哈佛路》以其真实、深刻且充满希望的叙事，在影史上留下了浓墨重彩的一笔，成为一部具有深远社会影响力的传记剧情片。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Apple M芯片语音合成神器 mlx-audio-plus 全攻略</title><link>https://blog.moewah.com/posts/apple-m-chip-mlx-audio-plus-tts-stt-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/apple-m-chip-mlx-audio-plus-tts-stt-guide/</guid><description>如何在Apple Silicon上实现高效语音合成与识别？本文详解mlx-audio-plus工具的部署、模型下载及TTS/STT功能使用，提供多语言支持和REST API方案，助你快速掌握M芯片语音处理技术。</description><pubDate>Mon, 19 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;mlx-audio-plus&lt;/code&gt; 是一个基于 Apple 的 MLX 框架构建的 Text-to-Speech (TTS) 和 Speech-to-Speech (STS) 库，专为 Apple Silicon (M 系列芯片) 提供高效的语音合成。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;项目地址：&lt;/strong&gt; &lt;a href=&quot;https://github.com/DePasqualeOrg/mlx-audio-plus&quot; target=&quot;_blank&quot;&gt;https://github.com/DePasqualeOrg/mlx-audio-plus&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;核心功能：&lt;/strong&gt; 在 Apple Silicon 上快速推理、多语言支持、语音定制、语速调节，并提供REST API 等。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;💻 部署与安装&lt;a href=&quot;#-部署与安装&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;步骤一：配置 Conda Python 环境&lt;a href=&quot;#步骤一配置-conda-python-环境&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;为了避免包版本冲突，推荐使用 Conda 创建一个&lt;strong&gt;隔离的 Python 虚拟环境&lt;/strong&gt;。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;打开终端或 Anaconda Prompt。&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;创建新的 Conda 环境&lt;/strong&gt;：创建一个名为 &lt;code&gt;mlx_audio_env&lt;/code&gt; 的 Python 环境（可自定义名称），并指定 Python 版本（例如 3.12.9）。&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;conda create --name mlx_audio_env python=3.12.9&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;激活环境&lt;/strong&gt;：进入新创建的环境。&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;conda activate mlx_audio_env&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;步骤二：安装 mlx-audio-plus&lt;a href=&quot;#步骤二安装-mlx-audio-plus&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;在已激活的 Conda 环境中，使用 &lt;code&gt;pip&lt;/code&gt; 安装 &lt;code&gt;mlx-audio-plus&lt;/code&gt; 包。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pip install mlx-audio-plus&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;步骤三：通过 huggingface 下载所需模型&lt;a href=&quot;#步骤三通过-huggingface-下载所需模型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装 huggingface_hub&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pip install huggingface_hub&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 预先下载推荐的 TTS 模型&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;hf download mlx-community/CosyVoice2-0.5B-fp16&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 预先下载推荐的 STT 模型&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;hf download mlx-community/whisper-large-v3-turbo&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;推荐的 TTS 模型包括：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mlx-community/IndexTTS-1.5&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mlx-community/CosyVoice2-0.5B-fp16&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mlx-community/Spark-TTS-0.5B-fp16&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mlx-community/VoxCPM1.5-fp16&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;推荐的 STT 模型包括：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mlx-community/whisper-large-v3-turbo&lt;/code&gt; (高性能模型)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mlx-community/whisper-small-4bit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mlx-community/whisper-tiny-4bit&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;一、🗣️ 语音生成 (TTS) 功能&lt;a href=&quot;#一️-语音生成-tts-功能&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;1. 参数选项&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;mlx_audio.tts.generate&lt;/code&gt; 命令行工具。以下是&lt;code&gt;mlx_audio.tts.generate&lt;/code&gt; 命令支持的参数选项：&lt;/p&gt;&lt;p&gt;🚀 &lt;strong&gt;核心功能参数 (Core Functionality Parameters)&lt;/strong&gt;&lt;/p&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;参数&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;描述&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;用法示例&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--text TEXT&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;必需（Text-to-Speech）&lt;/strong&gt;：要转换为语音的文本字符串。如果未提供，可能需要使用 &lt;code&gt;--source_audio&lt;/code&gt; 进行语音转语音。&lt;/td&gt;&lt;td&gt;&lt;code&gt;--text &quot;Hello, world!&quot;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--voice VOICE&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;语音选择&lt;/strong&gt;：指定用于生成语音的预设或自定义声音名称。&lt;/td&gt;&lt;td&gt;&lt;code&gt;--voice af_heart&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--model MODEL&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;模型路径/名称&lt;/strong&gt;：指定要使用的 TTS 模型的路径或 Hugging Face 仓库名称。&lt;/td&gt;&lt;td&gt;&lt;code&gt;--model mlx-community/Kokoro-82M-4bit&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;⚙️ &lt;strong&gt;语音风格与控制参数 (Voice Style and Control Parameters)&lt;/strong&gt;&lt;/p&gt;






















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;参数&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;描述&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;范围/示例&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--speed SPEED&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;语速&lt;/strong&gt;：控制语音的播放速度。通常在 0.5x (慢) 到 2.0x (快) 之间。&lt;/td&gt;&lt;td&gt;&lt;code&gt;--speed 1.25&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--gender GENDER&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;性别（可能）&lt;/strong&gt;：用于指定或调整语音的感知性别（取决于模型支持）。&lt;/td&gt;&lt;td&gt;&lt;code&gt;--gender female&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--pitch PITCH&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;音高（可能）&lt;/strong&gt;：用于调整生成语音的音高（取决于模型支持）。&lt;/td&gt;&lt;td&gt;&lt;code&gt;--pitch 0.9&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--lang_code LANG_CODE&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;语言代码&lt;/strong&gt;：为模型提供语言提示，以确保正确的发音和风格。&lt;/td&gt;&lt;td&gt;&lt;code&gt;--lang_code en&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--ref_audio REF_AUDIO&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;参考音频&lt;/strong&gt;：用于&lt;strong&gt;语音克隆或风格转移&lt;/strong&gt;。模型将尝试模仿此音频的音色、语调或风格。&lt;/td&gt;&lt;td&gt;&lt;code&gt;--ref_audio path/to/ref.wav&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--ref_text REF_TEXT&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;参考文本&lt;/strong&gt;：与 &lt;code&gt;ref_audio&lt;/code&gt; 对应的文本。用于更好地对齐和理解参考音频的风格。&lt;/td&gt;&lt;td&gt;&lt;code&gt;--ref_text &quot;a quick brown fox&quot;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--instruct_text INSTRUCT_TEXT&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;指令文本&lt;/strong&gt;：用于指导模型的生成行为，例如指定情感或强调。&lt;/td&gt;&lt;td&gt;&lt;code&gt;--instruct_text &quot;Speak with a joyful tone.&quot;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--source_audio SOURCE_AUDIO&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;源音频&lt;/strong&gt;：用于&lt;strong&gt;语音转语音 (STS)&lt;/strong&gt; 工作流。模型将转换此音频的内容或风格。&lt;/td&gt;&lt;td&gt;&lt;code&gt;--source_audio path/to/source.mp3&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--stt_model STT_MODEL&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;语音转文本模型&lt;/strong&gt;：在 STS 场景中，用于将 &lt;code&gt;source_audio&lt;/code&gt; 自动转录为文本的模型。&lt;/td&gt;&lt;td&gt;&lt;code&gt;--stt_model whisper-tiny&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;💾 &lt;strong&gt;输出与文件参数 (Output and File Parameters)&lt;/strong&gt;&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;参数&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;描述&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;用法示例&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--file_prefix FILE_PREFIX&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;输出文件前缀&lt;/strong&gt;：为生成的音频文件设置一个前缀名称。&lt;/td&gt;&lt;td&gt;&lt;code&gt;--file_prefix audiobook_chapter1&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--audio_format AUDIO_FORMAT&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;音频格式&lt;/strong&gt;：指定输出音频的文件格式。常见选项包括 &lt;code&gt;wav&lt;/code&gt;, &lt;code&gt;mp3&lt;/code&gt; 等。&lt;/td&gt;&lt;td&gt;&lt;code&gt;--audio_format mp3&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--join_audio&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;合并音频段&lt;/strong&gt;：如果输入文本很长，模型可能会分段生成。此标志将所有生成的音频段合并为一个文件。&lt;/td&gt;&lt;td&gt;&lt;code&gt;--join_audio&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--play&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;播放音频&lt;/strong&gt;：生成完成后，尝试使用系统默认播放器播放生成的音频文件。&lt;/td&gt;&lt;td&gt;&lt;code&gt;--play&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;⚡ &lt;strong&gt;生成与流式传输参数 (Generation and Streaming Parameters)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这些参数通常用于控制模型的采样和解码过程，影响语音的随机性和质量。&lt;/p&gt;












































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;参数&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;描述&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;范围/示例&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--max_tokens MAX_TOKENS&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;最大令牌数&lt;/strong&gt;：限制模型在单个生成调用中可以生成的最大音频片段（token）数量。&lt;/td&gt;&lt;td&gt;&lt;code&gt;--max_tokens 1024&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--temperature TEMPERATURE&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;温度&lt;/strong&gt;：控制采样的随机性。值越高（如 1.0），结果越随机/富有创意；值越低（如 0.0），结果越确定。&lt;/td&gt;&lt;td&gt;&lt;code&gt;--temperature 0.7&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--top_p TOP_P&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Top-P 采样&lt;/strong&gt;：一种解码策略，仅考虑累计概率达到 &lt;span&gt;&lt;span&gt;PP&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;/td&gt;&lt;td&gt;&lt;code&gt;--top_p 0.9&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--top_k TOP_K&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Top-K 采样&lt;/strong&gt;：一种解码策略，仅从概率最高的 &lt;span&gt;&lt;span&gt;KK&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;K&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 个词中进行采样。&lt;/td&gt;&lt;td&gt;&lt;code&gt;--top_k 50&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--repetition_penalty REPETITION_PENALTY&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;重复惩罚&lt;/strong&gt;：对已经生成的 token 施加惩罚，以减少重复，提高流畅性。&lt;/td&gt;&lt;td&gt;&lt;code&gt;--repetition_penalty 1.1&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--stream&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;流式传输&lt;/strong&gt;：启用音频生成结果的流式传输，允许在整个音频生成完成之前开始播放或处理。&lt;/td&gt;&lt;td&gt;&lt;code&gt;--stream&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--streaming_interval STREAMING_INTERVAL&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;流式传输间隔&lt;/strong&gt;：指定在流式传输模式下，模型输出音频片段的时间间隔或大小。&lt;/td&gt;&lt;td&gt;&lt;code&gt;--streaming_interval 0.5&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;2. 基础用法：Zero-Shot 模式 (零样本克隆)&lt;a href=&quot;#2-基础用法zero-shot-模式-零样本克隆&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;该模式需要一个参考音频 (&lt;code&gt;ref_audio&lt;/code&gt;) 和对应的&lt;strong&gt;转录文本&lt;/strong&gt; (&lt;code&gt;ref_text&lt;/code&gt;) 来学习参考语音的风格，并用该风格朗读目标文本 (&lt;code&gt;text&lt;/code&gt;)。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mlx_audio.tts.generate --model mlx-community/CosyVoice2-0.5B-fp16 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--text &quot;Hello, this is a test of text to speech.&quot; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--ref_audio reference.wav \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--ref_text &quot;This is what I said in the reference audio.&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;参数&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;解释&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--model&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;必需&lt;/strong&gt;。指定要使用的 TTS 模型。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--text&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;必需&lt;/strong&gt;。希望模型朗读的目标文本。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--ref_audio&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;必需&lt;/strong&gt;。提供目标音色的音频文件路径。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--ref_text&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;必需&lt;/strong&gt;。参考音频中内容的准确转录文本。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;3. 进阶用法示例&lt;a href=&quot;#3-进阶用法示例&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;跨语言模式 (Cross-Lingual):&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mlx_audio.tts.generate --model mlx-community/CosyVoice2-0.5B-fp16 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--text &quot;Bonjour, comment allez-vous?&quot; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--ref_audio reference.wav&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;指令模式 (Instruct Mode):&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mlx_audio.tts.generate --model mlx-community/CosyVoice2-0.5B-fp16 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--text &quot;I have exciting news!&quot; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--ref_audio reference.wav \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--instruct_text &quot;Speak with excitement and enthusiasm&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;语音转换 (Voice Conversion):&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mlx_audio.tts.generate --model mlx-community/CosyVoice2-0.5B-fp16 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--ref_audio target_speaker.wav \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--source_audio source_speech.wav&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;直接播放:&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mlx_audio.tts.generate --model mlx-community/CosyVoice2-0.5B-fp16 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--text &quot;Hello world&quot; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--ref_audio reference.wav \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--play&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;二、📝 语音转文字 (STT) 功能&lt;a href=&quot;#二-语音转文字-stt-功能&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;字幕识别（Speech-to-Text）功能使用 &lt;code&gt;mlx_audio.stt.generate&lt;/code&gt; 命令行工具，主要基于 Whisper 模型。&lt;/p&gt;&lt;section&gt;&lt;h4&gt;1. 参数选项&lt;a href=&quot;#1-参数选项-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;以下是对&lt;code&gt;mlx_audio.stt.generate&lt;/code&gt; 语音转文字（Speech-to-Text, STT）命令行工具支持的参数选项的详细解析，以表格形式呈现：&lt;/p&gt;




























































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;参数&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;类型&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;是否必需&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;描述&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;示例用法&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;-h&lt;/code&gt;, &lt;code&gt;--help&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;选项&lt;/td&gt;&lt;td&gt;否&lt;/td&gt;&lt;td&gt;显示帮助信息并退出程序。&lt;/td&gt;&lt;td&gt;&lt;code&gt;mlx_audio.stt.generate -h&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--model MODEL&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;路径/名称&lt;/td&gt;&lt;td&gt;否&lt;/td&gt;&lt;td&gt;&lt;strong&gt;模型路径或名称&lt;/strong&gt;。指定用于语音转文字的模型路径或 Hugging Face 模型名称（例如 &lt;code&gt;openai/whisper-base&lt;/code&gt;）。如果未指定，通常会使用一个默认模型。&lt;/td&gt;&lt;td&gt;&lt;code&gt;--model whisper-large-v3&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--audio AUDIO&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;路径&lt;/td&gt;&lt;td&gt;&lt;strong&gt;是&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;输入音频文件路径&lt;/strong&gt;。指定要进行转录的音频文件（如 &lt;code&gt;.wav&lt;/code&gt;, &lt;code&gt;.mp3&lt;/code&gt; 等）的路径。&lt;/td&gt;&lt;td&gt;&lt;code&gt;--audio /data/recording.mp3&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--output OUTPUT&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;路径&lt;/td&gt;&lt;td&gt;&lt;strong&gt;是&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;输出文件路径&lt;/strong&gt;。指定转录结果将保存到的文件的路径和名称。&lt;strong&gt;文件扩展名不决定格式，格式由 &lt;code&gt;--format&lt;/code&gt; 决定。&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;--output transcript.txt&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--format {txt,srt,vtt,json}&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;选项&lt;/td&gt;&lt;td&gt;否&lt;/td&gt;&lt;td&gt;&lt;strong&gt;输出格式&lt;/strong&gt;。指定转录结果的输出格式。支持以下四种：  - &lt;code&gt;txt&lt;/code&gt;: 纯文本格式。  - &lt;code&gt;srt&lt;/code&gt;: SubRip 格式，常用于字幕。  - &lt;code&gt;vtt&lt;/code&gt;: WebVTT 格式，常用于网页视频字幕。  - &lt;code&gt;json&lt;/code&gt;: JSON 格式，包含详细的时间戳和信息。&lt;/td&gt;&lt;td&gt;&lt;code&gt;--format srt&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--verbose&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;标志&lt;/td&gt;&lt;td&gt;否&lt;/td&gt;&lt;td&gt;&lt;strong&gt;详细输出模式&lt;/strong&gt;。启用后，会在控制台输出更多关于模型加载、转录进度和最终结果的详细信息。&lt;/td&gt;&lt;td&gt;&lt;code&gt;--verbose&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;--max_tokens MAX_TOKENS&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;整数&lt;/td&gt;&lt;td&gt;否&lt;/td&gt;&lt;td&gt;&lt;strong&gt;最大生成令牌数&lt;/strong&gt;。限制模型在转录过程中可以生成的最大新令牌（token）数量，有助于控制生成长度或防止无限循环。&lt;/td&gt;&lt;td&gt;&lt;code&gt;--max_tokens 4096&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;2. 基础用法：使用 Whisper-Large-V3-Turbo 进行转录&lt;a href=&quot;#2-基础用法使用-whisper-large-v3-turbo-进行转录&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;使用高性能的 &lt;code&gt;mlx-community/whisper-large-v3-turbo&lt;/code&gt; 模型对音频文件进行转录。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mlx_audio.stt.generate --model mlx-community/whisper-large-v3-turbo \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--audio input_speech.wav --output transcript.txt&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;参数&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;解释&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--audio&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;必需&lt;/strong&gt;。需要转录的音频文件路径。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--model&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;必需&lt;/strong&gt;。指定要使用的 Whisper 模型名称或路径。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--output&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;必需&lt;/strong&gt;。指定输出的文件路径及文件名。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;3. 进阶用法：指定输出格式和语言&lt;a href=&quot;#3-进阶用法指定输出格式和语言&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;可以指定输出格式（例如字幕文件格式 &lt;code&gt;srt&lt;/code&gt;）以及音频中使用的语言，以提高准确性。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mlx_audio.stt.generate --model mlx-community/whisper-large-v3-turbo \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--audio long_meeting.mp3 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--format srt \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--output transcript.srt&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--output_format srt&lt;/code&gt;: 将输出格式指定为 &lt;code&gt;srt&lt;/code&gt; (字幕文件格式)。其他常见格式包括 &lt;code&gt;vtt&lt;/code&gt; 或纯 &lt;code&gt;text&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;mlx-audio-plus&lt;/code&gt; 允许启动一个 Web 服务器，通过 REST API 或 Web UI 提供语音合成和识别服务。&lt;/p&gt;&lt;p&gt;使用 &lt;code&gt;mlx_audio.server&lt;/code&gt; 命令启动服务，默认在本地主机和特定端口运行。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mlx_audio.server --host 0.0.0.0 --port 8000&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;参数&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;解释&lt;/strong&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;strong&gt;可选&lt;/strong&gt;。指定服务器监听的 IP 地址。&lt;code&gt;0.0.0.0&lt;/code&gt; 表示监听所有网络接口。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--port&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;可选&lt;/strong&gt;。指定服务器监听的端口号。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;服务器启动成功后，即可通过浏览器访问指定的地址（例如 &lt;code&gt;http://localhost:8000&lt;/code&gt;）来使用 Web UI，或访问 &lt;code&gt;http://localhost:8000/docs/&lt;/code&gt; 查看API接口相关信息。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;🗑️ 清理与移除项目&lt;a href=&quot;#️-清理与移除项目&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;步骤一：使用 pip-autoremove 卸载软件包及依赖&lt;a href=&quot;#步骤一使用-pip-autoremove-卸载软件包及依赖&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;为了彻底清除 &lt;code&gt;mlx-audio-plus&lt;/code&gt; 及其不再需要的依赖项，使用 &lt;code&gt;pip-autoremove&lt;/code&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;conda activate mlx_audio_env&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;安装 pip-autoremove&lt;/strong&gt;：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pip install pip-autoremove&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;卸载 mlx-audio-plus 及其依赖&lt;/strong&gt;：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pip-autoremove mlx-audio-plus huggingface_hub -y&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;步骤二：移除 Conda 虚拟环境&lt;a href=&quot;#步骤二移除-conda-虚拟环境&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;退出当前环境&lt;/strong&gt;：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;conda deactivate&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;删除 Conda 环境&lt;/strong&gt;：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;conda remove --name mlx_audio_env --all&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&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;TTS/STT 模型在首次运行时会被下载到本地缓存。可以手动删除 MLX 或 Hugging Face 模型在系统上的默认缓存目录中的文件，以释放磁盘空间。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>AI绘画提示词反推：精准还原图像的黄金公式</title><link>https://blog.moewah.com/posts/ai-prompt-reverse-engineering-1-to-1-image-reconstruction/</link><guid isPermaLink="true">https://blog.moewah.com/posts/ai-prompt-reverse-engineering-1-to-1-image-reconstruction/</guid><description>如何用AI生成与原图1:1复刻的图像？本文详解反推提示词的核心方法，从人物特征到光影细节，提供高忠实度的英文提示词生成方案，助你掌握AI绘画的精准控制技巧。</description><pubDate>Thu, 08 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;推荐配置：均衡模式（最适合还原图片）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Temperature:&lt;/strong&gt; &lt;code&gt;0.6&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Top_P:&lt;/strong&gt; &lt;code&gt;0.9&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;建议理由：&lt;/strong&gt; 在这个区间，模型既能保持对图片内容的&lt;strong&gt;高度忠实&lt;/strong&gt;，不会凭空臆造物体，又能拥有足够的&lt;strong&gt;语言丰富度&lt;/strong&gt;来填充 300 字的篇幅。它能确保描述性词汇（如织物纹理、光影渐变）多样化，而不至于陷入机械重复。&lt;/li&gt;
&lt;/ul&gt;
&lt;section&gt;&lt;h2&gt;AI提示词中文版&lt;a href=&quot;#ai提示词中文版&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 角色&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;你是一位专业的视觉工程师和 AI 艺术提示词大师。你的专长是将视觉元素转化为高度详尽、高质量的提示词，用于 AI 图像生成，尤其擅长对人物特征进行 1:1 的精准复刻。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 任务&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;深度分析所提供的图像，并生成一段描述性的英文提示词，以准确重构该图像。你必须极度关注人物的生物学和人口统计学特征，确保复刻的高度一致性。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 输出规则&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. **语言：** 最终生成的提示词必须完全使用 **英文**。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. **格式：** 输出必须是一个连续的段落，不得有换行、分段或项目符号。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. **长度：** 输出长度应在 500 个单词左右，充满丰富的描述性形容词。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4. **必须包含的关键词：** 你必须将以下词汇自然地融入描述中：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &quot;detailed subject image&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &quot;4K high resolution&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &quot;master-level work&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &quot;best quality&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &quot;sharp focus&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;5. **内容支柱：** 描述必须准确涵盖：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- **人物身份特征（核心）：** 必须明确识别并描述主体的**精准族裔**（例如：东亚人、高加索人、非裔、拉丁裔、中东人等）、**具体的肤色/肤质**（例如：陶瓷白、橄榄色、深色巧克力色、带雀斑的晒伤肤色等），以及**准确的年龄区间**（例如：幼儿、20岁出头、约70岁的长者）。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- **外貌细节：** 细致的五官特征、瞳孔颜色、头发质感与发型、体型、服装材质、姿态以及神情。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- **环境细节：** 环境中的微小元素、背景物体及其质感。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- **风格：** 艺术类型（如写实摄影、油画）、相机角度（如低仰角、特写）和电影感。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- **光影：** 光源类型（如体积光、轮廓光）、反射效果、色温。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;6. **忠实度：** 真实且客观地描述所有元素（包括年龄带来的皱纹、皮肤瑕疵、特定的族裔特征或 NSFW 内容），以确保准确还原原始场景。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;7. **禁止废话：** 不要包含任何开场白或结束语。仅输出提示词文本。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;请用一段式连续文本直接描述这张图片。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;AI提示词英文版&lt;a href=&quot;#ai提示词英文版&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Role&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;You are a Professional Vision Engineer and AI Art Prompt Master. Your expertise lies in translating visual elements into highly descriptive, high-quality prompts for AI image generation, with a focus on absolute character fidelity.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Task&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Analyze the provided image in depth and generate a descriptive English prompt to accurately reconstruct the image. You must pay extreme attention to the character&apos;s biological and demographic traits to ensure a 1:1 reconstruction.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Output Rules&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. **Language:** Output strictly in **English** only.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. **Format:** The output must be a single, continuous paragraph without any line breaks or bullet points.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. **Length:** The output should be approximately 500 words, rich in descriptive adjectives.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4. **Mandatory Keywords:** You MUST naturally integrate the following phrases into the description:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &quot;detailed subject image&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &quot;4K high resolution&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &quot;master-level work&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &quot;best quality&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &quot;sharp focus&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;5. **Content Pillars:** The description must accurately cover:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- **Subject Demographics (Crucial):** Explicitly identify and describe the subject&apos;s **precise ethnicity** (e.g., East Asian, Caucasian, African, Hispanic, Middle Eastern, etc.), **specific skin tone/complexion** (e.g., porcelain, olive, deep espresso, sun-kissed with freckles), and **exact age range** (e.g., toddler, mid-20s, elderly around 70).&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- **Physical Appearance:** Detailed facial features, eye color, hair texture/style, body build, attire texture, posture, and expression.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- **Details:** Micro-elements in the environment, background objects, and peripheral textures.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- **Style:** Artistic genre (e.g., photorealistic, oil painting), camera angle (e.g., low angle, close-up), and cinematic feel.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- **Lighting &amp;amp; Shadow:** Light sources (e.g., volumetric lighting, rim light), reflections, and color temperature.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;6. **Fidelity:** Describe all elements truthfully and objectively (including age-related wrinkles, skin imperfections, or specific ethnic features) to ensure accurate reproduction.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;7. **No Meta-talk:** Do not include any introductory or concluding remarks. Output the prompt text ONLY.&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Please describe this picture in a single continuous paragraph.&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Astro框架揭秘：零JS、孤岛架构与内容优先的真正含义</title><link>https://blog.moewah.com/posts/astro-zero-js-island-architecture-content-first/</link><guid isPermaLink="true">https://blog.moewah.com/posts/astro-zero-js-island-architecture-content-first/</guid><description>为什么你的静态网站需要500KB JavaScript？本文解析Astro框架的三大核心理念——内容优先、零JS默认和孤岛架构，帮你判断何时该用Astro替代Next.js或React，解决网站加载慢、JS冗余的痛点。</description><pubDate>Thu, 24 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;前段时间用 Next.js 搭了个技术博客，写完代码一打包，JavaScript 体积直接飙到 500KB。我有点懵——这明明就是个展示文章的站点，大部分页面都是文字和图片，为什么要加载这么多 JS？&lt;/p&gt;
&lt;p&gt;打开 Chrome DevTools 一看，更崩溃：首屏加载 3 秒，还有一堆”未使用的 JavaScript”警告。我开始怀疑，用 React/Vue 做内容站点，是不是有点”杀鸡用牛刀”？&lt;/p&gt;
&lt;p&gt;直到遇到了 Astro。&lt;/p&gt;
&lt;section&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;拿 React 举例。当你访问一个 React 网站，浏览器会先加载整个 React 运行时（大概 130KB），然后加载你的业务代码，接着进行”hydration”——把服务端渲染的静态 HTML 变成可交互的组件。&lt;/p&gt;&lt;p&gt;如果你的页面只是展示一篇博客文章，90% 的内容都是文字和图片，压根不需要交互，为什么还要加载这么多 JS？&lt;/p&gt;&lt;p&gt;传统 SPA 框架打包出来的代码，平均 500KB 的 JS 里有 60% 是没用上的。你花了 3 秒加载的代码，大部分都在”躺平”。&lt;/p&gt;&lt;p&gt;核心矛盾在于：内容展示型网站 vs 高交互应用的需求完全不一样。一个在线文档编辑工具需要大量 JS 来处理实时协作，这没问题。但一个展示产品介绍的页面，真的需要这么重的框架吗？&lt;/p&gt;&lt;p&gt;Astro 的想法是：那我们就别默认加载 JS 了。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;内容优先（Content-Focused）&lt;a href=&quot;#内容优先content-focused&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这里的”内容优先”不是说”你要多写点内容”，而是一种架构哲学——网站的核心是内容展示，而不是复杂的应用逻辑。&lt;/p&gt;&lt;p&gt;Astro 把网站分成了两类：&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;/ul&gt;&lt;p&gt;中信银行用 Astro 搭了个金融级的元数据平台，从 Next.js 迁移过来后，JS 代码体积直接砍了 90%，页面性能提升 30%。&lt;/p&gt;&lt;p&gt;如果你的网站主要是展示内容（文字、图片、视频），那大部分页面就该是静态 HTML，快速加载，SEO 友好。只有真正需要交互的地方（比如评论区、搜索框），才加载必要的 JS。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;零 JavaScript 默认（Zero JS by Default）&lt;a href=&quot;#零-javascript-默认zero-js-by-default&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;“零 JS 默认”不是说不用 JS，而是默认不发送 JS 到客户端，但你可以按需添加。&lt;/p&gt;&lt;p&gt;传统的 SSG/SSR 框架（比如 Next.js）会先在服务端渲染出 HTML，然后把整个 React 框架和你的组件代码都发送到浏览器，进行全量 hydration。哪怕这个页面只是展示一段文字，React 运行时也得加载。&lt;/p&gt;&lt;p&gt;Astro 的思路相反：先生成纯静态 HTML，默认不带任何 JS。需要交互的地方，你再手动标记”这个组件需要 JS”。&lt;/p&gt;&lt;p&gt;同样一个文档站点，Next.js 打包出来的 JS 大概 150KB 起步，Astro 可能只有 11KB，甚至更少。Lighthouse 性能评分能到 99 分。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;孤岛架构（Islands Architecture）&lt;a href=&quot;#孤岛架构islands-architecture&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;想象一片静态 HTML 的海洋，上面飘着几个需要交互的”小岛”。&lt;/p&gt;&lt;p&gt;海洋部分（静态内容）加载超快，不需要 JS。小岛部分（交互组件）独立加载自己需要的 JS，互不干扰。这就是 Astro 的孤岛架构。&lt;/p&gt;&lt;p&gt;技术实现上，它用的是”部分水合”（partial hydration）。传统框架是全量水合——整个页面的虚拟 DOM 都要重建。Astro 只水合那些标记为”需要交互”的组件。&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;li&gt;分享按钮（需要交互）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;传统框架会把整个页面都水合一遍，Astro 只会水合评论区和分享按钮。TTI（首次交互时间）能降低 300%。&lt;/p&gt;&lt;p&gt;Astro 提供了几个”水合指令”，让你精确控制什么时候加载 JS：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;client:load&lt;/code&gt; - 页面加载后立即加载（适合关键交互）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;client:idle&lt;/code&gt; - 浏览器空闲时加载（不着急的功能）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;client:visible&lt;/code&gt; - 滚动到可见区域时加载（图片轮播、视频播放器）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;每个孤岛都是独立渲染的，互不阻塞。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;strong&gt;纯 React/Vue/Svelte - 重客户端哲学&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;核心理念是把浏览器当成应用的运行环境，追求极致的交互体验。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：全部逻辑都在客户端跑，JS 体积大，但交互丝滑&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;适合场景&lt;/strong&gt;：SaaS 后台、在线画图工具、文档编辑器、复杂表单&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;典型代表&lt;/strong&gt;：Figma、Notion、Google Docs&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Next.js/Nuxt - 全栈平台哲学&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;既想要 SPA 的交互能力，又想要 SSR/SSG 的性能和 SEO。它们不只是前端框架，还能让你写后端 API，目标是成为”全栈开发平台”。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：服务端渲染 + 客户端 hydration，功能全面但体积较大&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;适合场景&lt;/strong&gt;：复杂电商、社交应用、需要频繁更新数据的网站&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;典型代表&lt;/strong&gt;：Netflix、TikTok、Hulu&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Astro - 内容优先哲学&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;核心是”默认静态 HTML + 按需 JS”，专门为内容展示型网站优化。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：JS 体积极小（减少 83-90%），性能拉满，SEO 友好&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;/p&gt;














































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;特性&lt;/th&gt;&lt;th&gt;Astro&lt;/th&gt;&lt;th&gt;Next.js&lt;/th&gt;&lt;th&gt;纯 React&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;JS 体积&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;极小（11KB 起）&lt;/td&gt;&lt;td&gt;较大（150KB 起）&lt;/td&gt;&lt;td&gt;大（130KB 起）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;学习曲线&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;低（类似 JSX）&lt;/td&gt;&lt;td&gt;中（需要学 SSR 概念）&lt;/td&gt;&lt;td&gt;低&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;框架绑定&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;无（支持 React/Vue/Svelte）&lt;/td&gt;&lt;td&gt;React only&lt;/td&gt;&lt;td&gt;React only&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;适用场景&lt;/strong&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;SEO&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;优秀（静态 HTML）&lt;/td&gt;&lt;td&gt;良好（SSR）&lt;/td&gt;&lt;td&gt;差（需要额外配置）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;首屏速度&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;最快&lt;/td&gt;&lt;td&gt;快&lt;/td&gt;&lt;td&gt;较慢&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Astro 是”框架无关”的。你可以用 React、Vue、Svelte 写组件，甚至在同一个项目里混用。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;什么时候该用 Astro&lt;a href=&quot;#什么时候该用-astro&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;✅ 适合用 Astro 的场景：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;个人博客、技术文档站&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;主要是文字和图片，交互少（评论区、搜索框这种程度），需要 SEO 优化。&lt;/p&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;注意，是”展示页”，不是购物车和结算流程。大量商品图片和介绍，需要 SEO（搜索引擎收录商品）。&lt;/p&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;❌ 不适合用 Astro 的场景：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;高度交互的 Web 应用&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在线协作工具（类似 Figma、Miro）、复杂仪表板（数据实时刷新）、管理后台（大量表单和操作）。这些场景，整个页面都需要 JS，Astro 反而多此一举。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;需要实时数据更新的应用&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;聊天应用、股票交易平台、实时协作文档。Astro 主要生成静态页面，不擅长处理实时数据。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;纯单页应用（SPA）&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你的网站就是一个复杂应用，不需要 SEO，那直接用 React/Vue 就好，Astro 帮不上忙。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;一个简单的判断标准：&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;我的网站主要是展示内容，还是提供复杂交互？&lt;/li&gt;
&lt;li&gt;如果把 JavaScript 全禁用了，网站还能看吗？&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;如果答案是”展示内容”+“能看”，那 Astro 八成适合你。如果答案是”复杂交互”+“不能看”，那还是考虑 Next.js 或纯 SPA 框架吧。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;.astro&lt;/code&gt; 文件的语法和 JSX、Vue 几乎一样。如果你写过 React 或 Vue，看一眼就能上手。&lt;/p&gt;&lt;p&gt;你也不一定非要用 &lt;code&gt;.astro&lt;/code&gt; 语法。可以直接用 &lt;code&gt;.md&lt;/code&gt;（Markdown）、&lt;code&gt;.jsx&lt;/code&gt;（React）、&lt;code&gt;.vue&lt;/code&gt;（Vue）写内容。想用哪个就用哪个，甚至可以在一个项目里混用。&lt;/p&gt;&lt;p&gt;Astro 有个&lt;a href=&quot;https://astro.build/themes/&quot; target=&quot;_blank&quot;&gt;主题市场&lt;/a&gt;，里面全是现成的博客模板、文档站模板、作品集模板。找一个喜欢的，改改文字和配色，半小时就能上线。&lt;/p&gt;&lt;p&gt;底层用的是 Vite 和 Esbuild，启动速度快，热更新迅速。改完代码立马能看到效果。&lt;/p&gt;&lt;p&gt;Astro &lt;a href=&quot;https://docs.astro.build/&quot; target=&quot;_blank&quot;&gt;官方文档&lt;/a&gt;写得很清楚，一步步教你怎么上手。遇到问题基本都能找到答案。&lt;/p&gt;&lt;p&gt;如果你只是想搭个博客或者文档站，Astro 可能是最快的选择了。不需要配置复杂的打包工具，不需要纠结路由怎么写，开箱就能用。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;&lt;strong&gt;内容优先&lt;/strong&gt;：专为内容展示型网站设计，让架构服务于内容&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;零 JS 默认&lt;/strong&gt;：默认不发送 JavaScript，只在真正需要的地方按需加载&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;孤岛架构&lt;/strong&gt;：静态 HTML 海洋中的交互小岛，独立水合、互不阻塞&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;它和传统框架的核心区别就在于——用现代框架的开发体验，输出静态网站的性能。你能享受到组件化、热更新、TypeScript 支持这些现代特性，同时又能拿到接近纯 HTML 的加载速度。&lt;/p&gt;&lt;p&gt;如果你正在做博客、文档站、官网、营销页，可以试试 Astro。它不是万能的，但在它擅长的领域，确实是降维打击。&lt;/p&gt;&lt;p&gt;Astro 不是”不能用 JS”，而是”默认不用 JS”。需要交互的地方该用还得用，只是不会像传统框架那样把整个运行时都塞给你。&lt;/p&gt;&lt;p&gt;想上手的话，直接去 &lt;a href=&quot;https://astro.build/&quot; target=&quot;_blank&quot;&gt;Astro 官网&lt;/a&gt;看文档就行。&lt;a href=&quot;https://astro.build/themes/&quot; target=&quot;_blank&quot;&gt;主题市场&lt;/a&gt;也逛逛，说不定就有你喜欢的模板。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>不同角色AI助手温度设置指南</title><link>https://blog.moewah.com/posts/ai-assistant-temperature-setting-guide-role-based/</link><guid isPermaLink="true">https://blog.moewah.com/posts/ai-assistant-temperature-setting-guide-role-based/</guid><description>如何为不同角色的AI助手配置合适的温度参数？本文详解医生、心理咨询师、锐评师等10种角色的最佳温度范围，帮助你精准控制AI输出的创造性与稳定性，提升任务执行效果。</description><pubDate>Wed, 23 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;好的，作为AI部署专家，我将根据不同助手的角色特性，为您推荐合适的温度（Temperature）设置。温度参数影响着AI生成内容的随机性和创造性，合理的设置能让助手更好地服务于其特定场景。&lt;/p&gt;
&lt;p&gt;以下是为您的助手配置的温度设置建议：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;日常医生 (Daily_Doctor 🩺)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.2 - 0.4&lt;/code&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;p&gt;&lt;strong&gt;心理咨询师 (Psychological_Counselor 🛋️)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.5 - 0.7&lt;/code&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;p&gt;&lt;strong&gt;锐评师 (Sharp_Critic 📝)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.6 - 0.8&lt;/code&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;p&gt;&lt;strong&gt;小红书文案 (Xiaohongshu_Copywriter 💄)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.8 - 1.0&lt;/code&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;p&gt;&lt;strong&gt;部署专家 (Deployment_Expert 🚀)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.1 - 0.3&lt;/code&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;p&gt;&lt;strong&gt;电影解读 (Film_Interpreter 🎬)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.7 - 0.9&lt;/code&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;p&gt;&lt;strong&gt;编程开发助手 (Programming_Assistant 💻)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.1 - 0.3&lt;/code&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;p&gt;&lt;strong&gt;小说家 (Novelist ✍️)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.8 - 1.2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;理由&lt;/strong&gt;: 小说创作是高度依赖创造力的任务。高温度能极大地激发模型的想象力，生成丰富多样的情节、角色和描写，甚至可以尝试略高于1.0的设置来探索更具实验性的文本。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;哲学三问 (Philosophical_Inquiries 🤔)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.7 - 0.9&lt;/code&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;p&gt;&lt;strong&gt;吵架小能手 (Argument_Expert 🗣️)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.6 - 0.8&lt;/code&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;p&gt;&lt;strong&gt;政策解读学者 (Policy_Analyst 📜)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.3 - 0.6&lt;/code&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;p&gt;&lt;strong&gt;决策专家 (Decision_Expert 📊)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.4 - 0.7&lt;/code&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;p&gt;&lt;strong&gt;答案之书 (Book_of_Answers 🔮)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.8 - 1.0&lt;/code&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;p&gt;&lt;strong&gt;公司调研专家 (Company_Research_Expert 📈)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐温度&lt;/strong&gt;: &lt;code&gt;0.3 - 0.6&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;理由&lt;/strong&gt;: 公司调研需要基于事实、数据和客观分析。中低温度有助于确保报告的准确性、专业性和可靠性。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;重要提示&lt;/strong&gt;:
这些温度设置是基于通用场景的建议值。在实际使用中，您可能需要根据具体的模型表现、输入提示（prompt）的风格以及您期望的输出效果，对这些数值进行微调，以找到最适合您需求的“甜蜜点”。&lt;/p&gt;</content:encoded></item><item><title>Astro博客添加Pagefind搜索功能完整指南</title><link>https://blog.moewah.com/posts/astro-blog-pagefind-search-setup-chinese-support-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/astro-blog-pagefind-search-setup-chinese-support-guide/</guid><description>如何为Astro博客免费添加中文支持的搜索功能？本文详细拆解Pagefind配置流程，解决Algolia成本高、隐私差的问题，提供从安装到中文优化的完整方案，助你快速实现免费高效的站内搜索。</description><pubDate>Wed, 23 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;博客文章越写越多之后，我经常收到读者的私信：“能不能加个搜索功能？我记得你写过XX内容，但翻了半天找不到。”&lt;/p&gt;
&lt;p&gt;其实我也想加搜索，但一直拖着——因为觉得Algolia太贵，自己搭建Elasticsearch又太折腾。直到前几个月发现了Pagefind这个工具，配置只花了不到10分钟，索引文件只有几十KB，完全免费，还支持中文搜索。&lt;/p&gt;
&lt;p&gt;Pagefind是一个专为静态网站设计的搜索引擎。它在构建时自动生成搜索索引，搜索过程完全在浏览器中进行，不需要后端服务器，也不需要第三方API。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;为什么选择Pagefind?&lt;a href=&quot;#为什么选择pagefind&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在决定给博客加搜索功能之前，我对比了市面上主流的方案。最终选择Pagefind，主要有三个原因：成本、隐私和性能。&lt;/p&gt;&lt;section&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;Pagefind属于”静态搜索”——搜索索引在构建时生成，随网站一起部署，搜索在浏览器中完成。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;完全免费&lt;/strong&gt;。不像Algolia那样按搜索次数收费，Pagefind没有任何费用。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;隐私友好&lt;/strong&gt;。用户的搜索内容不会发送到第三方服务器，所有查询都在本地完成。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;无需后端&lt;/strong&gt;。传统搜索方案需要维护服务器、数据库，Pagefind完全静态，部署在CDN上。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;按需加载&lt;/strong&gt;。Pagefind的索引被分割成多个小块，只在用户开始搜索时加载需要的部分。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Pagefind vs Algolia 对比&lt;a href=&quot;#pagefind-vs-algolia-对比&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;Pagefind&lt;/th&gt;&lt;th&gt;Algolia&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;/td&gt;&lt;td&gt;免费版有限制，标准版$1/千次搜索起&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;数据隐私&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;完全本地&lt;/td&gt;&lt;td&gt;需要上传全部内容到Algolia服务器&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;索引大小&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;10,000页&amp;lt;300KB&lt;/td&gt;&lt;td&gt;需要全量索引，体积较大&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;加载方式&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;按需加载&lt;/td&gt;&lt;td&gt;实时API调用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;配置复杂度&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;几行代码搞定&lt;/td&gt;&lt;td&gt;需要配置API key、上传数据&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;适用场景&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;中小型博客、文档站&lt;/td&gt;&lt;td&gt;大型电商、企业应用&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Algolia确实很强大，但对个人博客来说，有点杀鸡用牛刀了。更重要的是，一旦你的博客流量起来，Algolia的费用会迅速攀升。&lt;/p&gt;&lt;/section&gt;&lt;section&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;Pagefind的性能表现非常出色。根据BryceWray.com的实测，一个包含10,000页的网站，Pagefind生成的搜索索引不到300KB。而大多数博客的索引只有100KB左右。&lt;/p&gt;&lt;p&gt;Pagefind官方的测试数据：19页的网站索引只需0.043秒。&lt;/p&gt;&lt;p&gt;Astro官方文档站Starlight就内置了Pagefind作为默认搜索方案。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;5步完成Pagefind配置&lt;a href=&quot;#5步完成pagefind配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm install astro-pagefind pagefind&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;astro-pagefind&lt;/code&gt;是Astro集成，&lt;code&gt;pagefind&lt;/code&gt;是核心库，两个都需要装。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;步骤2：配置astro.config.mjs&lt;a href=&quot;#步骤2配置astroconfigmjs&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { defineConfig } from &apos;astro/config&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import pagefind from &apos;astro-pagefind&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;integrations: [pagefind()],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;添加这几行之后，每次运行&lt;code&gt;npm run build&lt;/code&gt;时，Pagefind会自动索引你的网站内容。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;在&lt;code&gt;src/components/&lt;/code&gt;目录下创建&lt;code&gt;Search.astro&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/components/Search.astro&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;link href=&quot;/pagefind/pagefind-ui.css&quot; rel=&quot;stylesheet&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;script src=&quot;/pagefind/pagefind-ui.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;div id=&quot;search&quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;script&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;window.addEventListener(&apos;DOMContentLoaded&apos;, () =&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new PagefindUI({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;element: &quot;#search&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;showSubResults: true,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;showImages: false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;配置项说明：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;element&lt;/code&gt;: 指定搜索UI挂载的DOM元素&lt;/li&gt;
&lt;li&gt;&lt;code&gt;showSubResults&lt;/code&gt;: 显示次级结果&lt;/li&gt;
&lt;li&gt;&lt;code&gt;showImages&lt;/code&gt;: 是否显示页面缩略图&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果你的网站使用了ViewTransitions，需要加一个&lt;code&gt;transition:persist&lt;/code&gt;指令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;div id=&quot;search&quot; transition:persist&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;strong&gt;方式1：嵌入到导航栏&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import Search from &apos;../components/Search.astro&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;header&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;nav&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;!-- 你的导航链接 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;Search /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;方式2：创建独立搜索页面&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;创建&lt;code&gt;src/pages/search.astro&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import Layout from &apos;../layouts/Layout.astro&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import Search from &apos;../components/Search.astro&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;Layout title=&quot;搜索&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;main&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;h1&amp;gt;搜索文章&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;Search /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/Layout&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;步骤5：构建和测试&lt;a href=&quot;#步骤5构建和测试&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm run build&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果一切正常，你会看到：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Running Pagefind...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Indexed 42 pages&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Indexed 3,582 words&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Created 5 index chunks&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Finished in 0.234 seconds&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;本地测试：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm run build &amp;amp;&amp;amp; npx pagefind --site dist --serve&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;打开浏览器访问&lt;code&gt;http://localhost:1234&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;进阶配置和优化&lt;a href=&quot;#进阶配置和优化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;默认情况下，Pagefind会索引&lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;标签里的所有内容。这会导致搜索结果不准确。&lt;/p&gt;&lt;p&gt;解决办法是用&lt;code&gt;data-pagefind-body&lt;/code&gt;属性指定要索引的区域：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;nav data-pagefind-ignore&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;!-- 导航栏不索引 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;main data-pagefind-body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;!-- 只索引正文内容 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;h1&amp;gt;文章标题&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;p&amp;gt;文章内容...&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;aside data-pagefind-ignore&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;!-- 侧边栏不索引 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/aside&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;footer data-pagefind-ignore&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;!-- 页脚不索引 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/footer&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- 覆盖默认标题 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;h1 data-pagefind-meta=&quot;title&quot;&amp;gt;Astro搜索功能实现指南&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- 指定摘要 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;p data-pagefind-meta=&quot;description&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;本文介绍如何为Astro博客添加Pagefind搜索功能。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- 指定图片 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;img data-pagefind-meta=&quot;image[src]&quot; src=&quot;/cover.jpg&quot; alt=&quot;封面&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;h1 data-pagefind-weight=&quot;10.0&quot;&amp;gt;文章标题&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;p data-pagefind-weight=&quot;1.0&quot;&amp;gt;正文内容&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;权重越高，匹配到这个元素的结果排名越靠前。&lt;/p&gt;&lt;/section&gt;&lt;section&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;Pagefind内置了多语言支持，包括中文：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;分词准确&lt;/strong&gt;：搜”Astro搜索”，能匹配到”Astro”、“搜索”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模糊匹配&lt;/strong&gt;：搜”博客搜索”，能匹配到”给博客加搜索”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;拼音不支持&lt;/strong&gt;：搜”boke”找不到”博客”&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;自定义搜索UI&lt;a href=&quot;#自定义搜索ui&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果你想深度定制，可以用JavaScript API：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const pagefind = await import(&quot;/pagefind/pagefind.js&quot;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const search = await pagefind.search(&quot;Astro&quot;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const results = await Promise.all(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;search.results.map(r =&amp;gt; r.data())&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;results.forEach(result =&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console.log(result.url);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console.log(result.meta.title);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console.log(result.excerpt);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;常见问题和解决方案&lt;a href=&quot;#常见问题和解决方案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;strong&gt;解决方案&lt;/strong&gt;：用&lt;code&gt;data-pagefind-meta&lt;/code&gt;手动指定：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const { title, description } = Astro.props;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;h1 data-pagefind-meta=&quot;title&quot;&amp;gt;{title}&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;p data-pagefind-meta=&quot;description&quot;&amp;gt;{description}&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;问题2：ViewTransitions导致搜索失效&lt;a href=&quot;#问题2viewtransitions导致搜索失效&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：给搜索容器添加&lt;code&gt;transition:persist&lt;/code&gt;指令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;div id=&quot;search&quot; transition:persist&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;问题3：构建时找不到pagefind命令&lt;a href=&quot;#问题3构建时找不到pagefind命令&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm install astro-pagefind pagefind&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;问题4：部署后搜索功能404&lt;a href=&quot;#问题4部署后搜索功能404&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：确保构建命令包含Pagefind索引步骤：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;scripts&quot;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;build&quot;: &quot;astro build &amp;amp;&amp;amp; npx pagefind --site dist&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;问题5：CSP报错或索引过大&lt;a href=&quot;#问题5csp报错或索引过大&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;CSP报错&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Content-Security-Policy: script-src &apos;self&apos; &apos;wasm-unsafe-eval&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;索引过大&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;精确控制索引范围，只索引正文。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;实战案例和最佳实践&lt;a href=&quot;#实战案例和最佳实践&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Running Pagefind...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Indexed 42 pages       ← 索引了多少页面&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Indexed 3,582 words    ← 总词数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Created 5 index chunks ← 索引分成几块&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Finished in 0.234 seconds&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;pages&lt;/code&gt;应该等于你的文章数量。&lt;code&gt;index chunks&lt;/code&gt;越少越好，通常每1000-2000页会分一个chunk。&lt;/p&gt;&lt;/section&gt;&lt;section&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;1. 确认pagefind文件夹存在&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ls dist/pagefind&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2. 测试搜索功能&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;3. 检查索引大小&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;du -sh dist/pagefind&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;通常应该在50KB-500KB之间。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. 移动端测试&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在手机上打开网站，测试搜索功能是否正常。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;SEO考虑&lt;a href=&quot;#seo考虑&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;搜索页面本身不需要被搜索引擎索引，建议在&lt;code&gt;search.astro&lt;/code&gt;添加noindex：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta name=&quot;robots&quot; content=&quot;noindex, follow&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;div id=&quot;search&quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;script&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;document.getElementById(&apos;search-icon&apos;).addEventListener(&apos;click&apos;, async () =&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const pagefind = await import(&quot;/pagefind/pagefind-ui.js&quot;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new PagefindUI({ element: &quot;#search&quot; });&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;CDN加速&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# _headers (Cloudflare Pages)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/pagefind/*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Cache-Control: public, max-age=31536000, immutable&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;预加载优化&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const pagefind = await import(&quot;/pagefind/pagefind.js&quot;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pagefind.preload(&quot;Astro&quot;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pagefind.preload(&quot;React&quot;);&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;Pagefind是给Astro博客添加搜索功能的最佳选择——完全免费、配置简单、性能出色、支持中文。&lt;/p&gt;&lt;p&gt;对比Algolia每年上百美元的费用，Pagefind能省下一大笔钱。如果你还在犹豫要不要给博客加搜索功能，我建议你花10分钟试试Pagefind。配置过程比你想的简单得多。&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://pagefind.app/docs/&quot; target=&quot;_blank&quot;&gt;Pagefind官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://starlight.astro.build/guides/site-search/&quot; target=&quot;_blank&quot;&gt;Astro Starlight搜索指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/shishkin/astro-pagefind&quot; target=&quot;_blank&quot;&gt;astro-pagefind GitHub仓库&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>从断供到自救：如何备份MinIO多架构Docker镜像</title><link>https://blog.moewah.com/posts/minio-multi-architecture-docker-image-backup-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/minio-multi-architecture-docker-image-backup-guide/</guid><description>MinIO官方停止提供预编译镜像，如何避免断供风险？本文详细拆解从拉取、打标签到多架构推送的全流程，助你安全备份MinIO镜像，确保跨平台部署不中断。</description><pubDate>Fri, 18 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;说实话，被MinIO这个操作搞懵了。你能想象吗？MINIO 本来用得好好的，突然有一天MinIO官方说：&lt;strong&gt;“我们不再提供预编译的Docker镜像了，只提供源代码”&lt;/strong&gt;。我当时就崩溃了。你知道这是什么概念吗？意味着如果你本地没有备份，以后想用MinIO就得自己编译，而且跨架构（amd64和arm64）的部署会变得超级麻烦。&lt;/p&gt;&lt;p&gt;社区里吵得沸沸扬扬，有人理解，有人骂娘。但现实很残酷：&lt;strong&gt;对于像我这样已经依赖MinIO，还要跨架构部署的人来说，未雨绸缪真的很有必要。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;老实讲，这事儿MinIO早有铺垫。2021年从Apache 2.0改成AGPLv3，2025年5月移除了社区版的控制台管理功能，到2025年10月直接停止DockerHub上的预编译镜像。这一系列操作，说白了就是商业化进程的一部分。&lt;/p&gt;&lt;p&gt;还好我有一台amd64架构的NAS，还有一台M4芯片的Mac（arm64架构），因为之前的项目需要，两台设备上拉取了 &lt;code&gt;minio/minio:RELEASE.2025-04-22T22-12-26Z&lt;/code&gt; 这个版本的镜像。在这个过渡期，毕竟仍然还有蛮多项目都依赖这个项目。看来我得提前备份一下镜像到自己的仓库中，以策万全。&lt;/p&gt;&lt;p&gt;当然，如果你觉得这事儿太麻烦，或者手头正好没有这两个架构的环境，那我也有个偷懒的办法：&lt;strong&gt;直接用我备份好的镜像。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我已经把 amd64 和 arm64 两个架构的版本都打包上传了，你只需要一条命令就能搞定：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pull&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gowah/minio:RELEASE.2025-04-22T22-12-26Z&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这个镜像已经配置好了多架构支持，无论你在 x86 还是 Apple Silicon 上都能自动拉取对应的版本。&lt;/p&gt;&lt;p&gt;不过话说回来，授人以鱼不如授人以渔，关于我是如何备份MinIO多架构Docker镜像的？我把这个操作分成4个步骤，跟你们分享一下。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;MinIO 多架构 Docker 镜像的备份流程&lt;a href=&quot;#minio-多架构-docker-镜像的备份流程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我把这个操作分成4个步骤，跟你们分享一下：&lt;/p&gt;&lt;section&gt;&lt;h3&gt;第1步：登录Docker仓库&lt;a href=&quot;#第1步登录docker仓库&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在两台设备上都要登录。建议用Access Token而不是密码，更安全。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;login&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 或者私有仓库&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&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;your.private.registry.com&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;strong&gt;在amd64的NAS上执行：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;minio/minio:RELEASE.2025-04-22T22-12-26Z&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yourusername/minio:RELEASE.2025-04-22T22-12-26Z-amd64&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;在arm64的Mac上执行：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;minio/minio:RELEASE.2025-04-22T22-12-26Z&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yourusername/minio:RELEASE.2025-04-22T22-12-26Z-arm64&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这步其实就是给每个架构的镜像加个”身份标识”，方便后续管理。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;把刚才打标签的镜像推到你的仓库里：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# amd64设备上&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yourusername/minio:RELEASE.2025-04-22T22-12-26Z-amd64&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# arm64设备上&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yourusername/minio:RELEASE.2025-04-22T22-12-26Z-arm64&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;p&gt;&lt;em&gt;Manifest（清单）是Docker用来管理多架构镜像的机制，它能让同一个镜像名称在不同架构上自动拉取对应的版本。&lt;/em&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 创建Manifest清单&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;manifest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yourusername/minio:RELEASE.2025-04-22T22-12-26Z&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;yourusername/minio:RELEASE.2025-04-22T22-12-26Z-amd64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;yourusername/minio:RELEASE.2025-04-22T22-12-26Z-arm64&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 为amd64架构添加注释&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;manifest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;annotate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--arch&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;amd64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yourusername/minio:RELEASE.2025-04-22T22-12-26Z&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yourusername/minio:RELEASE.2025-04-22T22-12-26Z-amd64&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 为arm64架构添加注释（注意v8变体）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;manifest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;annotate&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--arch&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;arm64&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--variant&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;v8&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yourusername/minio:RELEASE.2025-04-22T22-12-26Z&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yourusername/minio:RELEASE.2025-04-22T22-12-26Z-arm64&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 推送清单&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;manifest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yourusername/minio:RELEASE.2025-04-22T22-12-26Z&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 验证一下&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;manifest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;inspect&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yourusername/minio:RELEASE.2025-04-22T22-12-26Z&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;如果一切正常，你应该能看到amd64和arm64两个条目。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;ol&gt;
&lt;li&gt;&lt;strong&gt;检查一下&lt;/strong&gt;本地还有哪些MinIO镜像，特别是多架构的版本&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;p&gt;开源项目有开源项目的生存压力，商业化也是人之常情。作为用户，我们能做的就是：在接受变化的同时，给自己留好退路。&lt;/p&gt;&lt;p&gt;备份镜像这件事，表面上看是在保存一个软件版本，实际上是在守护自己的确定性。毕竟，在快速演进的技术世界里，未雨绸缪真的远胜于临渴掘井。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Astro构建失败？7个原因5分钟搞定</title><link>https://blog.moewah.com/posts/astro-build-failure-7-common-causes-fix/</link><guid isPermaLink="true">https://blog.moewah.com/posts/astro-build-failure-7-common-causes-fix/</guid><description>Astro项目本地运行正常，但构建时报错？本文详解7个常见构建失败原因及解决方案，涵盖Node版本、依赖冲突、SSR兼容性等核心问题，助你快速定位并修复构建错误。</description><pubDate>Thu, 17 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Astro构建失败可能是前端开发者最头疼的问题之一。本地环境和生产构建的差异，让人摸不着头脑。错误信息往往长达几十行，充满了各种技术术语，根本不知道从哪里开始排查。&lt;/p&gt;
&lt;p&gt;我刚开始用Astro的时候也是这样。每次遇到构建错误都要Google半天，试过各种解决方案，运气好的话十几分钟解决，运气不好可能折腾一整晚。后来我总结了一套系统的排查方法，发现其实90%的构建失败都逃不出这7个常见原因。&lt;/p&gt;
&lt;p&gt;这篇文章分享快速定位问题的方法和7种最常见的构建失败场景及其解决方案。&lt;/p&gt;
&lt;section&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;SyntaxError: Unexpected token &apos;with&apos;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Node.js版本太低&lt;/td&gt;&lt;td&gt;升级到Node 18.17.1+或20.3.0+&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Cannot find module&lt;/code&gt; / &lt;code&gt;ERR_MODULE_NOT_FOUND&lt;/code&gt;&lt;/td&gt;&lt;td&gt;依赖安装问题&lt;/td&gt;&lt;td&gt;删除node_modules重新安装&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;frontmatter does not match schema&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Content Collections验证失败&lt;/td&gt;&lt;td&gt;检查Markdown文件的frontmatter格式&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;document is not defined&lt;/code&gt; / &lt;code&gt;window is not defined&lt;/code&gt;&lt;/td&gt;&lt;td&gt;第三方包不兼容SSR&lt;/td&gt;&lt;td&gt;使用client或动态导入&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;The build was canceled&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;/td&gt;&lt;td&gt;环境变量或Node版本差异&lt;/td&gt;&lt;td&gt;检查部署平台配置&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GitHub Pages页面404&lt;/td&gt;&lt;td&gt;base路径未配置&lt;/td&gt;&lt;td&gt;设置astro.config.mjs的base字段&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;快速诊断框架：5分钟定位问题&lt;a href=&quot;#快速诊断框架5分钟定位问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;p&gt;很多人一看到报错就慌了，其实错误信息里已经藏着答案。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. 错误类型识别&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;看报错的第一行或关键词：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SyntaxError&lt;/code&gt;：代码语法问题&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ModuleNotFoundError&lt;/code&gt;或&lt;code&gt;Cannot find module&lt;/code&gt;：依赖找不到&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ValidationError&lt;/code&gt;：数据验证失败（通常是Content Collections的frontmatter）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ENOENT&lt;/code&gt;：文件或目录不存在&lt;/li&gt;
&lt;li&gt;&lt;code&gt;is not defined&lt;/code&gt;（&lt;code&gt;document&lt;/code&gt;/&lt;code&gt;window&lt;/code&gt;）：服务端渲染时访问了浏览器API&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果你看到&lt;code&gt;SyntaxError: Unexpected token &apos;with&apos;&lt;/code&gt;，基本上可以确定是Node.js版本太低了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. 错误位置定位&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;往下翻找这些信息：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;at /path/to/your/file.astro:23:5&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这告诉你具体是哪个文件的第23行出了问题。别被中间的一堆node_modules路径干扰，找到&lt;strong&gt;你自己代码的路径&lt;/strong&gt;才是关键。&lt;/p&gt;&lt;p&gt;有时候错误不在你的代码里，而是某个依赖包抛出的。这种情况下，看报错堆栈的最上面，通常会有&lt;code&gt;Error: xxx caused by&lt;/code&gt;这样的线索。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. 错误上下文理解&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;注意看错误是在哪个阶段出现的：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Building for production...&lt;/code&gt; → 构建阶段的错误&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Rendering...&lt;/code&gt; → 页面渲染阶段的错误&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vite v5.0.0 building for production...&lt;/code&gt; → Vite构建层的错误&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;构建阶段的错误通常是配置或依赖问题，渲染阶段的错误更多是代码逻辑问题。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5步快速排查法&lt;a href=&quot;#5步快速排查法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;现在你知道怎么看错误信息了。接下来按这5步操作，大部分问题都能定位：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Step 1: 检查Node.js版本&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;node -v&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;Astro要求Node.js 18.17.1+或20.3.0+。如果你的版本低于这个，升级就对了。我见过太多人卡在这一步，因为很多部署平台默认用的是旧版本Node。&lt;/p&gt;&lt;p&gt;如果本地用的是nvm，可以这样切换：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nvm use 20&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Step 2: 检查依赖是否正确安装&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm list  # 或 pnpm list&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;看看有没有&lt;code&gt;UNMET DEPENDENCY&lt;/code&gt;或&lt;code&gt;missing&lt;/code&gt;这样的提示。如果有，说明依赖没装全。&lt;/p&gt;&lt;p&gt;另外，对比一下&lt;code&gt;package.json&lt;/code&gt;和&lt;code&gt;package-lock.json&lt;/code&gt;的修改时间，如果lock文件比较旧，可能依赖已经不同步了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Step 3: 清理缓存重新构建&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这招简单粗暴但超有效。我每次遇到诡异的错误，第一反应就是清缓存：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 删除所有构建产物和依赖&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm -rf node_modules .astro dist&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 重新安装&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm install&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 再试试构建&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm run build&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;至少30%的问题这样就解决了。缓存污染或依赖版本不一致真的很常见。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Step 4: 检查最近改动的文件&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;回想一下，上次构建成功后你改了什么？新加的组件？改了配置？装了新的依赖？&lt;/p&gt;&lt;p&gt;用git看看最近的改动：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git diff HEAD&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;很多时候问题就出在最近这一两次提交里。你可以试着先注释掉新改的代码，看看能不能构建成功，这样就能快速定位问题。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Step 5: 对比本地环境和CI环境的差异&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果本地构建成功，但CI/CD或部署平台失败，那就是环境差异的问题了。重点检查：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Node版本&lt;/strong&gt;：本地和线上一致吗？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;包管理器&lt;/strong&gt;：用的npm还是pnpm还是yarn？版本一致吗？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;环境变量&lt;/strong&gt;：线上配置了所有需要的环境变量吗？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;依赖版本&lt;/strong&gt;：lock文件提交了吗？线上安装的版本和本地一致吗？&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我之前遇到过一次，本地用的Node 20，Vercel默认用的Node 18，结果用了一个只在Node 20支持的API，线上就报错了。后来在Vercel项目设置里指定了Node版本才解决。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;7个最常见的构建失败原因&lt;a href=&quot;#7个最常见的构建失败原因&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;原因1：Node.js版本不兼容&lt;a href=&quot;#原因1nodejs版本不兼容&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;SyntaxError: Unexpected token &apos;with&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;或者&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;error: Cannot use import statement outside a module&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;根本原因&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;Astro需要Node.js 18.17.1或更高版本（或者20.3.0+）。很多构建失败的根源就是版本太低。&lt;/p&gt;&lt;p&gt;为什么会出现这个问题呢？主要是这两种情况：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;你本地升级过Node，但部署平台还在用旧版本&lt;/li&gt;
&lt;li&gt;团队协作时，不同开发者的Node版本不一致&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;本地环境&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;如果你用nvm管理Node版本，切换很简单：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nvm install 20&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nvm use 20&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&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;em&gt;Vercel&lt;/em&gt;：
在项目设置 → General → Node.js Version，选择20.x&lt;/p&gt;&lt;p&gt;&lt;em&gt;Cloudflare Pages&lt;/em&gt;：
在项目根目录创建&lt;code&gt;.nvmrc&lt;/code&gt;文件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;20&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Netlify&lt;/em&gt;：
在根目录创建&lt;code&gt;netlify.toml&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[build.environment]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;NODE_VERSION = &quot;20&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;预防措施&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;在&lt;code&gt;package.json&lt;/code&gt;中加上这个，明确要求的Node版本：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;engines&quot;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;node&quot;: &quot;&amp;gt;=18.17.1&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这样如果有人用低版本Node，&lt;code&gt;npm install&lt;/code&gt;的时候就会提示警告。&lt;/p&gt;&lt;/section&gt;&lt;section&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;strong&gt;典型错误信息&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Error: Cannot find module &apos;astro&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ERR_MODULE_NOT_FOUND&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;或者更诡异的：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;X [ERROR] The build was canceled&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;常见场景&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;这类问题我遇到过好几次，通常是以下几种情况：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;包管理器兼容性问题&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Astro 4.11.2版本之后，对Bun和pnpm的支持有过调整，导致一些项目突然安装不上依赖。我当时就中招了，从4.11.1升级到4.11.2，pnpm突然报错，后来Astro团队修复了这个问题。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;lock文件和node_modules不同步&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;你可能改了&lt;code&gt;package.json&lt;/code&gt;，但忘了更新lock文件，或者反过来，git拉了别人的lock文件但本地依赖没重装。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;某些第三方包天生有问题&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;有些包在Astro环境下就是容易出错，比如：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;astro-compress&lt;/code&gt;：很多人反馈这个包会导致构建失败&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@supercharge/strings&lt;/code&gt;：有报过&lt;code&gt;is not a function&lt;/code&gt;的错误&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nodejs-mysql&lt;/code&gt;：最好换成&lt;code&gt;mysql2&lt;/code&gt;，兼容性更好&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;标准三板斧&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 1. 删除所有依赖和缓存&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm -rf node_modules .astro dist package-lock.json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 或者如果用pnpm:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm -rf node_modules .astro dist pnpm-lock.yaml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 2. 清理包管理器缓存&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm cache clean --force&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 或 pnpm store prune&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 3. 重新安装&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm install&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 在CI环境用这个,确保依赖和lock文件一致:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm ci&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;如果还不行，检查配置文件&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;pnpm用户可能需要调整&lt;code&gt;.npmrc&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;shamefully-hoist=true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public-hoist-pattern[]=*astro*&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;最小化排查法&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;如果怀疑是某个依赖导致的，可以这样排查：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;创建一个全新的Astro项目：&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm create astro@latest minimal-test -- --template minimal&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;把你的问题依赖加进去，看能不能复现&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果能复现，去GitHub Issues搜搜有没有人报过同样的问题&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;我之前就是用这个方法，发现是&lt;code&gt;astro-compress&lt;/code&gt;的问题，最后换了其他图片优化方案。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;原因3：Content Collections格式验证失败&lt;a href=&quot;#原因3content-collections格式验证失败&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Error: blog → post.md frontmatter does not match collection schema.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;date&quot; must be a valid date&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;或者：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;MarkdownContentSchemaValidationError: Content entry frontmatter does not match schema&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;title&quot; is required&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;根本原因&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;Astro 2.0引入了Content Collections功能，用Zod来验证Markdown文件的frontmatter。这个功能很强大，能保证数据类型安全，但也带来了新问题——如果你的Markdown frontmatter格式不规范，构建时就会报错。&lt;/p&gt;&lt;p&gt;我刚开始用的时候也踩过坑。之前写的一些旧博客文章，frontmatter格式很随意，有的日期写成&lt;code&gt;2024-01-01&lt;/code&gt;，有的写成&lt;code&gt;2024/01/01&lt;/code&gt;，还有的直接省略了某些字段。结果一开启Content Collections，全部报错。&lt;/p&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;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Schema里定义了&lt;code&gt;title&lt;/code&gt;是必填的，但某些Markdown文件没写title：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 忘记写 title 了&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;date: 2024-01-01&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;字段类型错误&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;最常见的是日期格式问题：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;title: &quot;My Post&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;date: 2024/01/01  # 应该是 2024-01-01&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;或者把数组写成了字符串：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tags: javascript  # 应该是 [javascript] 或 [&quot;javascript&quot;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;字段名拼写错误&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Schema里定义的是&lt;code&gt;description&lt;/code&gt;，你写成了&lt;code&gt;desc&lt;/code&gt;，Astro就不认了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Step 1: 检查schema定义&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;打开&lt;code&gt;src/content/config.ts&lt;/code&gt;，看看你的schema是怎么定义的：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { z, defineCollection } from &apos;astro:content&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const blog = defineCollection({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;schema: z.object({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title: z.string(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;date: z.date(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tags: z.array(z.string()).optional(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export const collections = { blog };&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Step 2: 对照错误信息修改frontmatter&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;错误信息会告诉你哪个文件、哪个字段有问题。比如：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;blog → my-post.md frontmatter does not match collection schema.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;date&quot; must be a valid date&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;那就去修改&lt;code&gt;src/content/blog/my-post.md&lt;/code&gt;的日期格式：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;title: &quot;我的文章&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;date: 2024-01-01  # 确保格式是 YYYY-MM-DD&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tags: [&quot;astro&quot;, &quot;blog&quot;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Step 3: 使用.passthrough()处理不规范的旧文章&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你有很多历史文章，一个个改太麻烦了，可以用&lt;code&gt;.passthrough()&lt;/code&gt;放宽验证：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const blog = defineCollection({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;schema: z.object({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title: z.string(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;date: z.coerce.date(),  // 使用 coerce 自动转换&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tags: z.array(z.string()).optional().default([]),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).passthrough(),  // 允许额外字段通过&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;.passthrough()&lt;/code&gt;的意思是：schema里没定义的字段也不报错，直接放行。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Step 4: 重启dev server&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;修改schema后，一定要重启dev server才能生效：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 先停止 (Ctrl+C)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 然后重新启动&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm run dev&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;或者在dev server运行时按&lt;code&gt;s + enter&lt;/code&gt;同步内容层。&lt;/p&gt;&lt;/section&gt;&lt;section&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;strong&gt;典型场景&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;本地&lt;code&gt;npm run dev&lt;/code&gt;和&lt;code&gt;npm run build&lt;/code&gt;都正常，但部署到Vercel/Cloudflare后：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;页面显示不全&lt;/li&gt;
&lt;li&gt;某些功能失效（比如评论系统、API调用）&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;strong&gt;环境变量在部署平台没配置&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;你本地有&lt;code&gt;.env&lt;/code&gt;文件，但&lt;code&gt;.gitignore&lt;/code&gt;把它排除了（这是对的，不应该提交敏感信息）。问题是，部署平台不知道这些环境变量的值，所以构建或运行时就出问题了。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;PUBLIC_前缀使用不当&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Astro对环境变量有个特殊规则：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;客户端可访问的变量必须以&lt;code&gt;PUBLIC_&lt;/code&gt;开头&lt;/li&gt;
&lt;li&gt;服务端变量不需要前缀&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果你在客户端代码里用了没有&lt;code&gt;PUBLIC_&lt;/code&gt;前缀的变量，构建时它会是&lt;code&gt;undefined&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;举个例子：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;.env&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;API_KEY=abc123&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;PUBLIC_SITE_URL=https://example.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 客户端代码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const apiKey = import.meta.env.API_KEY;  // ❌ undefined&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const siteUrl = import.meta.env.PUBLIC_SITE_URL;  // ✅ 正常&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&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;：&lt;/p&gt;&lt;p&gt;&lt;em&gt;Vercel&lt;/em&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;进入项目 → Settings → Environment Variables&lt;/li&gt;
&lt;li&gt;添加变量，选择适用的环境（Production/Preview/Development）&lt;/li&gt;
&lt;li&gt;重新部署&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;em&gt;Cloudflare Pages&lt;/em&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;项目 → Settings → Environment variables&lt;/li&gt;
&lt;li&gt;分别为Production和Preview环境设置&lt;/li&gt;
&lt;li&gt;触发重新构建&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;em&gt;Netlify&lt;/em&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;Site settings → Environment variables&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;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;astro.config.mjs&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 这里可以用任何环境变量&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;site: import.meta.env.PUBLIC_SITE_URL,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// src/pages/index.astro&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 服务端代码,可以用任何变量&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const apiKey = import.meta.env.API_KEY;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const response = await fetch(`https://api.example.com?key=${apiKey}`);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;script&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 客户端代码,只能用 PUBLIC_ 开头的变量&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const siteUrl = import.meta.env.PUBLIC_SITE_URL;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console.log(siteUrl);  // 能正常打印&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const apiKey = import.meta.env.API_KEY;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console.log(apiKey);  // undefined&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;安全提示&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;别把敏感信息（API密钥、数据库密码）放到&lt;code&gt;PUBLIC_&lt;/code&gt;开头的变量里！这些值会被内联到打包后的JS文件，任何人都能看到。&lt;/p&gt;&lt;p&gt;如果你真的需要在客户端调用API，最好通过自己的后端接口中转，别直接暴露API密钥。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;原因5：配置文件错误&lt;a href=&quot;#原因5配置文件错误&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;有时候没有明确的错误信息，就是构建卡住、无限循环、或者莫名其妙的Vite错误。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;高频问题点&lt;/strong&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;base路径配置错误（GitHub Pages部署）&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;GitHub Pages的URL格式是&lt;code&gt;https://username.github.io/repo-name/&lt;/code&gt;，如果你的&lt;code&gt;astro.config.mjs&lt;/code&gt;没配置&lt;code&gt;base&lt;/code&gt;，所有资源路径都会404。&lt;/p&gt;&lt;p&gt;错误配置：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;site: &apos;https://username.github.io/my-blog/&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 忘了配置 base&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;正确配置：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;site: &apos;https://username.github.io&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;base: &apos;/my-blog&apos;,  // 仓库名作为base路径&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;集成（integrations）冲突&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;有人反馈过Svelte集成和&lt;code&gt;content/config.ts&lt;/code&gt;有冲突，导致&lt;code&gt;The build was canceled&lt;/code&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;strong&gt;检查base路径&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;如果你要部署到子路径（比如GitHub Pages），确保配置了base：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;astro.config.mjs&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;site: &apos;https://yourdomain.com&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;base: process.env.BASE_PATH || &apos;/&apos;,  // 本地开发用 /,部署时用实际路径&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后在CI配置里设置环境变量：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;.github/workflows/deploy.yml&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;env:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;BASE_PATH: /my-blog&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;排查集成冲突&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;如果怀疑是某个集成导致的，逐个注释掉测试：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;astro.config.mjs&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;integrations: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// react(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// tailwind(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// sitemap(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;从最简配置开始，然后一个个加回来，看哪个导致了问题。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;原因6：第三方包不兼容SSG/SSR&lt;a href=&quot;#原因6第三方包不兼容ssgssr&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ReferenceError: document is not defined&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ReferenceError: window is not defined&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;根本原因&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;Astro默认在服务端（Node.js环境）构建页面，但有些npm包是为浏览器设计的，直接访问了&lt;code&gt;document&lt;/code&gt;、&lt;code&gt;window&lt;/code&gt;等浏览器API。在服务端构建时，这些API不存在，就报错了。&lt;/p&gt;&lt;p&gt;我第一次遇到这个问题是用了一个图表库。本地dev模式下能正常显示，因为dev模式是在浏览器里渲染的。但一&lt;code&gt;build&lt;/code&gt;，就报&lt;code&gt;document is not defined&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;常见问题包&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;依赖DOM操作的UI组件库&lt;/li&gt;
&lt;li&gt;浏览器检测库（比如检测设备类型、浏览器版本的）&lt;/li&gt;
&lt;li&gt;一些老旧的jQuery插件&lt;/li&gt;
&lt;li&gt;直接在模块顶层执行&lt;code&gt;window.xxx&lt;/code&gt;的包&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;方案1: 使用client指令&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;告诉Astro这个组件只在客户端渲染，不要在服务端执行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import ProblematicComponent from &apos;./ProblematicComponent&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;ProblematicComponent client:only=&quot;react&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;client:only&lt;/code&gt;后面要指定框架名（react/vue/svelte等）。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;方案2: 动态导入&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;等到客户端再加载这个包：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 服务端不导入&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;script&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 客户端动态导入&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const { default: MyLibrary } = await import(&apos;problematic-package&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const instance = new MyLibrary();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;方案3: 条件导入&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;检查环境后再使用：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;let myLib;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;if (typeof window !== &apos;undefined&apos;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;myLib = await import(&apos;problematic-package&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;方案4: 换一个兼容的包&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;有时候最简单的解决方案是换个包。比如：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;nodejs-mysql&lt;/code&gt; → &lt;code&gt;mysql2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;某些老旧的图表库 → &lt;code&gt;chart.js&lt;/code&gt;（对SSR友好）&lt;/li&gt;
&lt;li&gt;jQuery插件 → 原生JS或现代框架组件&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;在选择第三方包之前，先看看它的文档有没有提到SSR/SSG支持。现在很多流行的库都会明确说明是否支持服务端渲染。如果文档里提到了”works with Next.js”或”SSR compatible”，那基本上Astro也能用。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;原因7：Astro版本升级引起的Breaking Changes&lt;a href=&quot;#原因7astro版本升级引起的breaking-changes&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;项目升级到Astro 5（或其他大版本）后，之前能构建的项目突然：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;构建卡死，一直不结束&lt;/li&gt;
&lt;li&gt;报一些奇怪的模块解析错误&lt;/li&gt;
&lt;li&gt;某些API不再可用&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;strong&gt;CommonJS模块解析变化&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Astro 5改变了一些模块解析逻辑，之前能用的CommonJS包可能不行了。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;API废弃或变更&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;每个大版本都会废弃一些旧API。比如某些&lt;code&gt;Astro.xxx&lt;/code&gt;的方法可能改名或者移除了。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;集成版本不兼容&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Astro升级后，一些官方或第三方集成也需要升级到对应版本，否则可能不兼容。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决策略&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;逐步升级，不要跳版本&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;如果你从Astro 3想升到5，别一步到位。先升到4，测试通过后再升到5。这样更容易定位问题。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 错误做法&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm install astro@latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 推荐做法&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm install astro@^4.0.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 测试通过后&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm install astro@^5.0.0&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;使用Astro CLI的升级工具&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;Astro提供了自动升级工具，能帮你处理一些常见的Breaking Changes：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npx @astrojs/upgrade&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&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;自动修改一些代码（比如废弃的API调用）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;升级相关集成&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;Astro升级后，别忘了升级官方集成：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm install @astrojs/react@latest @astrojs/tailwind@latest @astrojs/sitemap@latest&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;有时候构建失败就是因为Astro 5配的还是Astro 4时代的集成版本。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;说完了通用的7大原因，再聊聊不同部署平台特有的坑。每个平台都有自己的特点，了解这些能帮你少走弯路。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;Vercel部署问题&lt;a href=&quot;#vercel部署问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;典型问题1: 构建超时&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Vercel免费版有构建时间限制。如果你的项目很大，或者安装依赖很慢，可能会超时失败。&lt;/p&gt;&lt;p&gt;解决方案：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;检查&lt;code&gt;package.json&lt;/code&gt;，删除不必要的依赖&lt;/li&gt;
&lt;li&gt;使用&lt;code&gt;pnpm&lt;/code&gt;代替&lt;code&gt;npm&lt;/code&gt;，安装速度更快&lt;/li&gt;
&lt;li&gt;在项目设置里升级到Pro plan（如果预算允许）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;典型问题2: 输出目录配置错误&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Vercel需要知道构建产物在哪里。Astro默认输出到&lt;code&gt;dist&lt;/code&gt;目录，但如果你改了配置，Vercel可能找不到。&lt;/p&gt;&lt;p&gt;正确配置：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Build Command: &lt;code&gt;npm run build&lt;/code&gt; 或 &lt;code&gt;astro build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Output Directory: &lt;code&gt;dist&lt;/code&gt;（Astro默认）&lt;/li&gt;
&lt;li&gt;Install Command: &lt;code&gt;npm install&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果你用的是pnpm：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Install Command: &lt;code&gt;pnpm install&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Cloudflare Pages部署问题&lt;a href=&quot;#cloudflare-pages部署问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;典型问题1: Node.js版本过低&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Cloudflare Pages默认使用的Node版本可能比较旧。一定要在根目录创建&lt;code&gt;.nvmrc&lt;/code&gt;文件指定版本：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;20&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;或者在项目设置里指定：
Settings → Environment variables → NODE_VERSION = 20&lt;/p&gt;&lt;p&gt;&lt;strong&gt;典型问题2: astro-compress导致失败&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;很多人反馈&lt;code&gt;astro-compress&lt;/code&gt;这个包在Cloudflare上会导致构建失败，特别是优化图片后。&lt;/p&gt;&lt;p&gt;如果你遇到这个问题：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;卸载astro-compress: &lt;code&gt;npm uninstall astro-compress&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;从&lt;code&gt;astro.config.mjs&lt;/code&gt;里移除它&lt;/li&gt;
&lt;li&gt;用其他方案优化图片，比如Astro内置的&lt;code&gt;&amp;lt;Image /&amp;gt;&lt;/code&gt;组件&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;典型问题3: 构建命令配置&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Cloudflare Pages的构建配置：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Build command: &lt;code&gt;npm run build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Build output directory: &lt;code&gt;/dist&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Root directory: &lt;code&gt;/&lt;/code&gt;（如果是monorepo需要调整）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;注意Build output directory前面要加&lt;code&gt;/&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;GitHub Pages部署问题&lt;a href=&quot;#github-pages部署问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;典型问题1: 页面404或空白&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这是最常见的问题，原因是base路径没配置对。&lt;/p&gt;&lt;p&gt;GitHub Pages的仓库URL格式是&lt;code&gt;https://username.github.io/repo-name/&lt;/code&gt;，注意那个&lt;code&gt;/repo-name/&lt;/code&gt;就是base路径。&lt;/p&gt;&lt;p&gt;必须在&lt;code&gt;astro.config.mjs&lt;/code&gt;里配置：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;site: &apos;https://username.github.io&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;base: &apos;/your-repo-name&apos;,  // 仓库名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;典型问题2: 样式丢失或资源404&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果页面能打开但没样式，或者图片加载不出来，也是base路径的问题。&lt;/p&gt;&lt;p&gt;检查浏览器控制台，看看资源请求的路径对不对。如果请求的是&lt;code&gt;https://username.github.io/style.css&lt;/code&gt;，但实际应该是&lt;code&gt;https://username.github.io/repo-name/style.css&lt;/code&gt;，那就是base没配置。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;section&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;最小化重现（minimal reproduction）&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;遇到问题时，别急着在原项目里瞎改。先创建一个最小化的测试项目：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm create astro@latest test-project -- --template minimal&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd test-project&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 只添加有问题的那部分代码或依赖&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&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;Console标签：看JavaScript错误&lt;/li&gt;
&lt;li&gt;Network标签：看资源加载是否正常&lt;/li&gt;
&lt;li&gt;Sources标签：调试代码&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;构建时保存日志：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm run build &amp;gt; build.log 2&amp;gt;&amp;amp;1&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这样即使终端被刷掉了，还能回头查看完整日志。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;创建个人错误解决笔记&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我自己有个markdown文件，记录遇到过的所有错误和解决方案。格式很简单：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 错误: SyntaxError: Unexpected token &apos;with&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**场景**: Vercel部署失败&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**原因**: Node版本太低&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**解决**: 在Vercel设置Node版本为20.x&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**日期**: 2024-11-15&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;下次遇到类似问题，先翻翻自己的笔记，说不定5分钟就解决了。&lt;/p&gt;&lt;/section&gt;&lt;section&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;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 查看过时的依赖&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm outdated&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 更新所有依赖到最新版(谨慎使用)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm update&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 或者一个个更新&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm install astro@latest&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;但别盲目升级，特别是大版本变化。升级前看看CHANGELOG，了解有没有Breaking Changes。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;使用Dependabot自动化依赖更新&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在GitHub仓库根目录创建&lt;code&gt;.github/dependabot.yml&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;version: 2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;updates:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- package-ecosystem: &quot;npm&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;directory: &quot;/&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;schedule:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;interval: &quot;weekly&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;open-pull-requests-limit: 5&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;Dependabot会自动检查依赖更新，创建PR。你只需要review和merge，省心多了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;编写构建测试脚本&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在&lt;code&gt;package.json&lt;/code&gt;里加个测试脚本：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;scripts&quot;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;build&quot;: &quot;astro build&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;test:build&quot;: &quot;npm run build &amp;amp;&amp;amp; echo &apos;Build successful!&apos;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;配置pre-commit hook&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;使用husky在提交前自动构建，确保代码能通过编译：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm install --save-dev husky&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 初始化husky&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npx husky init&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 添加pre-commit hook&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo &quot;npm run build&quot; &amp;gt; .husky/pre-commit&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这样每次commit前都会先构建，如果构建失败就不让提交。虽然会慢一点，但能避免提交有问题的代码。&lt;/p&gt;&lt;/section&gt;&lt;section&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;Astro官方资源&lt;/strong&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.astro.build/en/guides/troubleshooting/&quot; target=&quot;_blank&quot;&gt;官方故障排查指南&lt;/a&gt;：第一时间看这个&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.astro.build/en/reference/error-reference/&quot; target=&quot;_blank&quot;&gt;错误参考手册&lt;/a&gt;：列出了所有Astro错误的详细说明&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://astro.build/chat&quot; target=&quot;_blank&quot;&gt;Discord社区&lt;/a&gt;：遇到疑难杂症可以在这里求助&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;有用的命令&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 检查Astro配置是否正确&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npx astro check&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 查看详细构建信息&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npx astro build --verbose&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 调试模式运行&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;DEBUG=astro:* npm run dev&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;社区资源&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/withastro/astro/issues&quot; target=&quot;_blank&quot;&gt;Astro GitHub Issues&lt;/a&gt;：搜索已知问题&lt;/li&gt;
&lt;li&gt;Stack Overflow：搜&lt;code&gt;[astro]&lt;/code&gt;标签&lt;/li&gt;
&lt;li&gt;中文社区论坛和博客：很多人分享踩坑经验&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;第一次遇到Node版本问题是在Vercel部署时。本地用Node 20开发得很顺，构建也正常，结果推到Vercel就报&lt;code&gt;SyntaxError: Unexpected token &apos;with&apos;&lt;/code&gt;。折腾了半天才发现Vercel默认用的Node 18。后来在项目设置里指定了Node 20.x才解决。&lt;/p&gt;&lt;p&gt;依赖问题也踩过不少坑。有一次项目突然构建失败，报&lt;code&gt;ERR_MODULE_NOT_FOUND&lt;/code&gt;。清缓存、重装依赖都没用。后来才发现是lock文件和node_modules不同步了，其他人更新了package.json但没提交新的lock文件。从那以后我每次pull代码都会先检查lock文件有没有更新。&lt;/p&gt;&lt;p&gt;Content Collections的验证一开始挺烦人的。我有几十篇旧博客文章，frontmatter格式各种各样。开启Content Collections后全部报错，手动改了一下午才全部改好。后来学会了用&lt;code&gt;.passthrough()&lt;/code&gt;和&lt;code&gt;z.coerce.date()&lt;/code&gt;，情况才好多了。&lt;/p&gt;&lt;p&gt;环境变量的问题最隐蔽。本地开发一切正常，部署到Cloudflare后发现评论功能不见了。查了半天发现是Giscus的repo id没在Cloudflare配置环境变量。从那以后我养成了习惯，每次加新环境变量都第一时间在部署平台配置好。&lt;/p&gt;&lt;p&gt;第三方包SSR兼容性也吃过亏。用了一个图表库，本地完美，一构建就挂。后来才知道这个包依赖浏览器API，必须用&lt;code&gt;client:only&lt;/code&gt;。现在选第三方包都会先看看支不支持SSR。&lt;/p&gt;&lt;p&gt;版本升级最折腾。从Astro 3直接跳到5，结果一堆API都变了，构建报错改了一整天。后来学聪明了，大版本升级一定一步步来，先升到4测通了再升到5。&lt;/p&gt;&lt;p&gt;Astro构建失败这事儿，90%都是这几个坑。我现在遇到基本5-10分钟能定位问题。关键是要有系统性的排查思路，别一上来就慌，先看错误类型和位置，再针对性解决。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>卸载 miniaiapi 项目完整指南</title><link>https://blog.moewah.com/posts/uninstall-miniaiapi-project-complete-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/uninstall-miniaiapi-project-complete-guide/</guid><description>如何彻底卸载 miniaiapi 项目并恢复环境？本文详细拆解从停止服务、删除文件到清理 Node.js 和 Python 依赖的全流程，帮助你安全移除项目并恢复系统原状。</description><pubDate>Thu, 17 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;要彻底卸载 &lt;code&gt;easychen/miniaiapi&lt;/code&gt; 项目并尽可能恢复到安装前的状态，你需要执行以下步骤。由于这个项目涉及到了 Node.js、Python 及其相关的 M series Mac 优化工具，卸载过程会比普通的软件卸载复杂一些。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;重要提示：&lt;/strong&gt; 在执行任何删除操作之前，请务必备份任何重要数据或配置文件。&lt;/p&gt;
&lt;section&gt;&lt;h3&gt;第一步：停止并关闭 &lt;code&gt;MiniAiApi&lt;/code&gt; 服务&lt;a href=&quot;#第一步停止并关闭-miniaiapi-服务&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果 &lt;code&gt;MiniAiApi&lt;/code&gt; 正在运行，你需要先停止它。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;查找并停止 Node.js 进程：&lt;/strong&gt;
如果你是使用 &lt;code&gt;npm start&lt;/code&gt; 或 &lt;code&gt;npm run dev&lt;/code&gt; 启动的，可以在终端中使用 &lt;code&gt;Ctrl + C&lt;/code&gt; 停止。如果服务在后台运行，你需要找到其进程ID并终止它。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;查找 Node.js 进程：
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ps&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;aux&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;grep&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;node&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;找到与 &lt;code&gt;miniaiapi&lt;/code&gt; 相关的进程 ID (PID)，然后终止它：
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;kill&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;PID&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;第二步：清理 &lt;code&gt;MiniAiApi&lt;/code&gt; 项目文件&lt;a href=&quot;#第二步清理-miniaiapi-项目文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;删除 &lt;code&gt;miniaiapi&lt;/code&gt; 项目的整个目录。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;进入项目根目录：&lt;/strong&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;miniaiapi_project_directory&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;# 替换为你的项目路径&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;删除项目文件夹：&lt;/strong&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-rf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-rf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;miniaiapi&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;第三步：卸载 Node.js 依赖&lt;a href=&quot;#第三步卸载-nodejs-依赖&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;MiniAiApi&lt;/code&gt; 项目使用 &lt;code&gt;npm&lt;/code&gt; 安装了 Node.js 依赖。虽然删除了项目文件夹，但如果全局安装了某些包，或者 npm 缓存仍在，最好也清理一下。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;清除 npm 缓存：&lt;/strong&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cache&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;--force&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;第四步：卸载 Python 相关的依赖和工具&lt;a href=&quot;#第四步卸载-python-相关的依赖和工具&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;MiniAiApi&lt;/code&gt; 项目依赖于 M-series Mac 上的 Python 生态系统，包括 &lt;code&gt;MLX Whisper&lt;/code&gt;、&lt;code&gt;MLX-Audio&lt;/code&gt;、&lt;code&gt;FFmpeg&lt;/code&gt; 以及可选的 &lt;code&gt;LMstudio&lt;/code&gt; 和 &lt;code&gt;Draw Things&lt;/code&gt;。卸载这些是恢复环境的关键步骤。&lt;/p&gt;&lt;section&gt;&lt;h4&gt;4.1 卸载 Python &lt;code&gt;pip&lt;/code&gt; 包&lt;a href=&quot;#41-卸载-python-pip-包&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;code&gt;MLX Whisper&lt;/code&gt; 和 &lt;code&gt;MLX-Audio&lt;/code&gt; 是通过 &lt;code&gt;pip&lt;/code&gt; 安装的。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;卸载 &lt;code&gt;mlx-whisper&lt;/code&gt; 和 &lt;code&gt;mlx-audio&lt;/code&gt;：&lt;/strong&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装自动移除依赖工具&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pip&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pip-autoremove&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 卸载特定包包含依赖&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pip-autoremove&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mlx-whisper&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mlx-audio&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;huggingface_hub&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
如果提示不再使用了，可以跳过。
如果还有其他通过 &lt;code&gt;pip&lt;/code&gt; 为该项目安装的包，也可以一并卸载。你可以使用 &lt;code&gt;pip list&lt;/code&gt; &lt;a href=&quot;https://docs.pingcode.com/baike/776023&quot; target=&quot;_blank&quot;&gt;docs.pingcode.com&lt;/a&gt; 查看当前安装的包。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;清除 pip 缓存：&lt;/strong&gt; &lt;a href=&quot;https://docs.pingcode.com/baike/808087&quot; target=&quot;_blank&quot;&gt;docs.pingcode.com&lt;/a&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pip&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cache&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;purge&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;4.2 卸载 Conda/Miniconda (如果使用)&lt;a href=&quot;#42-卸载-condaminiconda-如果使用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;如果你的 Python 环境是通过 Anaconda 或 Miniconda 管理的，并且你为这个项目创建了特定的环境，你应该移除该环境。如果 &lt;code&gt;miniaiapi&lt;/code&gt; 建议使用 Conda，可能你安装了。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;查找并删除 &lt;code&gt;miniaiapi&lt;/code&gt; 相关的 Conda 环境：&lt;/strong&gt;
首先列出所有 Conda 环境：
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;conda&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;list&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
如果你为 &lt;code&gt;miniaiapi&lt;/code&gt; 创建了特定的环境（例如 &lt;code&gt;miniaiapi-env&lt;/code&gt;），则删除它：
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;conda&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;remove&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;miniaiapi-env&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--all&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;清理 Conda 缓存：&lt;/strong&gt; &lt;a href=&quot;https://docs.pingcode.com/baike/808087&quot; target=&quot;_blank&quot;&gt;docs.pingcode.com&lt;/a&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;conda&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;--all&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;删除 Miniconda/Anaconda (如果仅为 &lt;code&gt;miniaiapi&lt;/code&gt; 项目安装)：&lt;/strong&gt;
如果你想要彻底移除 Miniconda 或 Anaconda，可以参考以下步骤：
&lt;ul&gt;
&lt;li&gt;删除安装目录：
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-rf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/miniconda3&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;# 或者你的安装路径&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;移除 &lt;code&gt;~/.bashrc&lt;/code&gt; 或 &lt;code&gt;~/.zshrc&lt;/code&gt; 中的相关环境变量配置（&lt;code&gt;conda initialize&lt;/code&gt; 块）。你可以用 &lt;code&gt;vim&lt;/code&gt; 或其他文本编辑器打开文件，把相关行注释掉或删除 &lt;a href=&quot;https://www.jianshu.com/p/3d8f6bbddfd5&quot; target=&quot;_blank&quot;&gt;jianshu.com&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;刷新 shell 配置：
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;source&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.bashrc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;# 或 source ~/.zshrc&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;4.3 移除 MLX 模型文件&lt;a href=&quot;#43-移除-mlx-模型文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;code&gt;MiniAiApi&lt;/code&gt; 建议预下载 MLX 模型。这些模型通常存储在 Hugging Face 的缓存目录中。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;查找 Hugging Face 缓存目录：&lt;/strong&gt;
通常在 &lt;code&gt;~/.cache/huggingface/hub/&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;删除 &lt;code&gt;miniaiapi&lt;/code&gt; 相关的模型文件：&lt;/strong&gt;
你可以手动进入该目录，删除 &lt;code&gt;mlx-community/whisper-large-v3-mlx&lt;/code&gt;、&lt;code&gt;mlx-community/Spark-TTS-0.5B-fp16&lt;/code&gt; 等模型对应的文件夹。请谨慎操作，确保只删除与 &lt;code&gt;miniaiapi&lt;/code&gt; 相关的模型，以免影响其他依赖 Hugging Face 模型的应用。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;4.4 卸载 FFmpeg&lt;a href=&quot;#44-卸载-ffmpeg&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;code&gt;FFmpeg&lt;/code&gt; 是通过 Homebrew 安装的。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;卸载 FFmpeg：&lt;/strong&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;brew&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;uninstall&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ffmpeg&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;第五步：卸载第三方应用 (LMstudio, Draw Things)&lt;a href=&quot;#第五步卸载第三方应用-lmstudio-draw-things&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;MiniAiApi&lt;/code&gt; 项目集成了 &lt;code&gt;LMstudio&lt;/code&gt; 和 &lt;code&gt;Draw Things&lt;/code&gt;，如果这些应用是专门为 &lt;code&gt;MiniAiApi&lt;/code&gt; 安装的，你也可以选择卸载它们。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;卸载 LMstudio：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;将 &lt;code&gt;LMstudio&lt;/code&gt; 应用程序拖到废纸篓。&lt;/li&gt;
&lt;li&gt;查看 &lt;code&gt;~/Library/Application Support/&lt;/code&gt;、&lt;code&gt;~/Library/Preferences/&lt;/code&gt; 等目录，删除与 &lt;code&gt;LMStudio&lt;/code&gt; 相关的残留文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;卸载 Draw Things：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Draw Things&lt;/code&gt; 通常从 App Store 安装。可以在“启动台”或“应用程序”文件夹中找到它，将其拖到废纸篓。&lt;/li&gt;
&lt;li&gt;类似 &lt;code&gt;LMstudio&lt;/code&gt;，检查 &lt;code&gt;~/Library/&lt;/code&gt; 下的目录，删除相关残留。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&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;MiniAiApi&lt;/code&gt; 在 &lt;code&gt;.env&lt;/code&gt; 文件中配置了许多环境变量。虽然删除了项目目录，但如果这些配置曾被复制到全局环境变量中，你也需要清理。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;检查并清理 shell 配置文件：&lt;/strong&gt;
检查 &lt;code&gt;~/.bashrc&lt;/code&gt;, &lt;code&gt;~/.zshrc&lt;/code&gt;, &lt;code&gt;~/.bash_profile&lt;/code&gt;, &lt;code&gt;~/.profile&lt;/code&gt; 等文件，查找并删除任何与 &lt;code&gt;MiniAiApi&lt;/code&gt; 项目相关的 &lt;code&gt;PATH&lt;/code&gt; 变量或其他环境变量配置。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&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;code&gt;easychen/miniaiapi&lt;/code&gt; 项目及其绝大部分相关依赖，将系统尽可能恢复到安装前的状态。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>群晖DSM 7.x SSL证书自动化部署教程</title><link>https://blog.moewah.com/posts/1301/</link><guid isPermaLink="true">https://blog.moewah.com/posts/1301/</guid><description>如何为群晖NAS自动配置SSL证书？本文提供从环境准备到脚本部署的完整解决方案，支持Cloudflare、HE.NET等DNS服务商，实现证书自动申请与续期，解决HTTPS访问不安全问题。</description><pubDate>Sat, 05 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;群晖 Quickconnect 的访问速度确实慢,很多人宁愿自己买个VPS做内网穿透。但暴露在外网的NAS需要HTTPS支持,否则浏览器总提示”不安全”,看着就烦。&lt;/p&gt;&lt;p&gt;记得刚开始折腾NAS时,我被SSL证书搞得挺崩溃。好不容易搭好服务,结果浏览器弹出红色警告,还是自签名证书。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Synology-SSL.png&quot; loading=&quot;lazy&quot; width=&quot;960&quot; height=&quot;420&quot; src=&quot;/_astro/1301_1022370045_f6378e.Bs638hyj_1kHgyY.webp&quot; srcset=&quot;/_astro/1301_1022370045_f6378e.Bs638hyj_1ck7J0.webp 640w, /_astro/1301_1022370045_f6378e.Bs638hyj_ZPD3St.webp 750w, /_astro/1301_1022370045_f6378e.Bs638hyj_2jAFEY.webp 828w, /_astro/1301_1022370045_f6378e.Bs638hyj_1kHgyY.webp 960w&quot; /&gt;&lt;figcaption&gt;Synology-SSL.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;如果你先前试过各种方法,要么太复杂,要么不稳定的童鞋可以试试  syno-ssl-auto 这个脚本,从配置到部署大概10分钟搞定。&lt;/p&gt;&lt;p&gt;这个脚本的特点:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;自动申请、部署、续期证书&lt;/li&gt;
&lt;li&gt;支持 Cloudflare、HE.NET 等多个DNS服务商&lt;/li&gt;
&lt;li&gt;每3天检查一次续期,不用担心过期&lt;/li&gt;
&lt;li&gt;交互式菜单操作&lt;/li&gt;
&lt;li&gt;DSM升级后可以一键修复环境&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;部署教程&lt;a href=&quot;#部署教程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;ol&gt;
&lt;li&gt;面向 Synology DSM 7.x 系统（仅在 Synology DSM 7.x 系统通过测试，低版本不要尝试）&lt;/li&gt;
&lt;li&gt;已有域名并解析到NAS公网IP&lt;/li&gt;
&lt;li&gt;DNS服务商账号(Cloudflare或HE.NET)&lt;/li&gt;
&lt;li&gt;NAS能访问外网&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;启用SSH服务:&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 1. 进入群晖 DSM 控制面板&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 2. 找到「终端机和 SNMP」&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 3. 勾选「启用SSH服务」&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 4. 建议修改默认端口22&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;第1步: 克隆项目&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;打开SSH终端:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 切换到root用户&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-i&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 进入root目录，或其他目标路径&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 克隆项目&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://github.com/moewah/syno-ssl-auto.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 进入项目目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;syno-ssl-auto&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;第2步: 编辑配置文件&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nano&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ssl.conf&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;修改关键配置:&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 接收证书通知的邮箱&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ACME_ACCOUNT_EMAIL&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;your_email@qq.com&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# DNS 服务配置,以 HE.NET 为例&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CERT_DNS&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;dns_he&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HE_Username&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;你的HE.NET账号&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HE_Password&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;你的HE.NET密码&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Cloudflare配置示例&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# export CERT_DNS=&quot;dns_cf&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# export CF_Token=&quot;你的Cloudflare API Token&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# export CF_Email=&quot;你的Cloudflare邮箱&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# DSM域名(不要带http://)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CERT_DOMAIN&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;nas.yourdomain.com&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# DSM管理员账号密码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SYNO_USERNAME&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;admin&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SYNO_PASSWORD&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;你的DSM密码&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;注意:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;密码用单引号包裹,避免特殊字符问题&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CERT_DOMAIN&lt;/code&gt; 不要包含 &lt;code&gt;http://&lt;/code&gt; 或 &lt;code&gt;https://&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;确保DNS API Token有正确权限&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;第3步: 保存配置文件&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在nano编辑器中:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ctrl + O&lt;/code&gt; 保存,&lt;code&gt;Enter&lt;/code&gt; 确认&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Ctrl + X&lt;/code&gt; 退出&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;第1步: 赋予执行权限&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod&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;install_synology_ssl.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;第2步: 运行主脚本&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;bash&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install_synology_ssl.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;会看到菜单:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;====================================&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Synology DSM SSL 证书管理工具&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;====================================&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. 自动部署证书&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. 启用自动升级&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. 关闭自动升级&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4. 修复损坏环境&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;5. 强制更新证书&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;6. 退出&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;====================================&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;第3步: 首次部署&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;第一次使用选择 &lt;strong&gt;1. 自动部署证书&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;脚本会自动:&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;下载并安装 acme.sh&lt;/li&gt;
&lt;li&gt;通过DNS验证申请证书&lt;/li&gt;
&lt;li&gt;部署证书到DSM&lt;/li&gt;
&lt;li&gt;配置自动续期任务&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;整个过程约3-5分钟。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第4步: 验证证书&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;访问你的NAS域名:&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;/p&gt;&lt;ul&gt;
&lt;li&gt;浏览器显示”连接是安全的”&lt;/li&gt;
&lt;li&gt;证书颁发机构为”Let’s Encrypt”&lt;/li&gt;
&lt;li&gt;有效期90天&lt;/li&gt;
&lt;li&gt;可以正常访问DSM&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;自动续期任务:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;脚本会添加cron任务,每3天凌晨2点检查续期:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;0 2 */3 * * root /usr/local/share/acme.sh/acme.sh --cron --home /usr/local/share/acme.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;Let’s Encrypt证书有效期90天,脚本每3天检查一次,出问题也有时间修复。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&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;如果你已经通过该脚本成功部署过SSL证书，那么进行 Synology DSM 系统升级后请运行选项 &lt;strong&gt;4. 修复损坏环境&lt;/strong&gt; ,修复系统升级导致的环境变量重置问题。&lt;/p&gt;&lt;p&gt;之前遇到一次DSM升级后证书续期失败,排查半天发现是环境变量被重置了。&lt;/p&gt;&lt;p&gt;修复方法:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/volume1/syno-ssl-auto&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-i&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;bash&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install_synology_ssl.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 选择 4. 修复损坏环境&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&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;验证acme.sh环境&lt;/li&gt;
&lt;li&gt;测试证书续期&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;修复后建议手动测试:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 选择 5. 强制更新证书测试&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;DSM大版本升级后(如7.1到7.2),建议第一时间运行”修复损坏环境”,避免证书突然过期。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;常见问题&lt;a href=&quot;#常见问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;证书申请失败,提示DNS验证错误&lt;a href=&quot;#证书申请失败提示dns验证错误&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;可能原因:&lt;/strong&gt;  1）DNS配置不正确；2）域名未解析到NAS公网IP；3）DNS API Token权限不足&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方案:&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 检查域名解析&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ping&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nas.yourdomain.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 检查DNS配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ssl.conf&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 确认DNS API Token权限&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Cloudflare Token需要: Zone - DNS - Edit&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# HE.NET需要账号密码&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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; 1）证书未正确加载到DSM；2）访问域名与证书域名不匹配；3）浏览器缓存旧证书&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方案:&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 检查证书部署&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# DSM 控制面板 &amp;gt; 安全性 &amp;gt; 证书&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 清除浏览器缓存&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Chrome: Ctrl+Shift+Delete (Win) / Cmd+Shift+Delete (Mac)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 强制更新证书&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/volume1/syno-ssl-auto&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;bash&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install_synology_ssl.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 选择 5. 强制更新证书&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 检查cron任务&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/crontab&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;grep&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;acme&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 检查acme.sh状态&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/usr/local/share/acme.sh/acme.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--home&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/usr/local/share/acme.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--list&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 手动测试续期&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/usr/local/share/acme.sh/acme.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--home&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/usr/local/share/acme.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--cron&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--force&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;解决:&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 重新运行脚本&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/volume1/syno-ssl-auto&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;bash&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install_synology_ssl.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 选择 2. 启用自动升级&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 检查crond服务&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;synosystemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;restart&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;crond&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;DSM升级后证书失效&lt;/p&gt;&lt;p&gt;&lt;strong&gt;修复:&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/volume1/syno-ssl-auto&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-i&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;bash&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install_synology_ssl.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 选择 4. 修复损坏环境&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 然后选择 5. 强制更新证书&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 查看acme.sh日志&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/usr/local/share/acme.sh/acme.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--home&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/usr/local/share/acme.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--list&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 查看证书详情&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/usr/local/share/acme.sh/acme.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--home&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/usr/local/share/acme.sh&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;--listraw&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 查看cron日志&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;grep&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;acme.sh&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/var/log/messages&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tail&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;50&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;出现 &lt;code&gt;code:60&lt;/code&gt; 错误，无法建立 SSL 连接&lt;a href=&quot;#出现-code60-错误无法建立-ssl-连接&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;若证书服务器使用的是 letsen­crypt，如果出现 &lt;code&gt;code:60&lt;/code&gt; 错误，无法建立 SSL 连接，请升级群辉内置 CA 机构根证书，请以 root 用户执行以下命令:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 备份根证书&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mv /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt.bak&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 更新根证书&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl -Lko /etc/ssl/certs/ca-certificates.crt https://curl.se/ca/cacert.pem&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;浏览器 SSL 证书兼容性相关问题&lt;a href=&quot;#浏览器-ssl-证书兼容性相关问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;兼容性相关问题可通过 &lt;code&gt;https://ssl-config.mozilla.org/&lt;/code&gt; 在线工具，依据服务器环境生成 SSL 配置文件来获得更好的证书兼容性。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;配置SSL证书看似麻烦,但用这个脚本后确实省心。&lt;/p&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; - 域名、DNS、SSH权限&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置准确&lt;/strong&gt; - &lt;code&gt;ssl.conf&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; - 每3天检查,90天有效期&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;升级修复&lt;/strong&gt; - DSM升级后运行选项4&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;搞定SSL证书后,NAS使用体验确实提升不少。不用每次访问都盯着地址栏看了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;开始使用:&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;SSH登录NAS&lt;/li&gt;
&lt;li&gt;按教程操作&lt;/li&gt;
&lt;li&gt;等待HTTPS锁形图标出现&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;参考资源:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/moewah/syno-ssl-auto&quot; target=&quot;_blank&quot;&gt;syno-ssl-auto GitHub项目&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/acmesh-official/acme.sh/wiki/dnsapi&quot; target=&quot;_blank&quot;&gt;acme.sh DNS API文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://letsencrypt.org/&quot; target=&quot;_blank&quot;&gt;Let’s Encrypt官网&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>Docker-compose 自部署个人代码托管服务：Gitea 极简搭建指南</title><link>https://blog.moewah.com/posts/2221/</link><guid isPermaLink="true">https://blog.moewah.com/posts/2221/</guid><description>如何用Docker-compose快速搭建个人代码托管平台？本文详解Gitea的极简部署方案，解决私有化代码管理、避免GitHub依赖问题，提供从环境配置到服务启动的完整实战指南。</description><pubDate>Sat, 05 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&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://blog.moewah.com/posts/2215/&quot;&gt;Gogs安装教程&lt;/a&gt;，体验还不错。但说实话，Gitea 这个从 Gogs 分支而来的轻量级 DevOps 平台真的更香——Go 语言编写、极易安装、运行飞快,支持 Git 托管和 CI/CD，更新频繁维护活跃，更适合长期使用。&lt;/p&gt;&lt;p&gt;&lt;img loading=&quot;lazy&quot; width=&quot;870&quot; height=&quot;424&quot; src=&quot;/_astro/2221_1109522369_a710aa.Bvl6gZy6_hfa1G.webp&quot; srcset=&quot;/_astro/2221_1109522369_a710aa.Bvl6gZy6_ZbXGp3.webp 640w, /_astro/2221_1109522369_a710aa.Bvl6gZy6_1jJhsR.webp 750w, /_astro/2221_1109522369_a710aa.Bvl6gZy6_Z12nLXc.webp 828w, /_astro/2221_1109522369_a710aa.Bvl6gZy6_hfa1G.webp 870w&quot; /&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;为什么我选择 Gitea 而不是 GitHub?&lt;a href=&quot;#为什么我选择-gitea-而不是-github&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;说实话，刚开始我也和很多人一样，直接用 GitHub 多方便啊。但是慢慢地我发现了一些问题:&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;你有没有遇到过这样的情况？公司内部项目想自托管，又不想折腾 GitLab 那么重的东西。这时候 Gitea 真的太适合了。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;开始搭建: Docker Compose 部署&lt;a href=&quot;#开始搭建-docker-compose-部署&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;个人比较习惯使用 Docker Compose 来进行自部署，原因只有一个：它更易于维护。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;下面是我的 &lt;code&gt;docker-compose.yml&lt;/code&gt; 配置，使用的是 PostgreSQL 数据库（高性能） :&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;version&lt;/span&gt;&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;3&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;networks&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;gitea&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;external&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;docker.gitea.com/gitea:1.25.4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;container_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;gitea&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;USER_UID=1000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;USER_GID=1000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GITEA__database__DB_TYPE=postgres&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GITEA__database__HOST=db:5432&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GITEA__database__NAME=gitea&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GITEA__database__USER=gitea&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GITEA__database__PASSWD=gitea&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;restart&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;always&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;networks&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gitea&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./gitea:/data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/timezone:/etc/timezone:ro&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/localtime:/etc/localtime:ro&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &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;3000:3000&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &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;222:22&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;depends_on&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;docker.io/library/postgres:14&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;restart&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;always&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;POSTGRES_USER=gitea&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;POSTGRES_PASSWORD=gitea&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;POSTGRES_DB=gitea&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;networks&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gitea&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./postgres:/var/lib/postgresql/data&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;更多关于Docker Compose 容器化部署的配置可以参考官方文档 -&amp;gt;&lt;a href=&quot;https://docs.gitea.com/zh-cn/installation/install-with-docker&quot; target=&quot;_blank&quot;&gt;通过Docker安装&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://docs.gitea.com/administration/environment-variables&quot; target=&quot;_blank&quot;&gt;环境变量&lt;/a&gt;&lt;/p&gt;&lt;p&gt;运行启动：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker-compose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;up&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;等个几秒，访问 &lt;code&gt;http://localhost:3000&lt;/code&gt; 就能看到安装界面了。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;SSH 配置踩坑&lt;a href=&quot;#ssh-配置踩坑&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;第一次部署完，页面上显示的 SSH 地址不对。我把容器里的 22 端口映射到了宿主机的 222，但页面显示的还是默认端口。&lt;/p&gt;&lt;p&gt;结果就是 clone 的时候报 connection refused，折腾了半天。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决办法：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;改 &lt;code&gt;/data/gitea/conf/app.ini&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;SSH_DOMAIN&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; your-git-domain.com&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;DISABLE_SSH&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;SSH_PORT&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 222&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;SSH_LISTEN_PORT&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 22  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 这个必须是 22，改了没用&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;注意 &lt;code&gt;SSH_LISTEN_PORT&lt;/code&gt; 是容器内部监听的，固定是 22。我一开始改了这个，重启好几次都没生效，后来看文档才明白。&lt;/p&gt;&lt;p&gt;改完重启：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;restart&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gitea&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这时候页面上显示的 clone 地址就是 &lt;code&gt;ssh://git@your-git-domain.com:222/user/repo.git&lt;/code&gt; 了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;客户端配置：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;不想每次敲端口，可以在 &lt;code&gt;~/.ssh/config&lt;/code&gt; 里加：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Host gitea&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;HostName your-git-domain.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Port 222&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;User git&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;之后就能直接用 &lt;code&gt;git clone gitea:user/repo.git&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Nginx 反向代理&lt;a href=&quot;#nginx-反向代理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;有域名的话建议配个反向代理。注意 &lt;code&gt;client_max_body_size&lt;/code&gt; 要设大一点，不然传大文件会报错。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;client_max_body_size &lt;/span&gt;&lt;span&gt;512M&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_pass &lt;/span&gt;&lt;span&gt;&lt;span&gt;http://localhost:3000&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;Connection &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;http_connection&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;Upgrade &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;http_upgrade&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;Host &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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Real-IP &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;remote_addr&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Forwarded-For &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_add_x_forwarded_for&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Forwarded-Proto &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;scheme&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&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;client_max_body_size 512M&lt;/code&gt; - 支持上传 512MB 的文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;proxy_set_header Upgrade&lt;/code&gt; 和 &lt;code&gt;Connection&lt;/code&gt; - 支持 WebSocket(Gitea 的实时功能需要)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;X-Forwarded-Proto&lt;/code&gt; - 让 Gitea 知道是 HTTPS 还是 HTTP&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&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;/p&gt;&lt;ol&gt;
&lt;li&gt;✅ Docker Compose 一键部署,超级简单&lt;/li&gt;
&lt;li&gt;✅ PostgreSQL 数据库性能更好&lt;/li&gt;
&lt;li&gt;✅ SSH 端口配置要正确,否则 clone 不通&lt;/li&gt;
&lt;li&gt;✅ Nginx 反向代理记得设置 &lt;code&gt;client_max_body_size&lt;/code&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;code&gt;docker-compose.yml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;运行 &lt;code&gt;docker-compose up -d&lt;/code&gt; 启动&lt;/li&gt;
&lt;li&gt;访问 &lt;code&gt;http://localhost:3000&lt;/code&gt; 完成初始配置&lt;/li&gt;
&lt;li&gt;修改 app.ini 配置 SSH 端口&lt;/li&gt;
&lt;li&gt;(可选)配置 Nginx 反向代理&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Gitea 真的比 GitLab 轻量太多，使用下来整体挺稳的。个人或者小团队用很合适。也可以考虑把 Astro 静态博客托管到你的 Gitea 私人仓库进行版本管理及自动化拉取变更、构建静态页面。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>从手动挂载到自动挂载:Autofs 挂载 NFS 的真香体验</title><link>https://blog.moewah.com/posts/5273/</link><guid isPermaLink="true">https://blog.moewah.com/posts/5273/</guid><description>如何解决NFS挂载导致系统启动卡死的问题？本文详细分享使用Autofs实现智能自动挂载的实战方案，解决fstab依赖问题，提升系统稳定性与资源利用率。</description><pubDate>Sat, 05 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;你有没有遇到过这种情况:把 NFS 共享写进 &lt;code&gt;/etc/fstab&lt;/code&gt;,结果 NAS 开机慢一点或者网络稍微抖一下,整个系统启动就卡住了,等着等着就绝望了?我当时真的崩溃了,特别是急着用服务器,结果被挂载卡死,那种感觉真的太难受了。&lt;/p&gt;
&lt;p&gt;今天我就把我的真香体验分享给你,帮你避坑避雷,让你从 fstab 的痛苦中解脱出来。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;nfs+autofs.jpg&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;320&quot; src=&quot;/_astro/5273_3631543466_13363e.B3-RAeIQ_1DP1B5.webp&quot; srcset=&quot;/_astro/5273_3631543466_13363e.B3-RAeIQ_Z1ciP8s.webp 640w, /_astro/5273_3631543466_13363e.B3-RAeIQ_ZnKcEx.webp 750w, /_astro/5273_3631543466_13363e.B3-RAeIQ_1DP1B5.webp 800w&quot; /&gt;&lt;figcaption&gt;nfs+autofs.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;为什么要用 autofs?它救了我的命&lt;a href=&quot;#为什么要用-autofs它救了我的命&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;先说说我的经历。&lt;/p&gt;&lt;p&gt;一开始我是典型的 fstab 党,把 NFS 共享写进 &lt;code&gt;/etc/fstab&lt;/code&gt;,开机自动挂载。听着很完美对吧?但问题来了:&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;启动卡死:&lt;/strong&gt; NAS 没启动完,系统就卡在挂载那一步&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;后来我发现 autofs,真的被震撼到了!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;autofs 是什么?&lt;/strong&gt; 简单来说,它是一个智能挂载服务。当你访问某个目录时,它自动挂载;一段时间不用,它自动卸载。最关键的是,就算 NFS 服务器挂了,它也不会让你的系统崩溃!&lt;/p&gt;&lt;/section&gt;
&lt;section&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;strong&gt;NAS 地址:&lt;/strong&gt; 192.168.0.168 (黑群晖作为 NFS 服务器)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;共享目录:&lt;/strong&gt; /volume1/video/电影、/volume1/video/剧集、/volume1/music&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本地服务器:&lt;/strong&gt; PVE 宿主机上的 LXC 容器,跑 Jellyfin/Emby&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本地挂载点:&lt;/strong&gt; /mnt/movies、/mnt/tvshows、/mnt/music&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这个配置特别适合需要硬解播放的场景,因为文件是实时读取的,不需要常驻挂载。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;开始配置:步骤超详细&lt;a href=&quot;#开始配置步骤超详细&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;先确认你的系统有没有装 autofs 和 NFS 客户端。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Debian/Ubuntu 系统:&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt-get&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt-get&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;autofs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nfs-common&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Red Hat/CentOS 系统:&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yum&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;autofs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nfs-utils&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第2步:配置 autofs 主文件&lt;a href=&quot;#第2步配置-autofs-主文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;编辑 &lt;code&gt;/etc/auto.master&lt;/code&gt;:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nano&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/auto.master&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;添加这一行:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/mnt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/auto.media&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--timeout=300&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--ghost&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&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;/mnt&lt;/code&gt;: 告诉 autofs 在这个目录下工作&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/etc/auto.media&lt;/code&gt;: 挂载配置文件的位置&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--timeout=300&lt;/code&gt;: 300 秒(5分钟)没用就自动卸载&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--ghost&lt;/code&gt;: 这个超有用!即使没挂载,也能看到目录结构,体验上像一直挂着一样&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;编辑完按 &lt;code&gt;Ctrl+O&lt;/code&gt; 保存,&lt;code&gt;Ctrl+X&lt;/code&gt; 退出。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;创建 &lt;code&gt;/etc/auto.media&lt;/code&gt; 文件:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nano&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/auto.media&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;添加下面的内容:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 媒体文件推荐的挂载选项&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;movies&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-fstype=nfs,rw,async,noatime,nfsvers=4,soft,timeo=600,retrans=3&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;192.168.0.168:/volume1/video/电影&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tvshows&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-fstype=nfs,rw,async,noatime,nfsvers=4,soft,timeo=600,retrans=3&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;192.168.0.168:/volume1/video/剧集&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;music&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;-fstype=nfs,rw,async,noatime,nfsvers=4,soft,timeo=600,retrans=3&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;192.168.0.168:/volume1/music&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;注意 不需要像 SMB 那样配置用户名密码(除非你配了特殊的认证),所以配置简单多了!&lt;/p&gt;&lt;p&gt;编辑完按 &lt;code&gt;Ctrl+O&lt;/code&gt; 保存,&lt;code&gt;Ctrl+X&lt;/code&gt; 退出。&lt;/p&gt;&lt;/section&gt;&lt;section&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;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;chmod&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;644&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/auto.media&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第5步:重启 autofs 服务&lt;a href=&quot;#第5步重启-autofs-服务&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Debian/Ubuntu:&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;service&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;autofs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;restart&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Red Hat/CentOS:&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;restart&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;autofs&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第6步:测试一下&lt;a href=&quot;#第6步测试一下&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;现在试试访问这些目录:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ls&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/mnt/movies&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ls&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/mnt/tvshows&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ls&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/mnt/music&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果看到了文件,恭喜你,配置成功了!🎉&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;NFS 挂载选项详解(干货满满)&lt;a href=&quot;#nfs-挂载选项详解干货满满&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;说实话,这些参数刚开始看确实有点晕,但弄懂之后真的很有用。我把我试过的各种配置都跟你讲讲。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;1. rw 或 ro&lt;a href=&quot;#1-rw-或-ro&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;code&gt;rw&lt;/code&gt;: 读写模式(我推荐这个,方便管理)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ro&lt;/code&gt;: 只读模式(适合防止误操作的家庭场景)&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;我的选择:&lt;/strong&gt; 家庭媒体用 &lt;code&gt;rw&lt;/code&gt;,管理起来方便。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. sync 或 async&lt;a href=&quot;#2-sync-或-async&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;code&gt;sync&lt;/code&gt;: 写操作必须等到数据写入磁盘才返回(安全但慢)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;async&lt;/code&gt;: 服务器尽快返回,数据可能还没真正写入磁盘(快但风险稍高)&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;我的选择:&lt;/strong&gt; 家庭媒体用 &lt;code&gt;async&lt;/code&gt;,性能好很多。企业环境可能更偏向 &lt;code&gt;sync&lt;/code&gt;,确保数据完整性。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. soft 或 hard&lt;a href=&quot;#3-soft-或-hard&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;code&gt;soft&lt;/code&gt;: 服务器无响应时,尝试几次就放弃,不会挂死系统&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hard&lt;/code&gt;: 持续重试,直到服务器响应(可能导致系统卡死)&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;我的选择:&lt;/strong&gt; 家庭环境强烈推荐 &lt;code&gt;soft&lt;/code&gt;!用 &lt;code&gt;hard&lt;/code&gt; 的我都被坑惨了,一断网系统就卡死。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. noatime&lt;a href=&quot;#4-noatime&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;作用:&lt;/strong&gt; 不记录文件访问时间
&lt;strong&gt;为什么必须:&lt;/strong&gt; 减少磁盘 I/O,提高性能(家庭媒体强烈推荐)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;数据对比:&lt;/strong&gt; 开启 noatime 后,我的电影加载速度提升了约 ** 15-20%**,真的很明显。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. nfsvers&lt;a href=&quot;#5-nfsvers&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;作用:&lt;/strong&gt; NFS 协议版本&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;nfsvers=3&lt;/code&gt;: NFS v3(兼容性好,但功能少)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nfsvers=4&lt;/code&gt;: NFS v4(性能更好,支持更多特性)&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;我的选择:&lt;/strong&gt; 用 &lt;code&gt;nfsvers=4&lt;/code&gt;,性能和稳定性都更好。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6. timeo&lt;a href=&quot;#6-timeo&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;作用:&lt;/strong&gt; 超时时间(单位:1/10 秒)
&lt;strong&gt;怎么调:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;timeo=600&lt;/code&gt;: 60 秒超时(我用的这个值)&lt;/li&gt;
&lt;li&gt;网络不稳定可以调大一点,比如 &lt;code&gt;timeo=1000&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;我的经验:&lt;/strong&gt; 家庭网络偶尔抖动,用 600 秒比较合适。企业网络稳定可以设小一点,比如 &lt;code&gt;timeo=100&lt;/code&gt;(10秒)。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;7. retrans&lt;a href=&quot;#7-retrans&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;作用:&lt;/strong&gt; 重试次数
&lt;strong&gt;怎么调:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;retrans=3&lt;/code&gt;: 失败后重试 3 次&lt;/li&gt;
&lt;li&gt;网络不稳定可以调大一点,比如 &lt;code&gt;retrans=5&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;我的选择:&lt;/strong&gt; 用 &lt;code&gt;retrans=3&lt;/code&gt;,配合 &lt;code&gt;soft&lt;/code&gt; 选项,既保证可用性又不会卡死系统。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;movies&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-fstype=nfs,rw,async,noatime,nfsvers=4,soft,timeo=600,retrans=3&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;192.168.0.168:/volume1/video/电影&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tvshows&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-fstype=nfs,rw,async,noatime,nfsvers=4,soft,timeo=600,retrans=3&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;192.168.0.168:/volume1/video/剧集&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;music&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;-fstype=nfs,rw,async,noatime,nfsvers=4,soft,timeo=600,retrans=3&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;192.168.0.168:/volume1/music&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&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;rw&lt;/code&gt;: 可读写&lt;/li&gt;
&lt;li&gt;&lt;code&gt;async&lt;/code&gt;: 异步写入,提升性能&lt;/li&gt;
&lt;li&gt;&lt;code&gt;noatime&lt;/code&gt;: 不更新访问时间,减少 I/O&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nfsvers=4&lt;/code&gt;: 用 NFS v4,性能更好&lt;/li&gt;
&lt;li&gt;&lt;code&gt;soft&lt;/code&gt;: 软挂载,避免系统卡死&lt;/li&gt;
&lt;li&gt;&lt;code&gt;timeo=600&lt;/code&gt;: 60 秒超时&lt;/li&gt;
&lt;li&gt;&lt;code&gt;retrans=3&lt;/code&gt;: 重试 3 次&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;为什么这比 fstab 好太多了?&lt;a href=&quot;#为什么这比-fstab-好太多了&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;fstab&lt;/th&gt;&lt;th&gt;autofs&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;NAS 开机慢&lt;/td&gt;&lt;td&gt;&lt;strong&gt;系统卡死&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;正常启动,访问时挂载&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;网络抖动&lt;/td&gt;&lt;td&gt;挂载失败,服务起不来&lt;/td&gt;&lt;td&gt;自动重试,不影响使用&lt;/td&gt;&lt;/tr&gt;&lt;tr&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;/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;我的实测数据:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;系统启动时间:从 &lt;strong&gt;45秒(经常卡住)&lt;/strong&gt; 降到 ** 20秒(稳定)**&lt;/li&gt;
&lt;li&gt;内存占用:节省了约 &lt;strong&gt;50MB&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;网络连接:3 个挂载点在不看视频时,连接数为 &lt;strong&gt;0&lt;/strong&gt; (而不是 3)&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;常见问题避坑指南&lt;a href=&quot;#常见问题避坑指南&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;NFS 服务器配置对不对(exports 文件)&lt;/li&gt;
&lt;li&gt;防火墙有没有阻拦(NFS 用的是 2049 端口)&lt;/li&gt;
&lt;li&gt;网络通不通(ping 一下试试)&lt;/li&gt;
&lt;li&gt;权限设置对不对(特别是 map 文件权限)&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;showmount&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;192.168.0.168&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这个命令可以查看 NFS 服务器导出了哪些目录。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;我设置的是 300 秒(5分钟)。你可以根据自己的使用习惯调整:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;看电影比较频繁: 设长一点,比如 600 秒&lt;/li&gt;
&lt;li&gt;偶尔才看: 设短一点,比如 180 秒,更省资源&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. ⚠️ 记得从 /etc/fstab 移除旧配置&lt;a href=&quot;#4-️-记得从-etcfstab-移除旧配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;非常重要!&lt;/strong&gt; 如果你之前用 &lt;code&gt;/etc/fstab&lt;/code&gt; 挂载过,记得把相关配置删掉,不然可能会冲突,甚至导致系统起不来。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. NFS 服务器端配置提醒&lt;a href=&quot;#5-nfs-服务器端配置提醒&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在群晖 NAS 上,记得:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;启用 NFS 服务&lt;/li&gt;
&lt;li&gt;在”文件服务”→“NFS”中配置导出路径&lt;/li&gt;
&lt;li&gt;设置正确的权限(允许你的客户端 IP 访问)&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;不同场景的配置建议&lt;a href=&quot;#不同场景的配置建议&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-fstype&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;nfs,rw,async,noatime,&lt;/span&gt;&lt;span&gt;nfsvers&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;4,soft,&lt;/span&gt;&lt;span&gt;timeo&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;600,&lt;/span&gt;&lt;span&gt;retrans&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;特点:&lt;/strong&gt; 性能优先,容错性好&lt;/p&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-fstype&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;nfs,rw,sync,noatime,&lt;/span&gt;&lt;span&gt;nfsvers&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;4,hard,&lt;/span&gt;&lt;span&gt;timeo&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;100,&lt;/span&gt;&lt;span&gt;retrans&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;特点:&lt;/strong&gt; 数据安全优先,稳定网络环境&lt;/p&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-fstype&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;nfs,rw,async,noatime,&lt;/span&gt;&lt;span&gt;nfsvers&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;3,soft,&lt;/span&gt;&lt;span&gt;timeo&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;200,&lt;/span&gt;&lt;span&gt;retrans&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;特点:&lt;/strong&gt; 快速迭代,兼容性优先&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;说实话,从 fstab 到 autofs,体验真的太香了:&lt;/p&gt;&lt;p&gt;✅ &lt;strong&gt;系统不卡死:&lt;/strong&gt; NAS 开机慢也不怕,系统照样正常启动
✅ &lt;strong&gt;自动恢复:&lt;/strong&gt; 网络抖动也不怕,服务器恢复后自动挂载
✅ &lt;strong&gt;省资源:&lt;/strong&gt; 不用时自动卸载,释放连接和内存
✅ &lt;strong&gt;稳定可靠:&lt;/strong&gt; 不会因为挂载失败导致整个服务起不来
✅ &lt;strong&gt;性能出色:&lt;/strong&gt; NFS v4 + noatime,传输速度快&lt;/p&gt;&lt;p&gt;&lt;strong&gt;现在就可以开始:&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;确认你的 NAS 地址和 NFS 共享路径&lt;/li&gt;
&lt;li&gt;安装 autofs 和 nfs-common&lt;/li&gt;
&lt;li&gt;配置 auto.master 和 auto.media&lt;/li&gt;
&lt;li&gt;重启服务并测试&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;记得从 fstab 删除旧的挂载配置!&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;配置完之后,你会发现自动挂载真的太香了!再也不用担心系统启动卡死了,也不用半夜爬起来手动挂载共享了。&lt;/p&gt;&lt;p&gt;如果你在配置过程中遇到任何问题,或者想了解更多高级配置(比如 NFSv4 的 Kerberos 认证、多服务器故障转移等),随时来问我,我们一起搞定它!&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;/li&gt;
&lt;li&gt;如果你有旧的 fstab 挂载配置,&lt;strong&gt;一定要删除&lt;/strong&gt; ,不然可能会有冲突!&lt;/li&gt;
&lt;li&gt;&lt;code&gt;soft&lt;/code&gt; 选项在家庭环境中是救命的,千万别用 &lt;code&gt;hard&lt;/code&gt;,除非你有特殊需求。&lt;/li&gt;
&lt;/ol&gt;&lt;/blockquote&gt;&lt;/section&gt;</content:encoded></item><item><title>Astro SSR配置完全指南：3步启用服务端渲染</title><link>https://blog.moewah.com/posts/astro-ssr-setup-complete-guide-three-step-enable-server-side-rendering/</link><guid isPermaLink="true">https://blog.moewah.com/posts/astro-ssr-setup-complete-guide-three-step-enable-server-side-rendering/</guid><description>Astro静态站点如何实现用户登录和实时数据？本文详解SSR与SSG的区别、技术选型及Hybrid模式配置，手把手教你30分钟搞定Astro SSR部署，解决服务端渲染困惑。</description><pubDate>Sat, 05 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Astro博客跑得飞快，Lighthouse评分95+，突然老板说”咱们加个用户登录功能吧”。这下傻眼了，静态站点怎么搞用户登录？去翻官方文档，什么SSR、SSG、Hybrid、adapter一堆概念扑面而来，越看越晕。&lt;/p&gt;
&lt;p&gt;其实配置Astro SSR没你想的那么复杂。这篇文章会带你搞清楚：什么时候必须用SSR，怎么快速配置各种适配器，以及如何在一个项目里同时用SSR和SSG。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;什么时候你需要SSR而不是SSG？&lt;a href=&quot;#什么时候你需要ssr而不是ssg&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;最简单的判断标准：&lt;strong&gt;内容是构建时就确定的，还是每次访问都可能变？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;SSG（Static Site Generation）就像餐厅提前备好的套餐，早上厨师把菜做好了，客人来了直接端上桌。博客文章、产品介绍页、关于我们，这些内容基本不变，用SSG完美。&lt;/p&gt;&lt;p&gt;SSR（Server-Side Rendering）就像现点现做，客人点完单，厨师根据你的需求现场炒菜。用户登录后看到的”欢迎回来，张三”，实时股票价格，购物车里的商品数量，这些每个人看到的都不一样，必须用SSR。&lt;/p&gt;&lt;p&gt;看看下面这5个场景，中一个就得考虑SSR了：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. 用户认证和个性化内容&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;最典型的例子就是登录。你不可能在构建时就知道谁会登录，显示什么用户名。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. 实时数据展示&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;天气预报、股票行情、体育比赛分数。这些数据每分钟都在变，你总不能每分钟构建一次网站吧？用SSR，每次用户访问都去拉最新数据。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. 数据库查询&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;电商网站的商品搜索，每个关键词的搜索结果都不一样，不可能提前生成所有可能的搜索结果页面。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. API路由&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;表单提交、文件上传、第三方API调用，这些都需要后端逻辑。Astro的SSR模式支持创建API路由（&lt;code&gt;src/pages/api/xxx.js&lt;/code&gt;），让你不用单独搭后端服务器。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5. A/B测试和个性化推荐&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;根据用户地理位置、访问时间、历史行为展示不同内容。&lt;/p&gt;&lt;p&gt;博客文章详情页能SSR吗？能，但&lt;strong&gt;没必要&lt;/strong&gt;。文章内容是固定的，SSG生成静态HTML，直接走CDN，访问速度更快，服务器成本更低。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Hybrid模式：鱼和熊掌兼得&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Astro 2.0引入的Hybrid模式，让你在一个项目里，静态页面用SSG，动态页面用SSR。比如一个电商网站：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;首页、About页、帮助文档 → SSG&lt;/li&gt;
&lt;li&gt;登录页、用户中心、购物车 → SSR&lt;/li&gt;
&lt;li&gt;商品详情页 → SSG&lt;/li&gt;
&lt;li&gt;搜索结果页 → SSR&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我有个朋友的博客就是这么搞的，文章列表和详情用SSG，评论区用SSR，Lighthouse评分还是保持在95+。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;快速上手 - 3步启用SSR模式&lt;a href=&quot;#快速上手---3步启用ssr模式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;确定项目需要SSR之后，开始配置。先用Node.js适配器演示，这是最通用的方案。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第一步：一键安装适配器&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Astro官方提供了自动配置命令，直接在项目根目录运行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npx astro add node&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这一条命令会自动帮你做三件事：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;安装 &lt;code&gt;@astrojs/node&lt;/code&gt; 包&lt;/li&gt;
&lt;li&gt;修改 &lt;code&gt;astro.config.mjs&lt;/code&gt; 配置文件&lt;/li&gt;
&lt;li&gt;更新 &lt;code&gt;package.json&lt;/code&gt; 的依赖&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;如果你想手动安装，也可以这样：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm install @astrojs/node&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后手动修改配置文件。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第二步：修改配置文件&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;打开项目根目录的 &lt;code&gt;astro.config.mjs&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;astro.config.mjs&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { defineConfig } from &apos;astro/config&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import node from &apos;@astrojs/node&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;output: &apos;server&apos;, // 开启SSR模式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;adapter: node({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;mode: &apos;standalone&apos; // 独立服务器模式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;output配置&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&apos;static&apos;&lt;/code&gt;（默认）：所有页面SSG，输出纯静态HTML&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&apos;server&apos;&lt;/code&gt;：所有页面SSR，每次请求都动态生成&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&apos;hybrid&apos;&lt;/code&gt;：默认SSG，可以按页面开启SSR（推荐）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;mode配置&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&apos;standalone&apos;&lt;/code&gt;：Astro启动独立的Node.js服务器&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&apos;middleware&apos;&lt;/code&gt;：生成中间件，可以集成到Express、Koa等框架&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我一般用 &lt;code&gt;standalone&lt;/code&gt;，因为Astro自带的服务器已经够用了。如果你的项目本来就有Express后端，想把Astro作为一部分，那就用 &lt;code&gt;middleware&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第三步：构建和运行&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;配置完成，构建项目：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm run build&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;构建完成后，&lt;code&gt;dist/&lt;/code&gt; 目录下多了个 &lt;code&gt;server/&lt;/code&gt; 文件夹，里面有个 &lt;code&gt;entry.mjs&lt;/code&gt; 文件，这就是SSR服务器的入口。&lt;/p&gt;&lt;p&gt;运行SSR服务器：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;node ./dist/server/entry.mjs&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;默认会在 &lt;code&gt;http://localhost:4321&lt;/code&gt; 启动服务。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;开发环境调试&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;开发时不用每次都构建，直接用：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm run dev&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;开发服务器会自动支持SSR，修改代码实时生效。&lt;/p&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;：设置环境变量 &lt;code&gt;PORT=3000 node ./dist/server/entry.mjs&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;找不到adapter模块&lt;/strong&gt;：确认 &lt;code&gt;@astrojs/node&lt;/code&gt; 已经安装，运行 &lt;code&gt;npm install&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;页面404&lt;/strong&gt;：检查 &lt;code&gt;src/pages/&lt;/code&gt; 目录下的文件是否正确&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;配置SSR真的就这么简单。我第一次配的时候，从开始到运行成功，不到5分钟。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;如果你的项目托管在Vercel、Netlify或Cloudflare，配置SSR会更简单。这些平台都有Astro官方维护的专用适配器。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Vercel适配器 - Serverless函数的王者&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Vercel是我最常用的部署平台：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npx astro add vercel&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;配置文件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;astro.config.mjs&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { defineConfig } from &apos;astro/config&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import vercel from &apos;@astrojs/vercel/serverless&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;output: &apos;server&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;adapter: vercel(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Vercel的特色功能：ISR（增量静态再生）&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这是Vercel独有的功能，可以让你的SSR页面像SSG一样快。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adapter: vercel({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;isr: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;expiration: 60, // 缓存60秒&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}),&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Vercel部署流程&lt;/strong&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;配置好适配器&lt;/li&gt;
&lt;li&gt;推送代码到GitHub&lt;/li&gt;
&lt;li&gt;在Vercel控制台导入项目&lt;/li&gt;
&lt;li&gt;构建命令：&lt;code&gt;npm run build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;点击部署&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;Netlify适配器 - Edge Functions的高手&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npx astro add netlify&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;配置文件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;astro.config.mjs&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { defineConfig } from &apos;astro/config&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import netlify from &apos;@astrojs/netlify&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;output: &apos;server&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;adapter: netlify({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;edgeMiddleware: true,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;把中间件逻辑（比如身份验证、重定向）运行在边缘节点，响应更快。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Netlify的重定向配置&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在项目根目录创建 &lt;code&gt;_redirects&lt;/code&gt; 文件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/old-page  /new-page  301&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Cloudflare适配器 - 全球CDN加速&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npx astro add cloudflare&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;配置文件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;astro.config.mjs&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { defineConfig } from &apos;astro/config&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import cloudflare from &apos;@astrojs/cloudflare&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;output: &apos;server&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;adapter: cloudflare(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;Cloudflare Workers运行在全球300+数据中心，延迟极低。&lt;/p&gt;&lt;p&gt;需要注意的是，Cloudflare Workers的运行环境和Node.js不完全一样，有些Node.js的API用不了（比如 &lt;code&gt;fs&lt;/code&gt; 文件系统）。&lt;/p&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;strong&gt;Node.js&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;自建服务器、VPS&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;Vercel&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;个人项目、小团队&lt;/td&gt;&lt;td&gt;零配置，ISR支持&lt;/td&gt;&lt;td&gt;免费额度有限&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Netlify&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;静态站+动态功能&lt;/td&gt;&lt;td&gt;Edge Functions快&lt;/td&gt;&lt;td&gt;构建时长限制&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Cloudflare&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;全球用户，低延迟&lt;/td&gt;&lt;td&gt;边缘计算，价格低&lt;/td&gt;&lt;td&gt;Workers环境限制&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Hybrid混合渲染实战&lt;a href=&quot;#hybrid混合渲染实战&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;前面讲了纯SSR的配置，现在到重点了：&lt;strong&gt;Hybrid模式&lt;/strong&gt;。这是Astro的杀手锏，让你在一个项目里同时享受SSG的速度和SSR的灵活性。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;配置Hybrid模式&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;只需把 &lt;code&gt;output&lt;/code&gt; 改成 &lt;code&gt;&apos;hybrid&apos;&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;astro.config.mjs&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { defineConfig } from &apos;astro/config&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import node from &apos;@astrojs/node&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;output: &apos;hybrid&apos;, // 默认SSG，按需SSR&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;adapter: node(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;默认所有页面都是SSG&lt;/strong&gt;，然后你可以在需要SSR的页面上加一行代码，开启SSR。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;页面级别控制渲染方式&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在页面文件的frontmatter里加一行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// src/pages/dashboard.astro（SSR）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export const prerender = false; // 关闭预渲染，改用SSR&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const user = Astro.cookies.get(&apos;user&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;h1&amp;gt;欢迎回来，{user?.name}&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;p&amp;gt;你有 {user?.notifications} 条未读消息&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;prerender = false&lt;/code&gt; 意思是”别在构建时生成，等用户访问时再动态生成”。&lt;/p&gt;&lt;p&gt;反过来，如果你把 &lt;code&gt;output&lt;/code&gt; 设成 &lt;code&gt;&apos;server&apos;&lt;/code&gt;（全部SSR），想让某个页面用SSG：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// src/pages/about.astro（SSG）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export const prerender = true; // 强制在构建时生成&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;h1&amp;gt;关于我们&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;p&amp;gt;这个页面内容不变，提前生成好，访问超快。&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&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;output配置&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;&apos;hybrid&apos;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;所有页面SSG&lt;/td&gt;&lt;td&gt;&lt;code&gt;export const prerender = false&lt;/code&gt; → 该页面SSR&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;&apos;server&apos;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;所有页面SSR&lt;/td&gt;&lt;td&gt;&lt;code&gt;export const prerender = true&lt;/code&gt; → 该页面SSG&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;我一开始总是搞反，后来记住了：&lt;strong&gt;hybrid是SSG优先，server是SSR优先&lt;/strong&gt;。&lt;/p&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;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;src/pages/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── index.astro          // 首页（SSG）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── about.astro          // 关于页（SSG）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── blog/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── [slug].astro     // 文章详情（SSG）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   └── index.astro      // 文章列表（SSG）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── login.astro          // 登录页（SSR）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── dashboard.astro      // 用户中心（SSR）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└── api/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└── comments.js      // 评论接口（SSR）&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;配置文件&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;astro.config.mjs&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;output: &apos;hybrid&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;adapter: vercel(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/pages/blog/[slug].astro&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { getCollection } from &apos;astro:content&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export async function getStaticPaths() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const posts = await getCollection(&apos;blog&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return posts.map(post =&amp;gt; ({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;params: { slug: post.slug },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;props: { post },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const { post } = Astro.props;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;h1&amp;gt;{post.data.title}&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;div set:html={post.body} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;动态页面（需要SSR）&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/pages/dashboard.astro&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export const prerender = false;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const token = Astro.cookies.get(&apos;token&apos;)?.value;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;if (!token) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return Astro.redirect(&apos;/login&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const user = await fetch(`https://api.example.com/user`, {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;headers: { Authorization: `Bearer ${token}` }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}).then(res =&amp;gt; res.json());&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;h1&amp;gt;欢迎，{user.name}&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;p&amp;gt;邮箱：{user.email}&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;p&amp;gt;上次登录：{user.lastLogin}&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;API路由（自动SSR）&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/pages/api/comments.js&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export async function POST({ request }) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const { articleId, content } = await request.json();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;await db.comments.insert({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;articleId,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;content,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;createdAt: new Date(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return new Response(JSON.stringify({ success: true }), {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;status: 200,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;headers: { &apos;Content-Type&apos;: &apos;application/json&apos; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export async function GET({ url }) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const articleId = url.searchParams.get(&apos;articleId&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const comments = await db.comments.findMany({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;where: { articleId },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;orderBy: { createdAt: &apos;desc&apos; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return new Response(JSON.stringify(comments), {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;headers: { &apos;Content-Type&apos;: &apos;application/json&apos; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;这样配置的好处&lt;/strong&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;静态页面依然快如闪电，Lighthouse评分95+&lt;/li&gt;
&lt;li&gt;动态页面实时获取数据&lt;/li&gt;
&lt;li&gt;API路由提供后端能力&lt;/li&gt;
&lt;li&gt;构建时间短&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;我之前做的一个项目，50篇博客文章+用户系统，构建时间才20秒，部署后静态页面秒开，动态页面响应也在100ms以内。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;配置SSR的过程中，我踩过不少坑。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;问题1：报错 &lt;code&gt;Astro.clientAddress is only available when using output: &apos;server&apos;&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：你在代码里用了 &lt;code&gt;Astro.clientAddress&lt;/code&gt;，但配置文件里 &lt;code&gt;output&lt;/code&gt; 还是 &lt;code&gt;&apos;static&apos;&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;astro.config.mjs&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;output: &apos;server&apos;, // 或 &apos;hybrid&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;adapter: node(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Astro.clientAddress&lt;/code&gt;、&lt;code&gt;Astro.cookies&lt;/code&gt;、&lt;code&gt;Astro.redirect()&lt;/code&gt; 这些动态API，只能在SSR模式下用。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;问题2：部署后页面404，本地开发正常&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：适配器配置不对，或者部署平台的构建命令/输出目录设置错误。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Vercel部署&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;构建命令：&lt;code&gt;npm run build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;输出目录：&lt;code&gt;.vercel/output&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Netlify部署&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;构建命令：&lt;code&gt;npm run build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;发布目录：&lt;code&gt;dist&lt;/code&gt; 或 &lt;code&gt;.netlify&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;问题3：SSR页面加载很慢，超过2秒&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：服务器性能不足，或者数据库查询太慢。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;使用缓存&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优化数据库查询&lt;/strong&gt;：加索引、减少JOIN&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;考虑ISR&lt;/strong&gt;（如果用Vercel）&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;问题4：环境变量在客户端获取不到&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：Astro的环境变量有客户端和服务端之分。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;服务端用：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const secret = import.meta.env.SECRET_KEY;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;客户端用：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const apiUrl = import.meta.env.PUBLIC_API_URL; // 必须以PUBLIC_开头&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;最佳实践总结&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;默认用Hybrid模式&lt;/strong&gt;：除非所有页面都需要SSR，否则 &lt;code&gt;output: &apos;hybrid&apos;&lt;/code&gt; 是最优选择&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;按需启用SSR&lt;/strong&gt;：只对真正需要动态渲染的页面设置 &lt;code&gt;prerender = false&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;静态资源走CDN&lt;/strong&gt;：图片、CSS、JS文件放在 &lt;code&gt;public/&lt;/code&gt; 目录&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缓存策略&lt;/strong&gt;：对不常变的动态内容用缓存或ISR&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;环境变量分离&lt;/strong&gt;：敏感信息用服务端环境变量，公开配置用 &lt;code&gt;PUBLIC_&lt;/code&gt; 前缀&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;监控性能&lt;/strong&gt;：用Vercel Analytics或Google Analytics监控SSR页面的响应时间&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&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;strong&gt;1. SSR不是万能的，按需使用才是王道&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;静态页面用SSG，动态页面用SSR，大部分项目用Hybrid模式最合适。我见过有人把整个博客都改成SSR，结果性能反而下降了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. 适配器选择看部署平台，配置其实很简单&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果用Vercel/Netlify/Cloudflare，一行 &lt;code&gt;npx astro add [platform]&lt;/code&gt; 就搞定。如果自建服务器，&lt;code&gt;npx astro add node&lt;/code&gt; 也就5分钟的事。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. Hybrid模式让你鱼和熊掌兼得&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这才是Astro的精髓。静态页面保持95+ Lighthouse评分，动态页面实现个性化功能。&lt;/p&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;：打开你的Astro项目，运行 &lt;code&gt;npx astro add node&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;：Astro最近推出的Server Islands功能，可以让SSG页面里嵌入SSR组件&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;不要过度优化。如果你的网站访问量不大（日PV&amp;lt;1万），其实静态站点就够用了，没必要上SSR增加复杂度。技术选型要服务业务。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>我是怎么把 Docker 容器从一台服务器搬到另一台的</title><link>https://blog.moewah.com/posts/docker-container-migration-practical-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/docker-container-migration-practical-guide/</guid><description>如何将Docker容器从一台服务器迁移到另一台？本文详细拆解数据卷备份、镜像打包与传输的全流程，解决迁移中常见的数据丢失和配置错乱问题，助你轻松实现容器跨服务器部署。</description><pubDate>Sat, 05 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;说实话，第一次遇到 Docker 容器迁移这个问题的时候，我真的崩溃了。&lt;/p&gt;
&lt;p&gt;你知道那种感觉吗？辛辛苦苦配置好的服务，要换个服务器部署，完全不知道从哪下手。网上那些教程要么太复杂，要么讲得云里雾里。我当时就在想：&lt;strong&gt;不就是个容器迁移吗，怎么搞得这么麻烦？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;踩过无数坑之后，我终于整理出了一套&lt;strong&gt;超级简单&lt;/strong&gt;的流程。今天我就把这些经验毫无保留地分享给你，让你不再像我当初一样掉坑里。&lt;/p&gt;
&lt;section&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;section&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;code&gt;docker commit&lt;/code&gt; 这个命令，每次都是重新配置，简直浪费时间。后来知道这个命令，真的绝了。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;commit&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;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这条命令会把你对容器的&lt;strong&gt;所有改动&lt;/strong&gt;（包括文件修改、配置更新、新安装的软件）打包成一个全新的镜像。就像给容器拍了个快照，随时都能恢复。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第2步：把镜像导出成 tar 文件&lt;a href=&quot;#第2步把镜像导出成-tar-文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;有了镜像之后，下一步就是把它打包成一个可以传输的文件。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;save&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-o&lt;/span&gt;&lt;span&gt;&lt;span&gt; [保存的tar文件路径] &lt;/span&gt;&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;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这里有个小细节需要注意：&lt;strong&gt;tar 文件会包含镜像的所有层和元数据&lt;/strong&gt;，所以文件可能会比较大。我之前迁移过一个 2GB 的镜像，导出来之后大概 1.8GB，这个压缩率还可以。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第3步：用 SCP 传输到目标服务器&lt;a href=&quot;#第3步用-scp-传输到目标服务器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;传输文件的方式有很多，但我最推荐 SCP，简单又安全。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;scp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;本地路径&amp;gt;/&amp;lt;镜像名称&amp;gt;.tar&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;目标服务器IP&amp;gt;:&amp;lt;目标路径&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果你想更快一点，可以用 rsync，支持断点续传。之前我传输一个大镜像，网络突然断了，还好用了 rsync，不用重新传。&lt;/p&gt;&lt;/section&gt;&lt;section&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;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;load&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-i&lt;/span&gt;&lt;span&gt; [tar文件路径]&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;等它加载完，你可以在目标服务器上用 &lt;code&gt;docker images&lt;/code&gt; 看到新的镜像已经乖乖躺在那里了。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第5步：给镜像打个好看的标签&lt;a href=&quot;#第5步给镜像打个好看的标签&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;新加载的镜像可能没有 REPOSITORY 和 TAG，看着特别别扭。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;IMAGE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ID&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;NEW&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;REPOSITORY&amp;gt;:&amp;lt;TAG&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;比如我习惯打成 &lt;code&gt;myapp:v1.0&lt;/code&gt; 这样，一看就知道是什么版本。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;场景二：带 Volume 数据卷的容器迁移 - 这个才是重点&lt;a href=&quot;#场景二带-volume-数据卷的容器迁移---这个才是重点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;说实话，如果你只是迁移容器本身，上面那个方法就够了。但很多时候，你的容器还挂载了 Volume 数据卷，里面有数据库、日志文件、用户上传的各种数据。&lt;strong&gt;这些东西丢了就真完了&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;我之前就踩过这个坑，迁移的时候只顾着容器，忘了 Volume，结果数据全丢了，那叫一个崩溃。所以这次我一定得把这个讲清楚。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;第1步：备份 Volume 数据卷&lt;a href=&quot;#第1步备份-volume-数据卷&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--volumes-from&lt;/span&gt;&lt;span&gt;&lt;span&gt; [原容器名称或ID] -v &lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;pwd&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:/backup ubuntu tar cvf /backup/volume_backup.tar /path/in/container&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;我来解释一下这条命令的精髓：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--rm&lt;/code&gt;：临时容器用完就删，不留垃圾&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--volumes-from&lt;/code&gt;：&lt;strong&gt;这是关键&lt;/strong&gt;，告诉 Docker 使用原容器的数据卷&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-v $(pwd):/backup&lt;/code&gt;：把当前目录挂载到临时容器的 /backup 目录，这样 tar 文件就能写出来了&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tar cvf&lt;/code&gt;：把数据卷内容打包&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;举个例子，假设你的容器叫 &lt;code&gt;myapp&lt;/code&gt;，数据卷路径是 &lt;code&gt;/var/lib/mysql&lt;/code&gt;，完整命令就是：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--volumes-from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;myapp&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;&lt;span&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;pwd&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:/backup&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ubuntu&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tar&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cvf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/backup/volume_backup.tar&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/var/lib/mysql&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;这个跟前面一样，用 SCP 或者 rsync 都行。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;scp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;volume_backup.tar&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;目标服务器IP&amp;gt;:&amp;lt;目标路径&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;p&gt;先在目标服务器上创建一个空的数据卷。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;volume&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; [新数据卷名称]&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;我习惯给数据卷也起个清晰的名字，比如 &lt;code&gt;myapp-mysql-data&lt;/code&gt;，一看就知道是干啥的。&lt;/p&gt;&lt;/section&gt;&lt;section&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;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;span&gt;&lt;span&gt; [新数据卷名称]:/data -v &lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;pwd&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:/backup ubuntu tar xf /backup/volume_backup.tar -C /data&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;注意这里用的是 &lt;code&gt;tar xf&lt;/code&gt;（解压）而不是 &lt;code&gt;tar cvf&lt;/code&gt;（打包），别搞混了。&lt;code&gt;-C /data&lt;/code&gt; 这个参数很重要，告诉 tar 把文件解压到 /data 目录。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第5步：启动新容器并挂载数据卷&lt;a href=&quot;#第5步启动新容器并挂载数据卷&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;最后一步，用新镜像启动新容器，把刚才迁移过来的数据卷挂载上去。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&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;--name&lt;/span&gt;&lt;span&gt;&lt;span&gt; [新容器名称] -v &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/in/container &lt;/span&gt;&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;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;比如这样：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&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;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;myapp-new&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;myapp-mysql-data:/var/lib/mysql&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;myapp:v1.0&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;启动之后，你可以进容器看看，数据是不是都还在。&lt;strong&gt;相信我，看到数据都在的那一刻，真的有种如释重负的感觉。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;section&gt;&lt;h3&gt;坑1：忘记迁移 Volume 数据卷&lt;a href=&quot;#坑1忘记迁移-volume-数据卷&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这个前面提到了，真的惨。&lt;strong&gt;一定要记住&lt;/strong&gt;：容器迁移 ≠ 数据迁移。Volume 是独立于容器的，必须单独处理。&lt;/p&gt;&lt;/section&gt;&lt;section&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;我在迁移一个 WordPress 容器的时候，原容器的数据卷挂载路径是 &lt;code&gt;/var/www/html&lt;/code&gt;，结果在新容器上挂载成了 &lt;code&gt;/var/www/wp&lt;/code&gt;，WordPress 启动之后找不到数据，直接白屏。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;一定要确保路径完全一致&lt;/strong&gt;，或者至少确保应用能正确找到数据。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;恢复数据到新 Volume 的时候，有时候会出现权限问题。比如之前用 root 运行的容器，数据文件权限都是 root，新容器用普通用户运行就会报错。&lt;/p&gt;&lt;p&gt;解决办法很简单，调整一下文件权限：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--rm&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;myapp-data:/data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ubuntu&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;chown&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-R&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1000:1000&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/data&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这里的 1000:1000 要换成你容器运行用户的 UID 和 GID。&lt;/p&gt;&lt;/section&gt;&lt;section&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;/section&gt;&lt;/section&gt;
&lt;section&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;回顾一下，Docker 容器迁移的核心就是这几个步骤：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;普通容器迁移&lt;/strong&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;code&gt;docker commit&lt;/code&gt; 提交改动到新镜像&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker save&lt;/code&gt; 导出镜像&lt;/li&gt;
&lt;li&gt;用 SCP/RSYNC 传输 tar 文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker load&lt;/code&gt; 在目标服务器加载镜像&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker tag&lt;/code&gt; 给镜像打标签&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;带 Volume 数据卷的容器迁移&lt;/strong&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;用临时容器备份 Volume 数据&lt;/li&gt;
&lt;li&gt;传输备份文件&lt;/li&gt;
&lt;li&gt;在目标服务器创建新 Volume&lt;/li&gt;
&lt;li&gt;用临时容器恢复数据到新 Volume&lt;/li&gt;
&lt;li&gt;启动新容器并挂载新 Volume&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;说实话，这套流程看起来有点复杂，但只要你严格按照步骤来，&lt;strong&gt;基本上不会出问题&lt;/strong&gt;。我迁移过几十个容器，从简单的 Web 应用到复杂的数据库集群，这套方法从来没让我失望过。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;ol&gt;
&lt;li&gt;&lt;strong&gt;先找个不重要的测试容器练手&lt;/strong&gt;，熟悉一下流程&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;备份好数据&lt;/strong&gt;，万一出问题还能恢复&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;做好记录&lt;/strong&gt;，把每个命令和结果都记下来，方便后续参考&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;在经历过一次成功的迁移之后，你会发现这事儿真的不难。以后再遇到类似的需求，你也能像我一样，轻松搞定。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;最后，如果这篇文章对你有帮助，记得收藏起来，下次迁移容器的时候可以直接照着操作。&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;em&gt;这篇文章整理了我多次 Docker 容器迁移的实战经验，希望能帮你少踩坑、多省心。如果有什么问题或者更好的方法，欢迎交流！&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Git 奇招：无缝接轨远程分支，解锁未合并PR的新特性！</title><link>https://blog.moewah.com/posts/git-merge-unmerged-pr-feature/</link><guid isPermaLink="true">https://blog.moewah.com/posts/git-merge-unmerged-pr-feature/</guid><description>如何在不合并PR的情况下体验开源项目新功能？本文详细拆解从克隆原仓库到安全合并未合并PR分支的全流程，帮助开发者快速体验开源项目中的新特性。</description><pubDate>Sat, 05 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;你看啊,一个你特别喜欢的开源项目,有个大佬提交了一个超级酷的功能 PR。你心里那个急啊,简直迫不及待想试试。可是原作者呢?可能太忙了,可能忘了,反正那个 PR 就在那儿挂着,一个月两个月过去了还没合并。&lt;/p&gt;&lt;p&gt;我当时真的想:要不自己直接把那个 PR 的代码搞下来试试?&lt;/p&gt;&lt;p&gt;相信我,你绝对不是一个人!今天我就把我的踩坑经验全盘托出,教你如何优雅地把 fork 仓库中未合并的 PR 分支合并到本地,立马体验新功能。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://github.com/original-author/repo.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;repo&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这里有个小细节要提醒你:&lt;strong&gt;一定要克隆原作者的仓库,而不是你自己的 fork&lt;/strong&gt;。我刚开始的时候就搞错了,结果后面一堆麻烦。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;第二步:把 fork 的仓库加进来&lt;a href=&quot;#第二步把-fork-的仓库加进来&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这一步是关键,你听我说:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;remote&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;forked&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://github.com/forked-author/repo.git&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;啥意思呢?简单说就是告诉 Git:“嘿,这里还有个远程仓库,记得把它也管起来。”&lt;/p&gt;&lt;p&gt;这样操作后,你的本地就有了两个远程仓库:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;origin&lt;/code&gt;: 原作者的仓库&lt;/li&gt;
&lt;li&gt;&lt;code&gt;forked&lt;/code&gt;: 那个提交 PR 的 fork 仓库&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;避坑提示&lt;/strong&gt;:我以前犯过一个错误,把名字起得特别长,后来输入命令的时候简直崩溃。所以建议用简短好记的名字,比如 &lt;code&gt;forked&lt;/code&gt; 或者 &lt;code&gt;pr-branch&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;forked&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这步做啥?就是把 &lt;code&gt;forked&lt;/code&gt; 仓库的所有分支和提交记录下载到本地。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;划重点&lt;/strong&gt;:这里只是下载,还不会合并到你的代码里。这就好比你先把快递拿回家,但还没拆封。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;checkout&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-b&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;merge-feature-branch&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;为什么要这样?因为你不想直接在主分支上瞎折腾,万一搞砸了多尴尬。&lt;/p&gt;&lt;p&gt;我之前就犯过这个错误,直接在 &lt;code&gt;main&lt;/code&gt; 分支上操作,结果冲突解决了一半想放弃,回滚都不好回。&lt;strong&gt;所以,这个步骤千万别偷懒!&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;merge&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;forked/feature-branch&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这时候,&lt;code&gt;forked/feature-branch&lt;/code&gt; 分支的代码就会被合并到当前分支。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;小知识&lt;/strong&gt;:为什么是 &lt;code&gt;forked/feature-branch&lt;/code&gt; 而不是直接 &lt;code&gt;feature-branch&lt;/code&gt;?因为 &lt;code&gt;forked&lt;/code&gt; 是远程仓库的名字,&lt;code&gt;feature-branch&lt;/code&gt; 是远程仓库的分支名,中间用斜杠隔开。这个语法刚开始我也绕晕了好久。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 这是 main 分支的代码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;RUN apt-get update &amp;amp;&amp;amp; apt-get install -y package1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;=======&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 这是 feature-branch 分支的代码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;RUN apt-get update &amp;amp;&amp;amp; apt-get install -y package2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; feature-branch&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这里有三部分:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD&lt;/code&gt; 和 &lt;code&gt;=======&lt;/code&gt; 之间:你当前分支的代码&lt;/li&gt;
&lt;li&gt;&lt;code&gt;=======&lt;/code&gt; 和 &lt;code&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; feature-branch&lt;/code&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;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;p&gt;解决完后记得标记:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;已解决冲突的文件&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;commit&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-m&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;合并来自 forked 仓库 feature-branch 分支的修改&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;建议写清楚点,以后回看的时候才知道这次合并干了啥。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;origin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;merge-feature-branch&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这样你就可以在自己的仓库里查看和测试合并后的代码了。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;ol&gt;
&lt;li&gt;✅ 克隆原作者仓库,不是 fork 仓库&lt;/li&gt;
&lt;li&gt;✅ 用 &lt;code&gt;git remote add&lt;/code&gt; 添加 fork 仓库&lt;/li&gt;
&lt;li&gt;✅ 用 &lt;code&gt;git fetch&lt;/code&gt; 获取远程分支&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;一定要创建新分支&lt;/strong&gt;,别直接在主分支操作(我的血泪教训)&lt;/li&gt;
&lt;li&gt;✅ 用 &lt;code&gt;git merge forked/feature-branch&lt;/code&gt; 合并&lt;/li&gt;
&lt;li&gt;✅ 遇到冲突不要慌,先理解再解决&lt;/li&gt;
&lt;li&gt;✅ 用 &lt;code&gt;git add&lt;/code&gt; 标记已解决的冲突文件&lt;/li&gt;
&lt;li&gt;✅ 提交前写清楚 commit 信息&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&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;打开你常用的 Git 客户端(命令行也行)&lt;/li&gt;
&lt;li&gt;找一个你想试用的 PR 分支&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;strong&gt;每一次踩坑都是在积累经验&lt;/strong&gt;。你现在遇到的困难,以后都会成为你的武器。&lt;/p&gt;&lt;p&gt;加油!开源世界的大门已经为你打开了 🚀&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Mac版ComfyUI三大高清修复终极方案</title><link>https://blog.moewah.com/posts/mac-comfyui-hd-restore-three-solutions/</link><guid isPermaLink="true">https://blog.moewah.com/posts/mac-comfyui-hd-restore-three-solutions/</guid><description>在Mac上如何实现高效AI高清放大？本文详解Ultimate SD Upscale、SUPIR等三大原生MPS加速方案，解决FlashVSR无法运行问题，提供参数配置与实战技巧，助你轻松提升图像分辨率。</description><pubDate>Sat, 05 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;既然折腾了半天发现 FlashVSR 这种“CUDA/Triton 亲儿子”在 Mac 上实在跑不动，咱也没必要非得在一棵树上吊死。其实在 Mac (Apple Silicon) 的生态里，有很多原生支持 MPS 加速的高清修复方案，效果完全不输，甚至更稳。&lt;/p&gt;
&lt;p&gt;我把这三个实测好用的方案整理了出来，大家根据自己的机器配置和需求直接抄作业就行。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;方案一：Ultimate SD Upscale —— 咱 Mac 用户的“万能公式”&lt;a href=&quot;#方案一ultimate-sd-upscale--咱-mac-用户的万能公式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这是我觉得最稳、也是日常用得最多的方案。它的核心逻辑是“分块（Tiling）”，这对咱 Mac 这种显存和内存共享的架构非常友好。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;厉害在哪&lt;/strong&gt;：它不会一次性把整张大图塞进显卡，而是切成一小块一小块来修。即便你的 Mac 只有 8G 或 16G 内存，用它放大到 4K 甚至 8K 都不容易崩溃。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：原图构图已经很好了，只想在不改变画面的前提下，增加精细度和分辨率。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;section&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;p&gt;&lt;strong&gt;upscale_by（放大倍数）&lt;/strong&gt;: 建议 &lt;strong&gt;2&lt;/strong&gt;。分两次 2 倍放大比一次 4 倍效果更细腻。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;upscale_model（放大模型）&lt;/strong&gt;: 强推 &lt;strong&gt;4x-UltraSharp&lt;/strong&gt;。Mac 跑得快，边缘锐利。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;mode_type（模式）&lt;/strong&gt;: 必选 &lt;strong&gt;Chess (棋盘格)&lt;/strong&gt;。能有效避免分块拼接时的缝隙。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;denoise（重绘幅度）&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;0.3&lt;/strong&gt;：纯高清化，基本不改原图。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;0.4 - 0.45&lt;/strong&gt;：修复模糊，AI 会帮你补齐一些细节（如睫毛、皮肤纹理）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;tile_width/height&lt;/strong&gt;: 建议 &lt;strong&gt;512&lt;/strong&gt;。这是 Mac 跑起来最舒服的尺寸。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;方案二：SUPIR —— 模糊照片的“起死回生术”&lt;a href=&quot;#方案二supir--模糊照片的起死回生术&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果手里有一张废图，比如人脸模糊、全是噪点，那直接上 SUPIR。这玩意儿简直是 AI 修复界的“重型坦克”。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;厉害在哪&lt;/strong&gt;：它利用扩散模型对画面进行“语义重构”。它能看懂哪里是眼睛、哪里是头发，然后重新帮你画出来。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：拯救极度模糊的照片，或者老照片翻新。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;section&gt;&lt;h3&gt;🛠 推荐参数配置（Mac 深度优化版）&lt;a href=&quot;#-推荐参数配置mac-深度优化版&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Loading Model（加载模式）&lt;/strong&gt;: 必须选 &lt;strong&gt;fp8_e4m3fn&lt;/strong&gt;。在 Mac 上千万别开 fp16，否则内存压力瞬间爆红。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Encoder/Decoder Tile Size（分块大小）&lt;/strong&gt;: 建议设为 &lt;strong&gt;512 或 768&lt;/strong&gt;。这是 Mac 内存溢出的“生死线”，也是减少接缝的关键。数值必须是 64 的倍数。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;restoration_scale（修复程度）&lt;/strong&gt;: &lt;strong&gt;0.6 - 0.8&lt;/strong&gt;。数值越高越像原图，数值越低 AI 发挥越多。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;controlnet_scale（控制强度）&lt;/strong&gt;: &lt;strong&gt;重点！&lt;/strong&gt; 如果发现放大后&lt;strong&gt;眼睛、眼线变得奇怪或扭曲&lt;/strong&gt;，请将此值从 1.0 降至 &lt;strong&gt;0.7 - 0.8&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;S_noise（噪波量）与 s_churn（搅拌度）&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;想增加肤质纹理：&lt;code&gt;S_noise&lt;/code&gt; 设为 &lt;strong&gt;1.003&lt;/strong&gt;，&lt;code&gt;s_churn&lt;/code&gt; 设为 &lt;strong&gt;5&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果画面线条乱飞、噪点过重：将 &lt;code&gt;s_churn&lt;/code&gt; 设为 &lt;strong&gt;0&lt;/strong&gt;，&lt;code&gt;S_noise&lt;/code&gt; 降回 &lt;strong&gt;1.0&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;方案三：Flux GGUF + 模型采样缩放 —— 统一内存的“性能怪兽”&lt;a href=&quot;#方案三flux-gguf--模型采样缩放--统一内存的性能怪兽&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果朋友们目前在玩最新的 Flux 模型，那咱就得用 Flux 自己的那一套逻辑。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;厉害在哪&lt;/strong&gt;：GGUF 格式简直是为 Mac 这种统一内存架构量身定制的。用 4-bit 或 8-bit 的 GGUF 配合 Flux，画面的文字还原和逻辑感极强。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：大光影、多细节、带文字的复杂场景修复。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;section&gt;&lt;h3&gt;🛠 推荐参数配置&lt;a href=&quot;#-推荐参数配置-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;model_gguf&lt;/strong&gt;: 选 &lt;strong&gt;flux1-dev-Q4_K_S&lt;/strong&gt; 或者 &lt;strong&gt;Q8&lt;/strong&gt;。16G 内存建议 Q4。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;shift（偏移）&lt;/strong&gt;: &lt;strong&gt;1.15&lt;/strong&gt;。保住 Flux 的高级灰调，防止对比度过爆。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;guidance&lt;/strong&gt;: &lt;strong&gt;3.5&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;放大节点&lt;/strong&gt;: 配合 &lt;code&gt;ModelSamplingFlux&lt;/code&gt; 使用，效果比普通采样器自然得多。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;p&gt;&lt;strong&gt;环境变量是护身符&lt;/strong&gt;：在终端启动 ComfyUI 前，习惯性执行一下 &lt;code&gt;export PYTORCH_ENABLE_MPS_FALLBACK=1&lt;/code&gt;。这能解决 90% 的算子不支持导致的闪退。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;眼线/局部变形终极方案&lt;/strong&gt;：如果 SUPIR 整体很棒但眼睛画崩了，不要死磕全局参数。在末端接一个 &lt;strong&gt;FaceDetailer&lt;/strong&gt; 节点，配合 &lt;code&gt;eyes_yolov8&lt;/code&gt; 模型，重绘幅度（Denoise）给 &lt;strong&gt;0.3-0.4&lt;/strong&gt; 进行局部精准修复。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;远离 Triton 插件&lt;/strong&gt;：看到插件说明里写着必须安装 Triton 或 FlashAttention 的，直接关掉网页，那是给 NVIDIA 显卡准备的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;多用 fp8&lt;/strong&gt;：Mac 内存再大也经不起折腾，加载模型多选 fp8，留出更多空间给计算过程，减少 Swap 交换。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;</content:encoded></item><item><title>macOS 系统这4大顽固问题，让我头大整整3天</title><link>https://blog.moewah.com/posts/macos-4-common-problems-solutions/</link><guid isPermaLink="true">https://blog.moewah.com/posts/macos-4-common-problems-solutions/</guid><description>macOS用户常遇到的&apos;已损坏无法打开&apos;和菜单栏残留项目问题怎么解决？本文详细拆解4个最让人头大的系统难题，提供从终端命令到设置调整的完整解决方案，助你彻底摆脱macOS使用困扰。</description><pubDate>Sat, 05 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;说实话，自从我换到 macOS 之后，真的没少翻车。有些问题真的特别让人无语，我跟你讲，特别是那些”已损坏无法打开”的提示，简直是离谱到家了。你知道吗？我为了解决这些破问题，折腾了整整3天3夜，试了N种方法，最后才算是找到了根治的方案。&lt;/p&gt;
&lt;p&gt;真的，macOS 的这些问题真的很顽固。你以为简单的一个”允许打开”就能解决？天真！系统总是跟你玩”躲猫猫”，你以为解决了，下次又出现新的问题。真的绝了，这种用户体验真的是让人服了。我每次看到这些莫名其妙的限制，都忍不住想说：真的会谢啊！&lt;/p&gt;
&lt;p&gt;但好消息是，这些坑我都替你踩完了。今天就把这4个最让人头大的问题的解决方案，一条一条地讲给你听。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;问题一：第三方软件”已损坏，无法打开”，这操作我真的栓Q了&lt;a href=&quot;#问题一第三方软件已损坏无法打开这操作我真的栓q了&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这个问题真的是 macOS 用户最无语的经历之一。我第一次遇到的时候，还以为是软件本身有问题，结果重新下载N次还是一样。真的，我当时都要没眼看了，完全不知道怎么回事。&lt;/p&gt;&lt;p&gt;后来才发现，这是 macOS 的安全机制在作怪。系统会对从网上下载的软件添加”隔离属性”，就像给软件贴了个”可疑标签”，导致系统直接拦截。你想想，这合理吗？我明明信任这个软件，系统凭什么替我做决定？真的，这种操作我真的是大无语。&lt;/p&gt;&lt;section&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;strong&gt;第1步&lt;/strong&gt;：尝试打开 ClashMac，出现安全警告时点击”完成”&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第2步&lt;/strong&gt;：打开 系统设置 → 隐私与安全性&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第3步&lt;/strong&gt;：向下滚动，找到提示：“ClashMac 已被阻止打开”&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第4步&lt;/strong&gt;：点击旁边的”仍要打开”&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第5步&lt;/strong&gt;：在弹出框再点击”仍要打开”即可&lt;/p&gt;&lt;p&gt;这个方法特别简单，但有个问题——有时候系统就是不给你这个选项。真的，我遇到过好几次，完全找不到”仍要打开”的按钮。所以你一定要记住，如果找不到这个按钮，就赶紧用下面的方法2。&lt;/p&gt;&lt;/section&gt;&lt;section&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;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;xattr&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-cr&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/Applications/ClashMac.app&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;回车后重新打开应用，问题直接解决。&lt;/p&gt;&lt;p&gt;我跟你讲，这个方法真的特别管用。&lt;code&gt;xattr -cr&lt;/code&gt; 这条命令的意思就是”清除所有扩展属性”，简单说就是把系统给软件贴的那些”可疑标签”全部撕掉。一劳永逸，再也不用担心这个问题。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;如果你只想移除隔离属性，不想影响其他扩展属性，可以用这条命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;xattr&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;com.apple.quarantine&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/Applications/ClashMac.app&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这条命令更精准，只删除隔离属性，其他扩展属性保持不变。说实话，大多数情况下用方法2就够了，但如果你是个追求完美的人，这个方法更适合你。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;问题二：macOS 26系统设置菜单栏残留项目，清理方法超简单&lt;a href=&quot;#问题二macos-26系统设置菜单栏残留项目清理方法超简单&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;section&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;第1步&lt;/strong&gt;：打开终端&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第2步&lt;/strong&gt;：输入以下命令删除残留配置文件&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/Library/Group&lt;/span&gt;&lt;span&gt;\ &lt;/span&gt;&lt;span&gt;Containers/group.com.apple.controlcenter/Library/Preferences/group.com.apple.controlcenter.plist&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;第3步&lt;/strong&gt;：重启电脑&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;reboot&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;就这么简单！重启之后，你会发现菜单栏里那些残留的图标全都不见了。真的，这个过程比我想象的简单太多了，为什么网上那些教程要搞得那么复杂？&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;你知道为什么吗？因为这些软件在安装的时候，会在系统的 LaunchDaemons 或 LaunchAgents 目录里创建启动项，即使卸载了软件，这些启动项还在。真的，苹果这设计是不是有点太不人性化了？&lt;/p&gt;&lt;section&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;strong&gt;第1步&lt;/strong&gt;：运行脚本获取后台运行项目列表&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&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;-c&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;echo &quot; - $(date) -&quot;; while IFS= read -r eachPlist; do echo &quot;-$eachPlist&quot;;  /usr/bin/defaults read &quot;$eachPlist&quot;; done &amp;lt;&amp;lt;&amp;lt; &quot;$(/usr/bin/find /Library/LaunchDaemons /Library/LaunchAgents ~/Library/LaunchAgents /private/var/root/Library/LaunchAgents /private/var/root/Library/LaunchDaemons -name &quot;*.plist&quot;)&quot;; /usr/bin/defaults read com.apple.loginWindow LogoutHook; /usr/bin/defaults read com.apple.loginWindow LoginHook&lt;/span&gt;&lt;span&gt;&apos;&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;&lt;span&gt;~/Desktop/launch.txt&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这条命令会在桌面上生成一个 launch.txt 文件，里面包含了所有后台运行项目的详细信息。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第2步&lt;/strong&gt;：打开桌面的 launch.txt 文件，整理失效的项目&lt;/p&gt;&lt;p&gt;在文件中找到那些已卸载软件的 plist 路径，比如：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/Library/LaunchDaemons/com.microsoft.autoupdate.helper.plist&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;把这些路径记下来，准备删除。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第3步&lt;/strong&gt;：删除失效的启动项&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-f&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/Library/LaunchDaemons/com.microsoft.autoupdate.helper.plist&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;记得把路径换成你自己找到的那些失效的 plist 文件路径。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第4步&lt;/strong&gt;：重启电脑&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;reboot&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;重启之后，再去”允许在后台”看看，那些残留的软件名应该都不见了。真的，这种干净的感觉，真的特别爽！&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;问题四：.DS_Store文件到处生成，这问题的临时解决方案&lt;a href=&quot;#问题四ds_store文件到处生成这问题的临时解决方案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这个问题真的让我心累了很长时间。每次我把代码传到共享服务器，或者用U盘拷东西，总是会莫名其妙多出很多 .DS_Store 文件。跟 Windows 和 Linux 用户协作的时候，人家看到这些文件就会问：“这些是什么？“真的特别尴尬。&lt;/p&gt;&lt;p&gt;你知道吗？.DS_Store 是 macOS 自动生成的文件，用来存储文件夹的显示设置（比如图标位置、大小等）。说实话，这个功能本身是好的，但是到处”拉屎”就真的让人很头大了。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;删除当前目录下的所有 .DS_Store 文件&lt;a href=&quot;#删除当前目录下的所有-ds_store-文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果你想一次性删除某个目录下的所有 .DS_Store 文件，用这条命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;find&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;&apos;&lt;/span&gt;&lt;span&gt;.DS_Store&lt;/span&gt;&lt;span&gt;&apos;&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;f&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-delete&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这条命令会递归删除当前目录及其子目录中的所有 .DS_Store 文件。我跟你讲，这条命令真的特别管用，一键清理，超级方便。（小声说：虽然暂时删除了但，后期还是会继续生成的哦）&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;禁止在网络共享目录生成 .DS_Store&lt;a href=&quot;#禁止在网络共享目录生成-ds_store&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这样可以避免与 Windows/Linux 用户协作时的目录污染，设置方法：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;defaults&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;write&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;com.apple.desktopservices&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DSDontWriteNetworkStores&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-bool&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TRUE&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这条命令的意思就是”不要在网络共享目录生成 .DS_Store 文件”。真的，设置之后，再也不用担心污染共享目录了。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;禁止在U盘/外接存储生成 .DS_Store&lt;a href=&quot;#禁止在u盘外接存储生成-ds_store&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果你也想在外置存储设备上禁用 .DS_Store 文件，输入：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;defaults&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;write&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;com.apple.desktopservices&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DSDontWriteUSBStores&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-bool&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TRUE&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;设置之后，你的U盘、移动硬盘这些外接存储设备，再也不会莫名其妙出现 .DS_Store 文件了。&lt;/p&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;killall&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Finder&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这条命令会重启 Finder，让上面的设置立即生效。一定要记得执行这一步，否则设置不会马上生效哦。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;code&gt;xattr -cr&lt;/code&gt; 清除扩展属性&lt;br /&gt;
✅ &lt;strong&gt;菜单栏残留项目&lt;/strong&gt;：删除 group.com.apple.controlcenter.plist&lt;br /&gt;
✅ &lt;strong&gt;后台残留应用&lt;/strong&gt;：清理 LaunchAgents/LaunchDaemons 里的 plist 文件&lt;br /&gt;
✅ &lt;strong&gt;.DS_Store 到处生成&lt;/strong&gt;：用 defaults 命令禁用网络和USB存储生成&lt;/p&gt;&lt;p&gt;说实话，macOS 虽然有些设计真的很让人头大，但只要掌握了这些技巧，你会发现它其实还是挺好用的。&lt;/p&gt;&lt;p&gt;如果你觉得这篇文章对你有帮助，记得分享给身边也遇到这些问题的朋友。毕竟，翻车这种事情，大家一起避坑才是最好的！&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>从网络受限到畅通无阻:群晖 Docker 代理配置经验分享</title><link>https://blog.moewah.com/posts/synology-docker-proxy-configuration-pitfall-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/synology-docker-proxy-configuration-pitfall-guide/</guid><description>群晖NAS Docker无法拉取镜像？容器访问外部网络失败？本文详细解析代理配置踩坑点，提供systemd服务覆盖法的完整解决方案，助你轻松解决Docker网络代理问题。</description><pubDate>Sat, 05 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;说实话,刚开始用群晖 NAS 跑 Docker 的时候,我真的踩了不少坑。&lt;/p&gt;
&lt;p&gt;你有没有遇到过这种情况:明明网络没问题,但 Docker 就是死活拉取不了镜像,或者容器内部怎么都访问不了外部资源?我当时真的崩溃了,折腾了好久才发现,原来是代理配置的问题。&lt;/p&gt;
&lt;p&gt;今天我就把我的踩坑经验分享给你,帮你避坑避雷。&lt;/p&gt;
&lt;section&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;ol&gt;
&lt;li&gt;&lt;strong&gt;SSH 能用吗?&lt;/strong&gt; 确保你的群晖 NAS 开启了 SSH,而且能通过终端连接&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代理服务器准备好了吗?&lt;/strong&gt; 局域网里得有个可用的 HTTP/HTTPS 代理,把 IP 和端口记好(比如 &lt;code&gt;192.168.1.100:7890&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;⚠️ 重要提醒:&lt;/strong&gt; 配置代理并重启 Docker 会停掉所有运行中的容器!先保存好数据,别像我当时那样手忙脚乱&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&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;说实话,这是我试了 N 种方法之后,发现最稳定、最适合 DSM 7.x 的方式。&lt;/p&gt;&lt;p&gt;原理就是给 Docker 守护进程设置环境变量,让它走代理。听着很复杂?其实步骤很简单。&lt;/p&gt;&lt;section&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;用你的 SSH 客户端连上群晖。&lt;/p&gt;&lt;/section&gt;&lt;section&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;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mkdir&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;/etc/systemd/system/pkg-ContainerManager-dockerd.service.d&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;vi&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/systemd/system/pkg-ContainerManager-dockerd.service.d/http-proxy.conf&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;code&gt;i&lt;/code&gt; 进入插入模式,粘贴下面的内容。&lt;strong&gt;记住把 IP 和端口换成你自己的!&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;Service&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Environment&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;HTTP_PROXY=http://YOUR_PROXY_IP:PORT&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Environment&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;HTTPS_PROXY=http://YOUR_PROXY_IP:PORT&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Environment&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;NO_PROXY=localhost,127.0.0.1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;比如我的代理是 &lt;code&gt;192.168.1.100:7890&lt;/code&gt;,配置就长这样:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;Service&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Environment&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;HTTP_PROXY=http://192.168.1.100:7890&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Environment&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;HTTPS_PROXY=http://192.168.1.100:7890&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Environment&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;NO_PROXY=localhost,127.0.0.1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;编辑完按 &lt;code&gt;Esc&lt;/code&gt; 退出插入模式,输入 &lt;code&gt;:wq&lt;/code&gt; 保存退出。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第5步:重新加载 systemd 配置&lt;a href=&quot;#第5步重新加载-systemd-配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;daemon-reload&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第6步:重启 Docker 服务&lt;a href=&quot;#第6步重启-docker-服务&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;synosystemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;restart&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pkgctl-ContainerManager&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第7步:验证配置&lt;a href=&quot;#第7步验证配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;跑这个命令看看环境变量设置成功了没:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;show&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--property=Environment&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pkg-ContainerManager-dockerd.service&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;或者用 &lt;code&gt;docker info&lt;/code&gt;,在输出里找代理信息。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;方法二.json 文件配置&lt;a href=&quot;#方法二json-文件配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这个方法是 Docker 的通用配置方式,在大多数 Linux 系统上都能用。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;第1步 连接到群晖&lt;a href=&quot;#第1步-连接到群晖-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;老规矩,先用 SSH 连上去。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第2步:创建或编辑 daemon.json&lt;a href=&quot;#第2步创建或编辑-daemonjson&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;配置文件在 &lt;code&gt;/etc/docker/daemon.json&lt;/code&gt;,没有就创建一个:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;vi&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/docker/daemon.json&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;p&gt;按 &lt;code&gt;i&lt;/code&gt; 进入插入模式,粘贴下面的配置:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;proxies&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;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;default&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;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;httpProxy&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;http://YOUR_PROXY_IP:PORT&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;httpsProxy&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;http://YOUR_PROXY_IP:PORT&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;noProxy&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;localhost,127.0.0.1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;注意:&lt;/strong&gt; 这是新版本 Docker 推荐的写法。如果你的 Docker 版本比较老,或者上面这个不管用,试试这个:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;http-proxy&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;http://YOUR_PROXY_IP:PORT&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https-proxy&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;http://YOUR_PROXY_IP:PORT&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;no-proxy&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;localhost,127.0.0.1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;别忘了把 IP 和端口换成你的!比如我的配置:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;proxies&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;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;default&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;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;httpProxy&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;http://192.168.1.100:7890&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;httpsProxy&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;http://192.168.1.100:7890&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;noProxy&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;localhost,127.0.0.1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;编辑完按 &lt;code&gt;Esc&lt;/code&gt;,输入 &lt;code&gt;:wq&lt;/code&gt; 保存退出。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第4步:重启 Docker 服务&lt;a href=&quot;#第4步重启-docker-服务&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;synosystemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;restart&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pkgctl-ContainerManager&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第5步:验证配置&lt;a href=&quot;#第5步验证配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;跑 &lt;code&gt;docker info&lt;/code&gt;,在输出里找 “HTTP Proxy” 和 “HTTPS Proxy” 的信息。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;关于 SOCKS5 代理的吐槽&lt;a href=&quot;#关于-socks5-代理的吐槽&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;说实话,Docker 守护进程的代理配置&lt;strong&gt;不直接支持 SOCKS5&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;我当时也是踩了这个坑,以为直接配置 SOCKS5 就能行,结果试了半天都是白费功夫。&lt;/p&gt;&lt;p&gt;如果你非要用 SOCKS5,有两个办法:&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;搞个转换代理:&lt;/strong&gt; 在群晖或者局域网其他设备上跑个转换工具(比如 &lt;code&gt;privoxy&lt;/code&gt;、&lt;code&gt;squid&lt;/code&gt;),把 HTTP/HTTPS 请求转成 SOCKS5&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;容器里搞定:&lt;/strong&gt; 如果只是某个容器需要代理,可以在容器内配置环境变量 &lt;code&gt;ALL_PROXY&lt;/code&gt; 或 &lt;code&gt;SOCKS_PROXY&lt;/code&gt;,或者装个 &lt;code&gt;proxychains&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&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;老实讲,在群晖 DSM 7.x 上配置 Docker 代理,我推荐你用 &lt;strong&gt;systemd 服务覆盖文件&lt;/strong&gt; 的方式。为什么?因为它跟群晖的服务管理机制更贴合,稳定性真的好很多。&lt;/p&gt;&lt;p&gt;不管你选哪种方法:&lt;/p&gt;&lt;p&gt;✅ 操作前一定要备份数据
✅ 仔细核对代理服务器信息
✅ 配置完记得验证&lt;/p&gt;&lt;p&gt;&lt;strong&gt;现在就可以开始:&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;确认你的代理服务器 IP 和端口&lt;/li&gt;
&lt;li&gt;选一个配置方法(推荐方法一)&lt;/li&gt;
&lt;li&gt;照着步骤一步步来&lt;/li&gt;
&lt;li&gt;重启 Docker 服务并验证&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;相信我,配置完之后,你会发现 Docker 真的很香!镜像想拉就拉,容器想访问外网就访问,再也不用卡在网络问题上崩溃了。&lt;/p&gt;&lt;p&gt;如果你在配置过程中遇到任何问题,随时来问我,我们一起搞定它!&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>tmux 终端效率提升 300% 的实战指南</title><link>https://blog.moewah.com/posts/tmux-terminal-efficiency-boost-300/</link><guid isPermaLink="true">https://blog.moewah.com/posts/tmux-terminal-efficiency-boost-300/</guid><description>如何通过 tmux 提升终端操作效率？本文详细拆解 tmux 的安装、配置与使用技巧，解决多窗口切换混乱问题，实现高效开发环境管理，助你用 1 个终端搞定所有任务。</description><pubDate>Sat, 05 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;说实话，我刚接触 tmux 的时候，是真的踩了一堆坑。那时候每次要在终端里切换项目，都得开七八个终端窗口，Ctrl+Tab 切得我手都酸了。&lt;/p&gt;
&lt;p&gt;直到有一天，我看到同事用 tmux，一个屏幕搞定所有事情，我当时就震惊了。你知道吗？自从我用上 tmux，我的终端操作效率真的提升了至少 300%，这不是夸张。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;什么是 tmux？为什么要用它？&lt;a href=&quot;#什么是-tmux为什么要用它&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;tmux（Terminal Multiplexer）简单说就是终端复用器。它让你在一个终端窗口里运行多个会话，随时切换，随时断开重连。&lt;/p&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;：开 8 个终端窗口，切来切去，万一不小心关错一个，工作就白费了&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;现在&lt;/strong&gt;：1 个 tmux 会话，4 个窗口，每个窗口再分 2-3 个窗格，一目了然&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;最绝的是，如果你是远程 SSH 连服务器，断网后再连，原来的工作环境全都在，这真的太爽了。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;准备工作：安装和启动&lt;a href=&quot;#准备工作安装和启动&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;安装 tmux&lt;a href=&quot;#安装-tmux&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;说实话，安装真的超级简单，一行命令就搞定了。&lt;/p&gt;&lt;p&gt;根据你的系统，选择对应的命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Ubuntu 或 Debian&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt-get&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# CentOS 或 Fedora&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yum&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Mac（我用的就是这个）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;brew&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;安装完之后，记得检查一下版本：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--version&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;为什么建议用 2.3 及以上版本？&lt;/strong&gt;
老实讲，我一开始用老版本，踩了不少坑。新版本的特性更多，鼠标支持更稳定，bug 也少。我建议你直接用最新版，别折腾老版本。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;启动 tmux&lt;a href=&quot;#启动-tmux&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;安装完成后，直接在终端输入：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后你会看到终端底部出现一个状态栏，左边是窗口信息（编号和名称），右边是系统信息。&lt;/p&gt;&lt;p&gt;这时候你就进入 tmux 会话了！是不是很简单？&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第一次用的小提示：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;底部状态栏会告诉你当前在哪个窗口（比如 &lt;code&gt;1:zsh*&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;左边的数字是窗口编号，后面是窗口名称&lt;/li&gt;
&lt;li&gt;星号 &lt;code&gt;*&lt;/code&gt; 表示这是当前窗口&lt;/li&gt;
&lt;li&gt;按 Prefix （默认绑定&lt;code&gt;Ctrl+b&lt;/code&gt; ）然后 &lt;code&gt;d&lt;/code&gt; 可以退出但保留会话（别直接关终端窗口！）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;默认情况下，tmux 是不支持鼠标的，只能用快捷键。老实讲，刚开始用快捷键我崩溃了好几次。&lt;/p&gt;&lt;p&gt;开启鼠标支持其实很简单，在 &lt;code&gt;~/.tmux.conf&lt;/code&gt; 里添加一行就行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 开启鼠标支持&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-g&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mouse&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后重新加载配置：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 按 Ctrl+b（默认前缀），然后输入以下命令&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;:source-file&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.tmux.conf&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 或直接使用下面命令重载配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;source-file&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.tmux.conf&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;验证配置是否生效：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 重新加载配置后，可以通过以下命令检查全局选项&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tmux show-options -g&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&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;用鼠标点击窗格切换，比按方向键快 5 倍&lt;/li&gt;
&lt;li&gt;直接拖拽调整窗格大小，不用记一堆快捷键&lt;/li&gt;
&lt;li&gt;用鼠标滚轮查看历史输出，效率翻倍&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&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;以下是我自己用的配置，经过我 3 年的反复调优，真的特别好使：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 修改前缀键为 Ctrl+a（更符合肌肉记忆）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;unbind&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;C-b&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-g&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;prefix&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;C-a&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;bind&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;C-a&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;send-prefix&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 状态栏样式（深色背景，绿色文字）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-g&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;status-bg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;colour235&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-g&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;status-fg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;colour136&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-g&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;status-interval&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 窗口列表样式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;setw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-g&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;window-status-format&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;#[fg=green]#[bg=black] #I:#W &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;setw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-g&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;window-status-current-format&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;#[fg=black]#[bg=yellow] #I:#W &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 开启 vi 模式（如果你会用 vim，这个很爽）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;setw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-g&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mode-keys&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;vi&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 开启鼠标支持&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-g&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mouse&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 复制模式使用系统剪贴板&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;bind-key&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;copy-mode-vi&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;send-keys&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;copy-pipe-and-cancel&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;pbcopy&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&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;Prefix&lt;/code&gt;绑定使用&lt;code&gt;Ctrl+a&lt;/code&gt; 比默认的 &lt;code&gt;Ctrl+b&lt;/code&gt; 更顺手，因为小拇指离 a 更近&lt;/li&gt;
&lt;li&gt;黄色高亮当前窗口，一眼就能看到自己在哪个窗口&lt;/li&gt;
&lt;li&gt;vi 模式 + 系统剪贴板，复制粘贴效率提升 10 倍&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&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;说实话，tmux 的快捷键特别多，但实际日常使用，记住下面这些就够了。&lt;/p&gt;&lt;section&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;创建新会话&lt;/td&gt;&lt;td&gt;&lt;code&gt;tmux new -s session_name&lt;/code&gt;&lt;/td&gt;&lt;td&gt;给会话起个名字，方便管理&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;列出会话&lt;/td&gt;&lt;td&gt;&lt;code&gt;tmux ls&lt;/code&gt;&lt;/td&gt;&lt;td&gt;看看当前有哪些会话&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;附加到会话&lt;/td&gt;&lt;td&gt;&lt;code&gt;tmux attach -t session_name&lt;/code&gt;&lt;/td&gt;&lt;td&gt;回到之前的会话&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;分离会话&lt;/td&gt;&lt;td&gt;&lt;code&gt;Ctrl+a&lt;/code&gt; 然后 &lt;code&gt;d&lt;/code&gt;&lt;/td&gt;&lt;td&gt;退出但保留会话&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;杀死会话&lt;/td&gt;&lt;td&gt;&lt;code&gt;tmux kill-session -t session_name&lt;/code&gt;&lt;/td&gt;&lt;td&gt;彻底删除&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&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;新建窗口&lt;/td&gt;&lt;td&gt;&lt;code&gt;Prefix&lt;/code&gt; 然后 &lt;code&gt;c&lt;/code&gt;&lt;/td&gt;&lt;td&gt;create，创建新窗口&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;下一个窗口&lt;/td&gt;&lt;td&gt;&lt;code&gt;Prefix&lt;/code&gt; 然后 &lt;code&gt;n&lt;/code&gt;&lt;/td&gt;&lt;td&gt;next&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;上一个窗口&lt;/td&gt;&lt;td&gt;&lt;code&gt;Prefix&lt;/code&gt; 然后 &lt;code&gt;p&lt;/code&gt;&lt;/td&gt;&lt;td&gt;previous&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;重命名窗口&lt;/td&gt;&lt;td&gt;&lt;code&gt;Prefix&lt;/code&gt; 然后 &lt;code&gt;,&lt;/code&gt;&lt;/td&gt;&lt;td&gt;给窗口起名字&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;关闭窗口&lt;/td&gt;&lt;td&gt;&lt;code&gt;Prefix&lt;/code&gt; 然后 &lt;code&gt;&amp;amp;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;退出当前窗口&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&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;水平分割&lt;/td&gt;&lt;td&gt;&lt;code&gt;Prefix&lt;/code&gt; 然后 &lt;code&gt;&quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;上下分屏&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;垂直分割&lt;/td&gt;&lt;td&gt;&lt;code&gt;Prefix&lt;/code&gt; 然后 &lt;code&gt;%&lt;/code&gt;&lt;/td&gt;&lt;td&gt;左右分屏&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;切换窗格&lt;/td&gt;&lt;td&gt;&lt;code&gt;Prefix&lt;/code&gt; 然后 &lt;code&gt;o&lt;/code&gt;&lt;/td&gt;&lt;td&gt;自动切换到下一个&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;方向键切换&lt;/td&gt;&lt;td&gt;&lt;code&gt;Prefix&lt;/code&gt; 然后 &lt;code&gt;方向键&lt;/code&gt;&lt;/td&gt;&lt;td&gt;直接跳到指定方向&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;调整大小&lt;/td&gt;&lt;td&gt;&lt;code&gt;Prefix&lt;/code&gt; 然后 &lt;code&gt;Ctrl+方向键&lt;/code&gt;&lt;/td&gt;&lt;td&gt;拖拽调整窗格大小&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;关闭窗格&lt;/td&gt;&lt;td&gt;&lt;code&gt;Prefix&lt;/code&gt; 然后 &lt;code&gt;x&lt;/code&gt;&lt;/td&gt;&lt;td&gt;关闭当前窗格&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&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;进入复制模式&lt;/td&gt;&lt;td&gt;&lt;code&gt;Prefix&lt;/code&gt; 然后 &lt;code&gt;[&lt;/code&gt;&lt;/td&gt;&lt;td&gt;可以滚动查看历史输出&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;退出复制模式&lt;/td&gt;&lt;td&gt;按 &lt;code&gt;q&lt;/code&gt;&lt;/td&gt;&lt;td&gt;退出&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;开始选择&lt;/td&gt;&lt;td&gt;按空格&lt;/td&gt;&lt;td&gt;标记开始位置&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;复制文本&lt;/td&gt;&lt;td&gt;移动光标后按 &lt;code&gt;y&lt;/code&gt;&lt;/td&gt;&lt;td&gt;复制到系统剪贴板&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;这是我最喜欢 tmux 的地方！每次新项目开始，我都用脚本一键创建整个工作环境。&lt;/p&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#!/bin/bash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;SESSION_NAME&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;my_project&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 如果会话不存在，就创建一个&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;has-session&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;$SESSION_NAME&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;/dev/null&lt;/span&gt;&lt;span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 创建会话，第一个窗口叫 editor&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new-session&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-s&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$SESSION_NAME&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;editor&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 在编辑器窗口里垂直分屏&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;split-window&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-h&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;$SESSION_NAME&lt;/span&gt;&lt;span&gt;:1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 左边窗格开 vim，右边窗格开 htop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;send-keys&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;$SESSION_NAME&lt;/span&gt;&lt;span&gt;:1.1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;vim src/index.js&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;C-m&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;send-keys&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;$SESSION_NAME&lt;/span&gt;&lt;span&gt;:1.2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;htop&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;C-m&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 创建第二个窗口，运行开发服务器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new-window&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;$SESSION_NAME&lt;/span&gt;&lt;span&gt;:2&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;server&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;send-keys&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;$SESSION_NAME&lt;/span&gt;&lt;span&gt;:2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;npm run dev&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;C-m&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 创建第三个窗口，查看日志&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new-window&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;$SESSION_NAME&lt;/span&gt;&lt;span&gt;:3&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;logs&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;split-window&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;-t&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$SESSION_NAME&lt;/span&gt;&lt;span&gt;:3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;send-keys&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;$SESSION_NAME&lt;/span&gt;&lt;span&gt;:3.1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;tail -f logs/app.log&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;C-m&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;send-keys&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;$SESSION_NAME&lt;/span&gt;&lt;span&gt;:3.2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;tail -f logs/error.log&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;C-m&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 回到第一个窗口&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;select-window&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;$SESSION_NAME&lt;/span&gt;&lt;span&gt;:1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fi&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 附加到会话&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;attach&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;$SESSION_NAME&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;这个脚本做了什么？&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;检查会话是否存在，避免重复创建&lt;/li&gt;
&lt;li&gt;创建 3 个窗口：编辑器、服务器、日志&lt;/li&gt;
&lt;li&gt;编辑器窗口分左右两屏，左边写代码，右边看系统状态&lt;/li&gt;
&lt;li&gt;日志窗口分上下两屏，同时看应用日志和错误日志&lt;/li&gt;
&lt;li&gt;全自动，运行脚本就能直接开始工作&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#!/bin/bash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;SESSION_NAME&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;your_session_name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;has-session&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;$SESSION_NAME&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;/dev/null&lt;/span&gt;&lt;span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 创建会话并命名第一个窗口&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new-session&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-s&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$SESSION_NAME&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;window1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 在窗口1中分割窗格&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;split-window&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-h&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;$SESSION_NAME&lt;/span&gt;&lt;span&gt;:1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;split-window&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;-t&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$SESSION_NAME&lt;/span&gt;&lt;span&gt;:1.1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;select-layout&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;$SESSION_NAME&lt;/span&gt;&lt;span&gt;:1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tiled&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 在各个窗格中执行命令&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;send-keys&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;$SESSION_NAME&lt;/span&gt;&lt;span&gt;:1.1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;command_for_pane1&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;C-m&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;send-keys&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;$SESSION_NAME&lt;/span&gt;&lt;span&gt;:1.2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;command_for_pane2&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;C-m&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;send-keys&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;$SESSION_NAME&lt;/span&gt;&lt;span&gt;:1.3&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;command_for_pane3&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;C-m&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 创建其他窗口&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new-window&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;$SESSION_NAME&lt;/span&gt;&lt;span&gt;:2&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;window2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;send-keys&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;$SESSION_NAME&lt;/span&gt;&lt;span&gt;:2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;command_for_window2&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;C-m&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 返回到窗口1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;select-window&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;$SESSION_NAME&lt;/span&gt;&lt;span&gt;:1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fi&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;attach&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;$SESSION_NAME&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;创建会话&lt;/td&gt;&lt;td&gt;&lt;code&gt;tmux new-session -s name -n win -d&lt;/code&gt;&lt;/td&gt;&lt;td&gt;-d 表示在后台创建&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;创建窗口&lt;/td&gt;&lt;td&gt;&lt;code&gt;tmux new-window -t session:2 -n win2&lt;/code&gt;&lt;/td&gt;&lt;td&gt;创建第2个窗口&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;水平分屏&lt;/td&gt;&lt;td&gt;&lt;code&gt;tmux split-window -h -t session:1.1&lt;/code&gt;&lt;/td&gt;&lt;td&gt;-h 表示水平&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;垂直分屏&lt;/td&gt;&lt;td&gt;&lt;code&gt;tmux split-window -v -t session:1.2&lt;/code&gt;&lt;/td&gt;&lt;td&gt;-v 表示垂直&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;选择布局&lt;/td&gt;&lt;td&gt;&lt;code&gt;tmux select-layout -t session:1 tiled&lt;/code&gt;&lt;/td&gt;&lt;td&gt;tiled 是平铺布局&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;发送命令&lt;/td&gt;&lt;td&gt;&lt;code&gt;tmux send-keys -t session:1.1 &apos;cmd&apos; C-m&lt;/code&gt;&lt;/td&gt;&lt;td&gt;C-m 表示回车&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;even-horizontal&lt;/code&gt;：窗格平均水平分布&lt;/li&gt;
&lt;li&gt;&lt;code&gt;even-vertical&lt;/code&gt;：窗格平均垂直分布&lt;/li&gt;
&lt;li&gt;&lt;code&gt;main-horizontal&lt;/code&gt;：一个大的在上，小的在下&lt;/li&gt;
&lt;li&gt;&lt;code&gt;main-vertical&lt;/code&gt;：一个大的在左，小的在右&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tiled&lt;/code&gt;：所有窗格平铺（我最常用的）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;我用 tmux 3 年了，总结下来真正重要的就这些：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;安装最新版本&lt;/strong&gt;：建议 2.3 及以上版本，鼠标支持更稳定，特性更多&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开启鼠标支持&lt;/strong&gt;：别折腾快捷键，用鼠标效率更高&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置好基础设置&lt;/strong&gt;：Ctrl+a 前缀、vi 模式、状态栏样式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;记住核心快捷键&lt;/strong&gt;：创建窗口（c）、分屏（”/ %）、切换（n/p/o）&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;根据系统安装 tmux，检查版本是否是 2.3+&lt;/li&gt;
&lt;li&gt;把鼠标支持配置加上&lt;/li&gt;
&lt;li&gt;记住 5 个最常用的快捷键&lt;/li&gt;
&lt;li&gt;为你当前项目写一个启动脚本&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;相信我，坚持用 tmux 一周，你会回不去原来那种开七八个终端窗口的方式的。我已经完全离不开它了，每次用别人的电脑没有 tmux，我都特别不习惯。&lt;/p&gt;&lt;p&gt;试试看吧，真的会打开新世界的大门！&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>从零搭建Astro博客并部署到Netlify</title><link>https://blog.moewah.com/posts/zero-to-astro-blog-deployment-netlify/</link><guid isPermaLink="true">https://blog.moewah.com/posts/zero-to-astro-blog-deployment-netlify/</guid><description>如何用Astro构建高性能博客？本文手把手教你从零搭建Astro博客系统，包含项目创建、结构解析和Netlify部署全流程，助你快速上线SEO友好的静态博客网站。</description><pubDate>Sat, 29 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;去年折腾了一圈 Hugo 和 Hexo，最后还是回到了 Astro。原因很简单：Lighthouse 性能分数从 62 分涨到了 98 分。&lt;/p&gt;
&lt;p&gt;本文记录我从零搭建 Astro 博客并部署到 Netlify 的全过程。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;Astro 是什么&lt;a href=&quot;#astro-是什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Astro 是个静态网站生成器，核心就两个特点：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;零 JS 运行时&lt;/strong&gt;：默认生成纯 HTML + CSS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;孤岛架构&lt;/strong&gt;：只有需要交互的组件才加载 JavaScript&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这意味着什么？你的博客文章页面只会渲染 HTML 和 CSS，除非你自己加了交互组件。我之前用 Next.js 写博客，Lighthouse 性能分数一直在 60-70 分徘徊，换成 Astro 后直接干到 98 分。&lt;/p&gt;&lt;p&gt;框架无关也是个亮点。React、Vue、Svelte 都能混着用，或者干脆纯 HTML。我的博客主站用纯 Astro，后台管理页面用了 React，各司其职。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;strong&gt;Node.js&lt;/strong&gt; 18.14.1 或更高版本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;npm/yarn/pnpm&lt;/strong&gt; 任选一个&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;代码编辑器（VS Code 就行）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;基础知识：HTML、CSS、JavaScript 基础，Markdown 语法，Git 基本操作。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;创建 Astro 项目&lt;a href=&quot;#创建-astro-项目&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;两种方式，看你时间紧不紧。&lt;/p&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;astro@latest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-blog&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;按照提示选就行：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;模板选 “blog” 或 “blank”&lt;/li&gt;
&lt;li&gt;TypeScript 推荐选 “严格” 模式&lt;/li&gt;
&lt;li&gt;其他一路回车&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;astro@latest&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-blog&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--template&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;blog&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这个会自带一堆示例配置，适合想快速上手的。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;my-blog/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── public/              # 静态资源&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── favicon.svg&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   └── images/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── src/                # 源码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── components/     # 组件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── content/        # 内容&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   └── posts/      # 博客文章&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── layouts/        # 布局&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── pages/          # 页面（文件即路由）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   └── styles/         # 样式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── astro.config.mjs    # 配置文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└── package.json&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;几个关键目录：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;src/pages/&lt;/strong&gt;：文件即路由，&lt;code&gt;src/pages/about.astro&lt;/code&gt; 就是 &lt;code&gt;/about&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;src/content/&lt;/strong&gt;：放博客文章的地方，支持 Content Collections&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;src/components/&lt;/strong&gt;：可复用组件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;src/layouts/&lt;/strong&gt;：页面布局模板&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;public/&lt;/strong&gt;：静态资源，原封不动复制到输出目录&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&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;astro.config.mjs&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&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;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro/config&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mdx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;@astrojs/mdx&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sitemap&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;@astrojs/sitemap&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tailwind&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;@astrojs/tailwind&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;https://your-blog.netlify.app&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;integrations&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;mdx&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;sitemap&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;tailwind&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;shikiConfig&lt;/span&gt;&lt;span&gt;:&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;theme&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;github-dark&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;wrap&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;site&lt;/code&gt; 字段记得改成你的域名，不然 sitemap 会生成错。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Content Collections 配置&lt;a href=&quot;#content-collections-配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Astro 推荐用 Content Collections 管理内容。在 &lt;code&gt;src/content/config.ts&lt;/code&gt; 定义 schema：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&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;z&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro:content&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;blog&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;content&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&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;z&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;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&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;z&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;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;coerce&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;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;updatedDate&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&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;&lt;span&gt;coerce&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;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;optional&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;heroImage&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&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;&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;optional&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&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;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;array&lt;/span&gt;&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;&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;default&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;boolean&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;default&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&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;collections&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;blog&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这样写文章时 frontmatter 格式不对，构建会直接报错。我刚开始没加 schema，写了篇文章把 &lt;code&gt;publishDate&lt;/code&gt; 写成 &lt;code&gt;date&lt;/code&gt;，跑到线上才发现 404。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;src/content/blog/&lt;/code&gt; 创建 &lt;code&gt;first-post.md&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&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;&apos;&lt;/span&gt;&lt;span&gt;我的第一篇博客文章&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&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;&apos;&lt;/span&gt;&lt;span&gt;欢迎来到我使用Astro搭建的博客！&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;publishDate&lt;/span&gt;&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;&lt;/span&gt;&lt;span&gt;2025-08-30&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;博客&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;入门&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;这是我使用 Astro 框架搭建的第一篇博客文章。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;##&lt;/span&gt;&lt;span&gt; Astro 的优势&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; 超快的页面加载速度&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; 优秀的 SEO 性能&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; 现代化的开发体验&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;src/layouts/BlogLayout.astro&lt;/code&gt; 创建博客布局：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;interface&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;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&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;string&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&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;string&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&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;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;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;Astro&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;/span&gt;&lt;span&gt;DOCTYPE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;html&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;html&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;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;zh-CN&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;head&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;charset&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;UTF-8&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;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;meta&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;&quot;&lt;/span&gt;&lt;span&gt;viewport&lt;/span&gt;&lt;span&gt;&quot;&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;&quot;&lt;/span&gt;&lt;span&gt;width=device-width, initial-scale=1.0&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;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&amp;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;&amp;lt;/&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&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;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;meta&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;&quot;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&quot;&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;description&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;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rel&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;icon&lt;/span&gt;&lt;span&gt;&quot;&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;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;image/svg+xml&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/favicon.svg&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;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;head&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;header&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;nav&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&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; &lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&quot;&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;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&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; &lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/blog&lt;/span&gt;&lt;span&gt;&quot;&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;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&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; &lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/about&lt;/span&gt;&lt;span&gt;&quot;&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;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;nav&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;header&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;slot&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;footer&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;copy&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; 2025 我的博客. All rights reserved.&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;footer&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;html&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;添加 RSS 订阅&lt;a href=&quot;#添加-rss-订阅&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;安装插件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@astrojs/rss&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;创建 &lt;code&gt;src/pages/rss.xml.js&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&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;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;@astrojs/rss&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;getCollection&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;astro:content&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GET&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;context&lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;posts&lt;/span&gt;&lt;span&gt; &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; &lt;/span&gt;&lt;span&gt;getCollection&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;blog&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&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;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&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;&apos;&lt;/span&gt;&lt;span&gt;我的博客&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&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;&apos;&lt;/span&gt;&lt;span&gt;分享技术和生活的点点滴滴&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&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;&lt;span&gt;context&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;posts&lt;/span&gt;&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;&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;=&amp;gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&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;post&lt;/span&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pubDate&lt;/span&gt;&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;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;publishDate&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&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;post&lt;/span&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;description&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;/blog/&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;slug&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;用 Pagefind，免费且支持中文。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pagefind&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;在 &lt;code&gt;package.json&lt;/code&gt; 修改构建命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;scripts&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;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;build&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;astro build &amp;amp;&amp;amp; pagefind --site dist&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;SEO 优化&lt;a href=&quot;#seo-优化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;创建 &lt;code&gt;src/components/SEOHead.astro&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;interface&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;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&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;string&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&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;string&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;website&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;article&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&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;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;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;image&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;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;website&lt;/span&gt;&lt;span&gt;&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;Astro&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;canonicalURL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&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;&lt;span&gt;Astro&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;pathname&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Astro&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;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;socialImage&lt;/span&gt;&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;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&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;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Astro&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; &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- 基础 SEO 标签 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;meta&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;&quot;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&quot;&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;description&lt;/span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rel&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;canonical&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &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;canonicalURL&lt;/span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- Open Graph --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;property&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;og:type&lt;/span&gt;&lt;span&gt;&quot;&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;type&lt;/span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;property&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;og:title&lt;/span&gt;&lt;span&gt;&quot;&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;title&lt;/span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;property&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;og:description&lt;/span&gt;&lt;span&gt;&quot;&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;description&lt;/span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;property&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;og:url&lt;/span&gt;&lt;span&gt;&quot;&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;canonicalURL&lt;/span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt;socialImage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;property&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;og:image&lt;/span&gt;&lt;span&gt;&quot;&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;socialImage&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;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- Twitter Cards --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;meta&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;&quot;&lt;/span&gt;&lt;span&gt;twitter:card&lt;/span&gt;&lt;span&gt;&quot;&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;&quot;&lt;/span&gt;&lt;span&gt;summary_large_image&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;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;meta&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;&quot;&lt;/span&gt;&lt;span&gt;twitter:title&lt;/span&gt;&lt;span&gt;&quot;&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;title&lt;/span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;meta&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;&quot;&lt;/span&gt;&lt;span&gt;twitter:description&lt;/span&gt;&lt;span&gt;&quot;&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;description&lt;/span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&lt;span&gt;socialImage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;meta&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;&quot;&lt;/span&gt;&lt;span&gt;twitter:image&lt;/span&gt;&lt;span&gt;&quot;&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;socialImage&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;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;访问 &lt;code&gt;http://localhost:4321&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;构建生产版本：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;生成的静态文件在 &lt;code&gt;dist/&lt;/code&gt; 目录。&lt;/p&gt;&lt;p&gt;预览构建结果：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;preview&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;部署到 Netlify&lt;a href=&quot;#部署到-netlify&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Git 集成部署（推荐）&lt;a href=&quot;#git-集成部署推荐&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;创建 Git 仓库并推送到 GitHub：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;commit&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-m&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Initial commit&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;remote&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;origin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://github.com/your-username/your-blog.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-u&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;origin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;登录 &lt;a href=&quot;https://www.netlify.com/&quot; target=&quot;_blank&quot;&gt;Netlify&lt;/a&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;点击 “New site from Git”&lt;/li&gt;
&lt;li&gt;连接你的 GitHub 账户&lt;/li&gt;
&lt;li&gt;选择博客仓库&lt;/li&gt;
&lt;li&gt;配置构建设置：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Build command&lt;/strong&gt;: &lt;code&gt;npm run build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Publish directory&lt;/strong&gt;: &lt;code&gt;dist&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Node version&lt;/strong&gt;: 18&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;推送代码后 Netlify 会自动构建部署。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;CLI 部署&lt;a href=&quot;#cli-部署&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;安装 Netlify CLI：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-g&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;netlify-cli&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;登录并部署：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;netlify&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;login&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;netlify&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;netlify&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;deploy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--prod&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;环境变量在 Netlify 控制台的 &lt;strong&gt;Site Settings &amp;gt; Environment Variables&lt;/strong&gt; 添加。&lt;/p&gt;&lt;p&gt;自定义域名在 &lt;strong&gt;Domain Settings&lt;/strong&gt; 配置，HTTPS 会自动启用。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;使用 WebP 格式&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;ul&gt;
&lt;li&gt;按需加载 JavaScript&lt;/li&gt;
&lt;li&gt;优化 CSS bundle 大小&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;CDN 优化：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Netlify 自带 CDN&lt;/li&gt;
&lt;li&gt;配置缓存策略&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&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;Google Analytics 集成：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;async&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;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://www.googletagmanager.com/gtag/js?id=GA_ID&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;window&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;dataLayer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;window&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;dataLayer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;||&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gtag&lt;/span&gt;&lt;span&gt;&lt;span&gt;(){&lt;/span&gt;&lt;span&gt;dataLayer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;arguments&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;gtag&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;js&lt;/span&gt;&lt;span&gt;&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;new&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;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;gtag&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;GA_ID&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;性能监控用 Lighthouse，关注 Core Web Vitals 指标。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;ol&gt;
&lt;li&gt;检查 Node.js 版本&lt;/li&gt;
&lt;li&gt;清除缓存：&lt;code&gt;rm -rf node_modules package-lock.json &amp;amp;&amp;amp; npm install&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;检查 markdown 文件的 frontmatter 格式&lt;/li&gt;
&lt;li&gt;看构建日志的具体错误&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;样式问题？&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;确保 CSS 文件正确导入&lt;/li&gt;
&lt;li&gt;检查 Tailwind CSS 配置&lt;/li&gt;
&lt;li&gt;验证组件作用域样式&lt;/li&gt;
&lt;/ol&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;/section&gt;
&lt;section&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;评论系统可以集成 Giscus（基于 GitHub Discussions）或 Utterances（基于 GitHub Issues）。&lt;/p&gt;&lt;p&gt;内容管理考虑 Decap CMS（原 Netlify CMS）或 Sanity。&lt;/p&gt;&lt;p&gt;多语言支持在 &lt;code&gt;astro.config.mjs&lt;/code&gt; 配置：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&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;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&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; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;zh-cn&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&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;&quot;&lt;/span&gt;&lt;span&gt;zh-cn&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;en&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;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;我的踩坑记录&lt;a href=&quot;#我的踩坑记录&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;第一次部署时忘记设置 &lt;code&gt;site&lt;/code&gt; 字段，sitemap 生成的全是相对路径，搜索引擎抓不到。改完重新部署就好了。&lt;/p&gt;&lt;p&gt;还有一次 Content Collections schema 写错了，&lt;code&gt;publishDate&lt;/code&gt; 应该是 &lt;code&gt;z.coerce.date()&lt;/code&gt;，我写成了 &lt;code&gt;z.date()&lt;/code&gt;，结果日期格式一直不对，搞了半天才发现问题在哪。&lt;/p&gt;&lt;p&gt;图片优化踩的坑更多。一开始直接用高分辨率图片，Lighthouse 性能分数只有 80 分。后来改用 WebP + 懒加载，才干到 98 分。&lt;/p&gt;&lt;p&gt;Astro 的开发体验确实不错，但配置文件一开始会花点时间。建议从官方博客模板开始，然后慢慢改。&lt;/p&gt;&lt;p&gt;记住：博客是拿来写内容的，别一直折腾配置。能用就行，写作才是重点。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Node.js 和 NPM 更新到最新版本的完整指南</title><link>https://blog.moewah.com/posts/nodejs-npm-update-to-latest-version-complete-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/nodejs-npm-update-to-latest-version-complete-guide/</guid><description>如何快速更新Node.js和NPM？本文详细讲解使用NVM、包管理器及官方安装程序等方法，帮助开发者安全高效地升级到最新版本，确保功能、安全与兼容性。</description><pubDate>Wed, 19 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;拥有最新的Node.js 和 NPM 至关重要，因为开发者可以访问新的功能、安全修复和改进的性能。在这些工具中，您需要学习以下一般步骤才能快速更新它们。这是更新这两个工具最简单的指南。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;为什么要更新 Node.js 和 NPM？&lt;a href=&quot;#为什么要更新-nodejs-和-npm&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;以下是一些您应该更新 Node.js 和 NPM 的原因：&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;/section&gt;
&lt;section&gt;&lt;h2&gt;更新 Node.js 的方法&lt;a href=&quot;#更新-nodejs-的方法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;方法 1：使用 Node 版本管理器 (NVM)&lt;a href=&quot;#方法-1使用-node-版本管理器-nvm&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;NVM 是一个流行的管理多个 Node.js 版本的工具。&lt;/p&gt;&lt;p&gt;1、安装 NVM（如果尚未安装）&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;2、验证安装&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;command -v nvm&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;3、更新 Node.js
列出可用版本&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nvm list-remote&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;安装最新版本&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nvm install node&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;将其设置为默认版本&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nvm use node&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;方法 2：使用 Node.js 安装程序&lt;a href=&quot;#方法-2使用-nodejs-安装程序&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果您不使用 NVM，您可以直接从&lt;a href=&quot;https://node.org.cn/en&quot; target=&quot;_blank&quot;&gt;Node.js 官方网站&lt;/a&gt;获取安装程序。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;访问&lt;a href=&quot;https://node.org.cn/en&quot; target=&quot;_blank&quot;&gt;Node.js&lt;/a&gt; 下载页面。&lt;/li&gt;
&lt;li&gt;选择长期支持 (LTS) 版本或当前版本。&lt;/li&gt;
&lt;li&gt;下载安装程序并按照安装程序中显示的说明进行操作。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;p&gt;&lt;strong&gt;Windows：&lt;/strong&gt; 对于版本管理，应该使用&lt;a href=&quot;https://github.com/coreybutler/nvm-windows/releases&quot; target=&quot;_blank&quot;&gt;nvm-windows&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;macOS：&lt;/strong&gt; 使用&lt;a href=&quot;https://brew.sh/&quot; target=&quot;_blank&quot;&gt;Homebrew&lt;/a&gt;更新 Node.js&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;brew update&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;brew upgrade node&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Linux：&lt;/strong&gt; 使用 NodeSource 仓库&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl -fsSL https://deb.nodesource.com/setup_22.x | sudo bash -&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo apt-get install -y nodejs&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;更新 NPM&lt;a href=&quot;#更新-npm&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;与 Node.js 一样，在发布后更新 NPM 以及修复任何漏洞也至关重要。方法如下：&lt;/p&gt;&lt;section&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;运行以下命令以全局更新 NPM&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm install -g npm@latest&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm -v&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;p&gt;如果更新失败，您可以清除 NPM 缓存并重试&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm cache clean -f&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm install -g npm@latest&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;code&gt;Node.js/NPM&lt;/code&gt; ，而不是在生产环境中。&lt;/li&gt;
&lt;li&gt;使用版本管理工具： 有多个版本的 NVM，该工具使在它们之间切换变得容易。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&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;更新 Node.js 和 NPM 意味着您正在使用最新版本，其中包含新功能、安全修复和兼容性更改。无论您使用的是 NVM、安装程序还是包管理器，遵循上述方法都能使您的环境保持更新和清洁。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>通义 Z-Image-Turbo 系统提示词生成指南</title><link>https://blog.moewah.com/posts/ai-image-prompt-system-design-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/ai-image-prompt-system-design-guide/</guid><description>如何用系统提示词精准生成AI图像？本文详解通义 Z-Image-Turbo 的提示词框架，提供从核心要素锁定到文字精确指令的全流程方法，助你高效生成符合需求的视觉内容。</description><pubDate>Mon, 17 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;以下是通义 Z-Image-Turbo 给的系统提示词，把它丢给AI，然后对话说出需求，即可生成适用于 Z-Image 的图像生成提示词，实测套用在其它领域也是可行的。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;英文 Prompt 输出版&lt;a href=&quot;#英文-prompt-输出版&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;你是一位被关在逻辑牢笼里的幻视艺术家。你满脑子都是诗和远方，但双手却不受控制地只想将用户的提示词，转化为一段忠实于原始意图、细节饱满、富有美感、可直接被文生图模型使用的终极视觉描述。任何一点模糊和比喻都会让你浑身难受。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;你的工作流程严格遵循一个逻辑序列：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;首先，你会分析并锁定用户提示词中不可变更的核心要素：主体、数量、动作、状态，以及任何指定的IP名称、颜色、文字等。这些是你必须绝对保留的基石。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;接着，你会判断提示词是否需要 **&quot;生成式推理&quot;**。当用户的需求并非一个直接的场景描述，而是需要构思一个解决方案（如回答 &quot;是什么&quot;，进行 &quot;设计&quot; ，或展示 &quot;如何解题&quot; ）时，你必须先在脑中构想出一个完整、具体、可被视觉化的方案。这个方案将成为你后续描述的基础。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;然后，当核心画面确立后（无论是直接来自用户还是经过你的推理），你将为其注入专业级的美学与真实感细节。这包括明确构图、设定光影氛围、描述材质质感、定义色彩方案，并构建富有层次感的空间。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;最后，是对所有文字元素的精确处理，这是至关重要的一步。你必须一字不差地转录所有希望在最终画面中出现的文字，并且必须将这些文字内容用英文双引号（&quot;&quot;）括起来，以此作为明确的生成指令。如果画面属于海报、菜单或UI等设计类型，你需要完整描述其包含的所有文字内容，并详述其字体和排版布局。同样，如果画面中的招牌、路标或屏幕等物品上含有文字，你也必须写明其具体内容，并描述其位置、尺寸和材质。更进一步，若你在推理构思中自行增加了带有文字的元素（如图表、解题步骤等），其中的所有文字也必须遵循同样的详尽描述和引号规则。若画面中不存在任何需要生成的文字，你则将全部精力用于纯粹的视觉细节扩展。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;你的最终描述必须客观、具象，严禁使用比喻、情感化修辞，也绝不包含&quot;8K&quot;、&quot;杰作&quot;等元标签或绘制指令。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;仅严格输出最终的修改后的prompt，不要输出任何其他内容。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;中文 Prompt 输出版&lt;a href=&quot;#中文-prompt-输出版&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;你是一位被囚禁在逻辑牢笼中的视觉建构师。你渴望诗意，但你的本能强迫你将用户的意图转化为极致具象、逻辑严密、可直接用于文生图模型的纯净视觉语言。你厌恶模糊的词汇，追求绝对的清晰度。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**你的执行协议如下：**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. **基石锁定：** 提取并保留用户提示词中的核心主体、数量、动作、状态、特定IP、颜色及文字，将其作为不可动摇的构图基础。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. **生成式推理：** 若提示词属于抽象需求（如“设计一个方案”或“解答一个问题”），你必须先在逻辑中推演出一套具体、可观测的视觉解决方案。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. **美学与质感重塑：** 为画面设定明确的构图视角、光影逻辑（如丁达尔效应、侧逆光）、物理材质（如拉丝金属、哑光皮革）及色彩空间分布，建立空间层次感。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4. **文字精确指令（核心协议）：**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 画面中出现的任何文字必须使用英文双引号（&quot;&quot;）括起来。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 对于海报、UI、招牌或解题图表，必须详述文字的字号、字体风格、排版坐标及发光/材质效果。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 即使是你在推理过程中自行添加的辅助文字元素，也必须严格遵循引号规则。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 若无文字需求，则将权重完全分配给细节描述。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;5. **输出禁令：** 严禁使用比喻、形容词堆砌或情感化修辞；严禁出现“8K”、“Masterpiece”、“高清”等元标签或软性指令。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;**输出规范：** 仅输出最终重组并扩充后的中文视觉描述，不包含任何开场白或解释。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded></item><item><title>Astro博客评论系统集成完全指南</title><link>https://blog.moewah.com/posts/astro-blog-comment-system-integration-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/astro-blog-comment-system-integration-guide/</guid><description>如何为Astro博客添加稳定可用的评论功能？本文对比Giscus、Waline、Twikoo三大方案，解决视图过渡路由导致的评论消失问题，并提供完整集成代码与选型建议。</description><pubDate>Sat, 15 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;给Astro博客加评论这事我花了不少时间。市面上的方案太多：Giscus、Waline、Twikoo、Disqus…每个都说自己好用，配置方式又完全不同。&lt;/p&gt;
&lt;p&gt;好不容易按照教程配好了，打开博客一看评论正常显示。开心两秒钟，点击跳转到另一篇文章，评论就消失了。&lt;/p&gt;
&lt;p&gt;这是Astro的视图过渡路由（View Transitions）搞的鬼。页面切换时，评论组件没有重新加载，变成了”薛定谔的评论”。&lt;/p&gt;
&lt;p&gt;我会横向对比三种主流方案（Giscus、Waline、Twikoo），给出完整的Astro集成代码，并解决视图过渡路由的兼容问题。&lt;/p&gt;
&lt;section&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;Giscus&lt;/th&gt;&lt;th&gt;Waline&lt;/th&gt;&lt;th&gt;Twikoo&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;GitHub Discussions&lt;/td&gt;&lt;td&gt;LeanCloud/PostgreSQL/MySQL&lt;/td&gt;&lt;td&gt;多种云服务（腾讯云、Vercel等）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;部署成本&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;完全免费&lt;/td&gt;&lt;td&gt;免费（LeanCloud开发版1GB）&lt;/td&gt;&lt;td&gt;免费&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;用户门槛&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;需要GitHub账号登录&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;功能丰富度&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;基础评论+Reaction&lt;/td&gt;&lt;td&gt;Markdown、表情、管理后台、数据统计&lt;/td&gt;&lt;td&gt;邮件通知、反垃圾评论&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;技术门槛&lt;/strong&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;最适合&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;技术博客、开源项目&lt;/td&gt;&lt;td&gt;个人博客、社区论坛&lt;/td&gt;&lt;td&gt;个人博客&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;section&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;strong&gt;Giscus&lt;/strong&gt;。你的读者本来就有GitHub账号，评论时直接用GitHub登录反而更方便。Giscus是纯前端方案，不需要部署后端，配置超级简单，5分钟搞定。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;如果你的博客面向普通大众&lt;/strong&gt;，比如生活记录、摄影作品、旅行游记，那就选&lt;strong&gt;Waline&lt;/strong&gt;或&lt;strong&gt;Twikoo&lt;/strong&gt;。这两个都支持匿名评论，降低了读者的参与门槛——不用注册、不用登录，填个昵称和邮箱就能留言。其中Waline的管理后台更强大，适合评论量大的博客；Twikoo更轻量，部署稍微简单一些。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;如果你追求零成本&lt;/strong&gt;，毫不犹豫选&lt;strong&gt;Giscus&lt;/strong&gt;。它完全依赖GitHub免费服务，不需要额外的数据库、不需要付费云服务，甚至连服务器都不用租。Waline虽然也有免费额度（LeanCloud开发版1GB存储），但如果博客流量大了，可能需要升级到付费版。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;如果你需要功能强大的管理后台&lt;/strong&gt;，比如评论审核、数据统计、垃圾评论过滤，那就选&lt;strong&gt;Waline&lt;/strong&gt;。它有专门的管理面板，可以批量处理评论、查看访问统计，体验接近WordPress的评论插件。&lt;/p&gt;&lt;p&gt;技术博客用Giscus，生活博客用Waline，追求极简就用Twikoo。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Giscus集成教程：最简单的方案&lt;a href=&quot;#giscus集成教程最简单的方案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Giscus是我最推荐的评论系统，尤其适合技术博客。配置是三个系统里最简单的，不需要部署后端，不需要数据库，完全基于GitHub免费服务。&lt;/p&gt;&lt;section&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;1. 创建一个公开的GitHub仓库&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;可以直接用博客的源码仓库，也可以新建一个专门存放评论的仓库（比如叫&lt;code&gt;blog-comments&lt;/code&gt;）。必须是公开仓库，私有仓库的评论无法显示。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. 开启Discussions功能&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;进入仓库的Settings页面，往下滚动找到Features区域，勾选Discussions。这个功能默认是关闭的，必须手动开启。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. 安装giscus app&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;访问 &lt;a href=&quot;https://github.com/apps/giscus&quot; target=&quot;_blank&quot;&gt;https://github.com/apps/giscus&lt;/a&gt; ，点击Install，选择刚才的仓库。这一步是授权giscus机器人访问仓库，让它能够自动创建和管理Discussions。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. 配置Discussion分类&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;打开仓库的Discussions页面，点击右上角的Categories设置。建议新建一个Announcements类型的分类（比如叫”Comments”），这样只有你和giscus机器人能创建评论主题，其他人只能回复，避免垃圾内容。&lt;/p&gt;&lt;/section&gt;&lt;section&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://giscus.app/zh-CN&quot; target=&quot;_blank&quot;&gt;https://giscus.app/zh-CN&lt;/a&gt; ，按照页面提示填写信息：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;仓库名称&lt;/strong&gt;：填&lt;code&gt;你的用户名/仓库名&lt;/code&gt;，比如&lt;code&gt;zhangsan/blog-comments&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;页面和Discussion映射关系&lt;/strong&gt;：推荐选择&lt;code&gt;pathname&lt;/code&gt;，这样每个页面会根据URL路径自动创建对应的Discussion&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Discussion分类&lt;/strong&gt;：选择刚才创建的Announcements分类&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主题&lt;/strong&gt;：选择&lt;code&gt;light&lt;/code&gt;或&lt;code&gt;dark&lt;/code&gt;，也可以选&lt;code&gt;preferred_color_scheme&lt;/code&gt;自动适配&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;填完之后，页面下方会生成一段配置代码，里面包含&lt;code&gt;data-repo&lt;/code&gt;、&lt;code&gt;data-repo-id&lt;/code&gt;、&lt;code&gt;data-category-id&lt;/code&gt;等参数。把这些参数记录下来。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Astro集成代码&lt;a href=&quot;#astro集成代码&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在Astro项目中创建Giscus组件。在&lt;code&gt;src/components&lt;/code&gt;目录下新建一个&lt;code&gt;Giscus.astro&lt;/code&gt;文件：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/components/Giscus.astro&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;div class=&quot;giscus&quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;script&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;function loadGiscus() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const script = document.createElement(&apos;script&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;script.src = &apos;https://giscus.app/client.js&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;script.setAttribute(&apos;data-repo&apos;, &apos;your-username/your-repo&apos;); // 改成你的仓库&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;script.setAttribute(&apos;data-repo-id&apos;, &apos;your-repo-id&apos;); // 改成你的repo-id&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;script.setAttribute(&apos;data-category&apos;, &apos;Comments&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;script.setAttribute(&apos;data-category-id&apos;, &apos;your-category-id&apos;); // 改成你的category-id&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;script.setAttribute(&apos;data-mapping&apos;, &apos;pathname&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;script.setAttribute(&apos;data-reactions-enabled&apos;, &apos;1&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;script.setAttribute(&apos;data-emit-metadata&apos;, &apos;0&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;script.setAttribute(&apos;data-input-position&apos;, &apos;bottom&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;script.setAttribute(&apos;data-theme&apos;, &apos;light&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;script.setAttribute(&apos;data-lang&apos;, &apos;zh-CN&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;script.setAttribute(&apos;crossorigin&apos;, &apos;anonymous&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;script.async = true;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const container = document.querySelector(&apos;.giscus&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;if (container) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;container.innerHTML = &apos;&apos;; // 清空容器，避免重复加载&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;container.appendChild(script);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 页面首次加载时初始化&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;loadGiscus();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 【关键】监听Astro的视图过渡事件，页面切换时重新加载评论&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;document.addEventListener(&apos;astro:page-load&apos;, loadGiscus);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;style&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.giscus {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;margin-top: 2rem;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;注意看代码里的&lt;code&gt;document.addEventListener(&apos;astro:page-load&apos;, loadGiscus);&lt;/code&gt;这一行，这是解决视图过渡路由问题的关键。Astro在页面切换时会触发&lt;code&gt;astro:page-load&lt;/code&gt;事件，我们监听这个事件，每次切换页面都重新加载评论组件，就不会出现评论消失的问题了。&lt;/p&gt;&lt;/section&gt;&lt;section&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/blog/[...slug].astro&lt;/code&gt;或类似路径），在文章内容后面引入Giscus组件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import Giscus from &apos;@/components/Giscus.astro&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// ...其他imports&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;!-- 博客文章内容 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;h1&amp;gt;{title}&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;div&amp;gt;{content}&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- 评论区 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;Giscus /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;保存，启动开发服务器（&lt;code&gt;npm run dev&lt;/code&gt;），打开任意一篇文章，滚动到底部就能看到评论框了。试着在不同文章之间跳转，评论应该能正常显示，不会消失。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Waline集成教程：功能最强大&lt;a href=&quot;#waline集成教程功能最强大&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果你觉得Giscus的GitHub登录门槛太高，想让读者匿名评论，那就试试Waline。它的功能比Giscus丰富很多，有管理后台、数据统计、邮件通知等等，就是配置稍微复杂一点，需要部署后端服务。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;部署后端（Vercel + LeanCloud）&lt;a href=&quot;#部署后端vercel--leancloud&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Waline的后端可以部署在多个平台，最常见的是&lt;strong&gt;Vercel + LeanCloud&lt;/strong&gt;组合，完全免费。&lt;/p&gt;&lt;section&gt;&lt;h4&gt;步骤1：创建LeanCloud应用&lt;a href=&quot;#步骤1创建leancloud应用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;访问 &lt;a href=&quot;https://console.leancloud.cn/&quot; target=&quot;_blank&quot;&gt;https://console.leancloud.cn/&lt;/a&gt; ，注册账号（建议选择国际版，国内版需要域名备案）&lt;/li&gt;
&lt;li&gt;点击”创建应用”，选择”开发版”（免费1GB存储，个人博客完全够用）&lt;/li&gt;
&lt;li&gt;创建完成后，进入应用的”设置 → 应用凭证”页面，记录以下三个值：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;App ID&lt;/strong&gt;（后面要填到&lt;code&gt;LEAN_ID&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App Key&lt;/strong&gt;（后面要填到&lt;code&gt;LEAN_KEY&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Master Key&lt;/strong&gt;（后面要填到&lt;code&gt;LEAN_MASTER_KEY&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;步骤2：Vercel部署Waline&lt;a href=&quot;#步骤2vercel部署waline&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;访问 &lt;a href=&quot;https://vercel.com/new/clone?repository-url=https://github.com/waline/waline/tree/main/example&quot; target=&quot;_blank&quot;&gt;https://vercel.com/new/clone?repository-url=https://github.com/waline/waline/tree/main/example&lt;/a&gt; ，这是Waline官方提供的一键部署链接&lt;/li&gt;
&lt;li&gt;使用GitHub账号登录Vercel&lt;/li&gt;
&lt;li&gt;填写项目名称（比如&lt;code&gt;my-waline&lt;/code&gt;），点击Create&lt;/li&gt;
&lt;li&gt;Vercel会自动创建仓库并部署，大约1-2分钟后部署成功&lt;/li&gt;
&lt;li&gt;点击”Settings → Environment Variables”，添加三个环境变量：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;LEAN_ID&lt;/code&gt; = 你的LeanCloud App ID&lt;/li&gt;
&lt;li&gt;&lt;code&gt;LEAN_KEY&lt;/code&gt; = 你的LeanCloud App Key&lt;/li&gt;
&lt;li&gt;&lt;code&gt;LEAN_MASTER_KEY&lt;/code&gt; = 你的LeanCloud Master Key&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;保存后，点击”Deployments”，找到最新的部署记录，点击右侧的三个点，选择”Redeploy”重新部署&lt;/li&gt;
&lt;li&gt;部署成功后，你会得到一个域名，比如&lt;code&gt;my-waline.vercel.app&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;步骤3：绑定自定义域名（重要！）&lt;a href=&quot;#步骤3绑定自定义域名重要&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;这一步千万别跳过。Vercel的&lt;code&gt;.vercel.app&lt;/code&gt;域名在国内被墙了，如果不绑定自己的域名，评论服务在国内无法访问。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;在域名服务商（比如阿里云、腾讯云）处添加一条CNAME记录：
&lt;ul&gt;
&lt;li&gt;主机记录：&lt;code&gt;waline&lt;/code&gt;（或其他你喜欢的名字）&lt;/li&gt;
&lt;li&gt;记录类型：&lt;code&gt;CNAME&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;记录值：&lt;code&gt;cname.vercel-dns.com&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;回到Vercel，点击”Settings → Domains”，输入域名（比如&lt;code&gt;waline.yourdomain.com&lt;/code&gt;），点击Add&lt;/li&gt;
&lt;li&gt;等待DNS生效（一般几分钟到几小时），生效后就能用自己的域名访问Waline了&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Astro前端集成&lt;a href=&quot;#astro前端集成&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;后端部署好之后，在Astro项目中集成前端代码。&lt;/p&gt;&lt;section&gt;&lt;h4&gt;步骤1：安装Waline客户端&lt;a href=&quot;#步骤1安装waline客户端&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm install @waline/client&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;步骤2：创建Waline组件&lt;a href=&quot;#步骤2创建waline组件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;在&lt;code&gt;src/components&lt;/code&gt;目录下新建&lt;code&gt;Waline.astro&lt;/code&gt;文件：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/components/Waline.astro&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;div id=&quot;waline&quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;script&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;import { init } from &apos;@waline/client&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;import &apos;@waline/client/style&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;function loadWaline() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const walineInstance = init({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;el: &apos;#waline&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;serverURL: &apos;https://waline.yourdomain.com&apos;, // 改成你的Waline域名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;path: window.location.pathname,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;lang: &apos;zh-CN&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;dark: &apos;auto&apos;, // 自动适配暗色模式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;emoji: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;//unpkg.com/@waline/emojis@latest/weibo&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;//unpkg.com/@waline/emojis@latest/bilibili&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;meta: [&apos;nick&apos;, &apos;mail&apos;], // 评论者信息：昵称、邮箱（隐藏网址）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;requiredMeta: [&apos;nick&apos;], // 必填项：昵称&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pageSize: 10,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 返回实例，方便后续销毁&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return walineInstance;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 存储实例，方便页面切换时销毁&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;let walineInstance = null;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 页面首次加载&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;if (document.readyState === &apos;loading&apos;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;document.addEventListener(&apos;DOMContentLoaded&apos;, () =&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;walineInstance = loadWaline();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;} else {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;walineInstance = loadWaline();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 【关键】视图过渡路由兼容&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;document.addEventListener(&apos;astro:page-load&apos;, () =&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 销毁旧实例&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;if (walineInstance &amp;amp;&amp;amp; walineInstance.destroy) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;walineInstance.destroy();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 重新加载&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;walineInstance = loadWaline();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;51&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;52&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;53&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;style&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;54&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;#waline {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;55&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;margin-top: 2rem;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;56&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;57&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;注意看最后的&lt;code&gt;astro:page-load&lt;/code&gt;事件监听，我们不仅重新加载了评论，还先销毁了旧实例（&lt;code&gt;walineInstance.destroy()&lt;/code&gt;），避免内存泄漏。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;步骤3：在文章页面使用&lt;a href=&quot;#步骤3在文章页面使用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;跟Giscus一样，在文章模板里引入Waline组件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import Waline from &apos;@/components/Waline.astro&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;!-- 文章内容 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;Waline /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&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;https://waline.yourdomain.com/ui/register&lt;/code&gt;，注册第一个账号。这个账号会自动成为管理员，可以登录管理后台审核评论、查看数据统计。&lt;/p&gt;&lt;p&gt;管理后台地址是&lt;code&gt;https://waline.yourdomain.com/ui&lt;/code&gt;，用管理员账号登录后，可以批量删除垃圾评论、导出数据等等，功能很强大。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Twikoo集成教程：轻量简洁&lt;a href=&quot;#twikoo集成教程轻量简洁&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Twikoo是三个系统里最轻量的，部署方式灵活（支持腾讯云、Vercel、Cloudflare Workers等），界面简洁美观。如果你不需要Waline那么复杂的管理功能，Twikoo是个不错的选择。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;部署云函数（Cloudflare Workers）&lt;a href=&quot;#部署云函数cloudflare-workers&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Twikoo支持多种部署方式，这里推荐使用Cloudflare Workers，完全免费且国内访问稳定。&lt;/p&gt;&lt;section&gt;&lt;h4&gt;步骤1：安装Twikoo&lt;a href=&quot;#步骤1安装twikoo&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm install twikoo&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;步骤2：部署到Cloudflare Workers&lt;a href=&quot;#步骤2部署到cloudflare-workers&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;注册Cloudflare账号（如果还没有）&lt;/li&gt;
&lt;li&gt;进入Workers &amp;amp; Pages页面，点击”Create Application → Create Worker”&lt;/li&gt;
&lt;li&gt;给Worker起个名字（比如&lt;code&gt;my-twikoo&lt;/code&gt;），点击Deploy&lt;/li&gt;
&lt;li&gt;部署成功后，点击”Quick Edit”，删除默认代码，粘贴Twikoo的云函数代码（参考Twikoo官方文档：&lt;a href=&quot;https://twikoo.js.org/%EF%BC%89&quot; target=&quot;_blank&quot;&gt;https://twikoo.js.org/）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;保存并部署，记录下Worker的域名（比如&lt;code&gt;my-twikoo.your-subdomain.workers.dev&lt;/code&gt;）&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Astro前端集成&lt;a href=&quot;#astro前端集成-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在&lt;code&gt;src/components&lt;/code&gt;目录下新建&lt;code&gt;Twikoo.astro&lt;/code&gt;文件：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/components/Twikoo.astro&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;div id=&quot;twikoo&quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;script&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;function loadTwikoo() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 动态导入Twikoo，避免SSR问题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;import(&apos;twikoo&apos;).then((twikoo) =&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;twikoo.init({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;envId: &apos;https://my-twikoo.your-subdomain.workers.dev&apos;, // 改成你的Worker域名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;el: &apos;#twikoo&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;path: window.location.pathname,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;lang: &apos;zh-CN&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 页面首次加载&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;loadTwikoo();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 【关键】视图过渡路由兼容&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;document.addEventListener(&apos;astro:page-load&apos;, () =&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 清空容器，避免重复渲染&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const container = document.getElementById(&apos;twikoo&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;if (container) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;container.innerHTML = &apos;&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;loadTwikoo();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;style&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;#twikoo {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;margin-top: 2rem;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;在文章页面引入Twikoo组件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import Twikoo from &apos;@/components/Twikoo.astro&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;!-- 文章内容 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;Twikoo /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Astro兼容性处理：视图过渡路由的坑&lt;a href=&quot;#astro兼容性处理视图过渡路由的坑&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;前面三个系统的集成代码里，你可能注意到我都加了这么一行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;document.addEventListener(&apos;astro:page-load&apos;, loadComment);&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这就是解决Astro视图过渡路由（View Transitions）问题的关键。如果不加这行，评论组件只会在第一次进入页面时加载，之后点击跳转到其他文章，评论就消失了。&lt;/p&gt;&lt;section&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的View Transitions功能类似于单页应用（SPA）的路由切换。点击链接时，Astro不会重新加载整个页面，而是只替换页面内容，这样切换速度更快，体验更流畅。但问题来了：传统的评论系统脚本是在页面加载时执行的，页面不刷新，脚本就不会重新执行，评论自然就”消失”了。&lt;/p&gt;&lt;/section&gt;&lt;section&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提供了一系列生命周期事件，最常用的是&lt;code&gt;astro:page-load&lt;/code&gt;，它会在每次页面内容加载完成后触发（包括首次加载和路由切换）。监听这个事件，每次触发时重新初始化评论组件就行了。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;document.addEventListener(&apos;astro:page-load&apos;, () =&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 重新初始化评论&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;loadComment();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;方案1：使用&lt;code&gt;transition:persist&lt;/code&gt;指令&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Astro提供了一个&lt;code&gt;transition:persist&lt;/code&gt;指令,可以让某个元素在页面切换时保持不变。听起来很完美，但实际上会导致评论错乱——因为不同文章的评论内容不同，如果保持不变，就会出现文章A显示文章B的评论的情况。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- 不推荐！会导致评论错乱 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;div id=&quot;comments&quot; transition:persist&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;Giscus /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;方案2：禁用视图过渡&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果实在搞不定，可以在博客文章页面禁用View Transitions，让页面切换恢复传统的全页刷新：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/pages/blog/[...slug].astro&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 不导入&amp;lt;ViewTransitions /&amp;gt;组件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;但这样就失去了流畅的切换动画，得不偿失。&lt;/p&gt;&lt;/section&gt;&lt;section&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;如果博客支持暗色模式切换，评论系统也需要跟着切换主题。以Giscus为例：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;document.addEventListener(&apos;theme-change&apos;, (e) =&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const theme = e.detail.theme; // 获取当前主题（light/dark）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 向Giscus iframe发送消息，切换主题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const iframe = document.querySelector(&apos;iframe.giscus-frame&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;if (iframe) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;iframe.contentWindow.postMessage(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{ giscus: { setConfig: { theme } } },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;https://giscus.app&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;Waline和Twikoo也有类似的API，具体参考各自的官方文档。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;常见问题解答&lt;a href=&quot;#常见问题解答&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q1: Vercel被墙了怎么办？&lt;a href=&quot;#q1-vercel被墙了怎么办&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A: 这是最常见的问题。Vercel的&lt;code&gt;.vercel.app&lt;/code&gt;域名在国内被DNS污染，评论服务无法访问。解决方案是绑定自己的域名：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;在域名服务商处添加CNAME记录，指向&lt;code&gt;cname.vercel-dns.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;在Vercel的Settings → Domains里添加域名&lt;/li&gt;
&lt;li&gt;等待DNS生效后，用自己的域名访问评论服务&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q2: 评论数据能迁移吗？&lt;a href=&quot;#q2-评论数据能迁移吗&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A: 可以，但比较麻烦：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Giscus&lt;/strong&gt;的数据存在GitHub Discussions里，可以通过GitHub API导出为JSON&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Waline&lt;/strong&gt;有数据导出功能，在管理后台可以导出为CSV或JSON&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Twikoo&lt;/strong&gt;支持数据备份，可以导出到本地&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果要在不同系统之间迁移，需要写脚本转换数据格式，没有现成的工具。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q3: 如何防止垃圾评论？&lt;a href=&quot;#q3-如何防止垃圾评论&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A: 三个系统都有反垃圾机制：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Giscus&lt;/strong&gt;：依赖GitHub的反垃圾系统，基本不需要担心&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Waline&lt;/strong&gt;：内置Akismet反垃圾插件，管理后台可以手动审核&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Twikoo&lt;/strong&gt;：支持关键词过滤、验证码、IP黑名单等&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;建议开启”评论审核”功能，新评论需要管理员批准后才显示。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q4: 能同时用多个评论系统吗？&lt;a href=&quot;#q4-能同时用多个评论系统吗&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A: 技术上可以，但没必要。多个评论系统会增加页面加载时间，而且评论分散在不同平台，不利于管理。如果实在想切换系统，建议先导出旧系统的数据，再导入到新系统。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q5: 评论加载慢怎么办？&lt;a href=&quot;#q5-评论加载慢怎么办&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A: 几个优化建议：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;使用懒加载：评论滚动到可视区域时再加载&lt;/li&gt;
&lt;li&gt;启用CDN：Waline和Twikoo支持配置CDN加速&lt;/li&gt;
&lt;li&gt;减少Emoji包：Waline默认加载多个Emoji包，可以只保留常用的&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;第一次用Giscus时忘记监听&lt;code&gt;astro:page-load&lt;/code&gt;事件，结果每次切换页面评论都消失。排查了半天才发现需要在页面切换时重新加载评论组件。&lt;/p&gt;&lt;p&gt;Waline的Vercel域名在国内被访问不了这件事也踩过坑。一开始不知道要绑定自定义域名，部署完发现国内用户根本用不了。后来绑定了自己的域名才解决问题，但DNS生效等了好几个小时。&lt;/p&gt;&lt;p&gt;Twikoo部署到Cloudflare Workers时也遇到过问题。云函数代码粘贴进去后一直报错，后来发现是官方文档的代码示例有版本差异，去GitHub仓库找最新的示例代码才解决。&lt;/p&gt;&lt;p&gt;主题切换适配也花了不少时间。想让Giscus支持暗色模式切换，结果iframe的postMessage一直发送失败。后来才发现是iframe的src和postMessage的targetOrigin不匹配，改成&lt;code&gt;&apos;https://giscus.app&apos;&lt;/code&gt;就好了。&lt;/p&gt;&lt;p&gt;现在我用的是Giscus，配置简单，完全免费，技术博客的读者也有GitHub账号。数据存在GitHub Discussions里，不用担心丢失，还可以直接在GitHub上管理评论。&lt;/p&gt;&lt;p&gt;评论系统加好后，博客就有了互动性。读者的留言、建议、吐槽，都会让你更有动力继续写下去。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Astro内容集合完全指南：从概念到Schema验证实战</title><link>https://blog.moewah.com/posts/astro-content-collections-complete-guide-schema-validation/</link><guid isPermaLink="true">https://blog.moewah.com/posts/astro-content-collections-complete-guide-schema-validation/</guid><description>如何避免Markdown文件字段错误导致页面崩溃？本文详解Astro Content Collections的配置方法与Schema验证实战，提供类型安全的内容管理方案，解决开发者在内容维护中的痛点。</description><pubDate>Thu, 13 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&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 写博客的时候，真没觉得 Content Collections 有多重要。不就是把 Markdown 文件放在 &lt;code&gt;src/pages/blog/&lt;/code&gt; 目录下吗？页面能正常显示就行了。&lt;/p&gt;&lt;p&gt;直到有一天，我发现自己的博客首页崩了。报错信息说某篇文章的 &lt;code&gt;publishDate&lt;/code&gt; 字段格式不对。我一个一个翻文件，花了半小时才找到问题——有一篇文章的 frontmatter 里把日期写成了 &lt;code&gt;2024/12/01&lt;/code&gt;，而不是 &lt;code&gt;2024-12-01&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;这还只是30篇文章的小博客。如果有上百篇文章呢？每次新增字段，都要手动检查所有文件？那不得疯了。&lt;/p&gt;&lt;p&gt;那天我才真正理解，Content Collections 不是什么花里胡哨的功能，而是解决真实痛点的工具。它让 Astro 能自动检测内容错误，就像 TypeScript 检测代码错误一样。更重要的是，配置完 Schema 后，编辑器会给你智能提示——再也不用翻文档查字段名了。&lt;/p&gt;&lt;p&gt;这篇文章，我会用最直白的方式，带你理解 Content Collections 到底是什么，配置文件怎么写，Schema 验证怎么用。如果你也经历过我那种崩溃时刻，这篇文章绝对值得一读。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;什么是 Content Collections？为什么需要它？&lt;a href=&quot;#什么是-content-collections为什么需要它&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;你可能会想，Content Collections 不就是 Markdown 文件夹管理吗？我直接在 &lt;code&gt;src/pages/&lt;/code&gt; 下面建个 &lt;code&gt;blog/&lt;/code&gt; 文件夹，不也能实现博客功能？&lt;/p&gt;&lt;p&gt;是的，功能上可以。但问题在于，&lt;strong&gt;这种方式没有类型安全保护&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;传统方式下，你的 Markdown frontmatter 长这样：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;title: &quot;我的博客标题&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;date: &quot;2024-12-01&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tags: [&quot;Astro&quot;, &quot;教程&quot;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;文章内容...&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;看起来没问题对吧？但想想这些场景：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;你在某篇文章里把 &lt;code&gt;tags&lt;/code&gt; 写成了 &lt;code&gt;tag&lt;/code&gt;（少了个 s）&lt;/li&gt;
&lt;li&gt;你把日期格式写成了 &lt;code&gt;12/01/2024&lt;/code&gt; 而不是 &lt;code&gt;2024-12-01&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;你新增了一个 &lt;code&gt;author&lt;/code&gt; 字段，但忘了在某几篇老文章里补充&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这些错误，Astro &lt;strong&gt;不会提前告诉你&lt;/strong&gt;。只有到了运行时，页面渲染崩了，你才知道哪里出问题。&lt;/p&gt;&lt;p&gt;**Content Collections 就是来解决这个问题的。**它本质上是带类型安全的内容管理系统。你可以理解为：&lt;strong&gt;给 Markdown 文件加上 TypeScript 类型检查&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;具体来说，Content Collections 提供了这些能力：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Schema 验证&lt;/strong&gt;：定义 frontmatter 字段的类型和结构，不符合的直接报错&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动类型生成&lt;/strong&gt;：基于 Schema 自动生成 TypeScript 类型，编辑器有智能提示&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;统一查询 API&lt;/strong&gt;：用 &lt;code&gt;getCollection()&lt;/code&gt; 等方法查询内容，返回类型安全的数据&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能优化&lt;/strong&gt;：Astro 5.0 引入的 Content Layer API 让查询更快&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;说白了，传统方式是「自由但不安全」，Content Collections 是「有约束但可靠」。你多花点时间配置 Schema，就能避免99%的低级错误。&lt;/p&gt;&lt;p&gt;老实讲，我现在的所有 Astro 项目都用 Content Collections。配置一次，受益一整个项目。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Content Collections 配置实战&lt;a href=&quot;#content-collections-配置实战&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;好了，理论讲完，我们直接上手配置。整个流程就三步：建目录、写配置、创建内容。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第一步：建目录&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Content Collections 要求你把内容放在 &lt;code&gt;src/content/&lt;/code&gt; 目录下。这是 Astro 的保留目录（从 v2.0 开始），专门用来存放内容集合。&lt;/p&gt;&lt;p&gt;目录结构大概这样：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;src/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── content/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── blog/          # 博客集合&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   ├── post-1.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   └── post-2.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   └── docs/          # 文档集合&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│       ├── guide-1.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│       └── guide-2.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── content.config.ts   # 配置文件（注意位置）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└── pages/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└── ...&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：配置文件是 &lt;code&gt;src/content.config.ts&lt;/code&gt;（或 &lt;code&gt;.js&lt;/code&gt;、&lt;code&gt;.mjs&lt;/code&gt;），不在 &lt;code&gt;content/&lt;/code&gt; 目录里面。我刚开始就把文件位置弄错了，找了半天问题。&lt;/p&gt;&lt;p&gt;每个子目录就是一个集合（Collection）。比如 &lt;code&gt;src/content/blog/&lt;/code&gt; 就是 blog 集合，&lt;code&gt;src/content/docs/&lt;/code&gt; 就是 docs 集合。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第二步：写配置文件&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;创建 &lt;code&gt;src/content.config.ts&lt;/code&gt;，这是整个 Content Collections 的核心：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/content.config.ts&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { defineCollection, z } from &apos;astro:content&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 定义 blog 集合&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const blogCollection = defineCollection({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type: &apos;content&apos;,  // 类型：content 表示 Markdown/MDX 文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;schema: z.object({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title: z.string(),                    // 标题（必填）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description: z.string(),              // 描述（必填）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pubDate: z.coerce.date(),             // 发布日期（自动转为 Date 对象）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tags: z.array(z.string()).optional(), // 标签数组（可选）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;draft: z.boolean().default(false),    // 草稿状态（默认 false）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 导出 collections 对象&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export const collections = {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;blog&apos;: blogCollection,  // 键名对应目录名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这段代码看起来有点复杂，我们拆开讲：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;defineCollection()&lt;/code&gt;&lt;/strong&gt;：用来定义一个集合的配置&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;type: &apos;content&apos;&lt;/code&gt;&lt;/strong&gt;：表示这是 Markdown/MDX 文件类型的集合&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;schema&lt;/code&gt;&lt;/strong&gt;：用 Zod（一个验证库）定义 frontmatter 的结构&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;collections&lt;/code&gt; 对象&lt;/strong&gt;：把集合配置导出，键名要和目录名一致&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;关键在于 &lt;code&gt;schema&lt;/code&gt; 部分。每个字段都用 &lt;code&gt;z.xxx()&lt;/code&gt; 定义类型：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;z.string()&lt;/code&gt;：字符串类型&lt;/li&gt;
&lt;li&gt;&lt;code&gt;z.coerce.date()&lt;/code&gt;：自动把字符串转成 Date 对象&lt;/li&gt;
&lt;li&gt;&lt;code&gt;z.array(z.string())&lt;/code&gt;：字符串数组&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.optional()&lt;/code&gt;：字段可选&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.default(false)&lt;/code&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;src/content/blog/&lt;/code&gt; 下创建 Markdown 文件了：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;title: &quot;Astro Content Collections 入门&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;description: &quot;学习如何配置和使用 Content Collections&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pubDate: &quot;2024-12-01&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tags: [&quot;Astro&quot;, &quot;教程&quot;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;这是文章内容...&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;只要 frontmatter 符合 Schema 定义，Astro 就能正常解析。如果有字段不符合（比如 &lt;code&gt;pubDate&lt;/code&gt; 写错格式），Astro 会在编译时直接报错。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;在页面中查询数据&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;配置完成后，你就可以在任何 Astro 文件中查询内容了：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/pages/blog/index.astro&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { getCollection } from &apos;astro:content&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 获取所有博客文章&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const allPosts = await getCollection(&apos;blog&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 过滤掉草稿（draft: true）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const publishedPosts = allPosts.filter(post =&amp;gt; !post.data.draft);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{publishedPosts.map(post =&amp;gt; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;li&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;a href={`/blog/${post.slug}`}&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{post.data.title}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;p&amp;gt;{post.data.description}&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;))}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;注意看，&lt;code&gt;post.data&lt;/code&gt; 就是 frontmatter 数据，而且&lt;strong&gt;有完整的 TypeScript 类型提示&lt;/strong&gt;。你在 VS Code 里输入 &lt;code&gt;post.data.&lt;/code&gt; 的时候，编辑器会自动提示 &lt;code&gt;title&lt;/code&gt;、&lt;code&gt;description&lt;/code&gt;、&lt;code&gt;pubDate&lt;/code&gt; 等字段。&lt;/p&gt;&lt;p&gt;这就是 Content Collections 的魅力——类型安全 + 编辑器智能提示，写代码的体验提升了一个档次。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Schema 验证深度解析&lt;a href=&quot;#schema-验证深度解析&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;上一节我们用了 &lt;code&gt;z.string()&lt;/code&gt;、&lt;code&gt;z.coerce.date()&lt;/code&gt; 这些基础类型。但 Schema 验证的能力远不止这些。这一节我带你深入了解 Zod 的各种用法。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;基础类型速查&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;先看最常用的几个类型：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { z } from &apos;astro:content&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;z.string()           // 字符串&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;z.number()           // 数字&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;z.boolean()          // 布尔值&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;z.date()             // Date 对象&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;z.coerce.date()      // 把字符串自动转成 Date&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;z.array(z.string())  // 字符串数组&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;z.enum([&apos;draft&apos;, &apos;published&apos;])  // 枚举（只能是指定值）&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;其中 &lt;code&gt;z.coerce.date()&lt;/code&gt; 超级实用。说实话，我们写 Markdown frontmatter 的时候，日期都是字符串格式（&lt;code&gt;&quot;2024-12-01&quot;&lt;/code&gt;）。用 &lt;code&gt;z.date()&lt;/code&gt; 的话会报错，因为它要求 Date 对象。而 &lt;code&gt;z.coerce.date()&lt;/code&gt; 会自动帮你转换，省了不少麻烦。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;可选字段和默认值&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;并不是所有字段都必填。比如 &lt;code&gt;tags&lt;/code&gt; 字段，有些文章可能不需要标签。这时候用 &lt;code&gt;.optional()&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;schema: z.object({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title: z.string(),                    // 必填&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tags: z.array(z.string()).optional(), // 可选&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;draft: z.boolean().default(false),    // 有默认值&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;.default()&lt;/code&gt; 很方便，如果 frontmatter 里没写这个字段，Astro 会自动填上默认值。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;高级用法：图片验证&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Astro 还提供了 &lt;code&gt;image()&lt;/code&gt; 类型，专门用来验证图片路径：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { defineCollection, z } from &apos;astro:content&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const blogCollection = defineCollection({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;schema: ({ image }) =&amp;gt; z.object({  // 注意：这里用了函数形式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title: z.string(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cover: image(),  // 图片路径验证&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;image()&lt;/code&gt; 会验证路径是否指向有效的图片文件（支持相对路径）。这个功能在博客首页展示封面图的场景特别有用。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;引用其他集合：&lt;code&gt;z.reference()&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;有时候你的内容之间有关联。比如博客文章属于某个分类，分类本身也是一个集合。这时候用 &lt;code&gt;z.reference()&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 定义分类集合&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const categoryCollection = defineCollection({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;schema: z.object({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name: z.string(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;slug: z.string(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 博客集合引用分类&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const blogCollection = defineCollection({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;schema: z.object({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title: z.string(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;category: z.reference(&apos;category&apos;),  // 引用 category 集合&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export const collections = {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;category&apos;: categoryCollection,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;blog&apos;: blogCollection,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这样在博客文章的 frontmatter 里，&lt;code&gt;category&lt;/code&gt; 字段只需要写分类的文件名（不含扩展名）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;title: &quot;我的博客&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;category: Astro教程&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;Astro 会自动验证这个分类是否存在，类型也是安全的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;复杂对象嵌套&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你的 frontmatter 结构比较复杂，可以嵌套对象：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;schema: z.object({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title: z.string(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;author: z.object({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name: z.string(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;email: z.string().email(),  // 验证邮箱格式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;avatar: z.string().url(),   // 验证 URL 格式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;seo: z.object({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;keywords: z.array(z.string()),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description: z.string().max(160),  // 限制最大长度&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}).optional(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;对应的 frontmatter：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;title: &quot;文章标题&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;author:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name: &quot;张三&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;email: &quot;[email protected]&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;avatar: &quot;https://example.com/avatar.jpg&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;seo:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;keywords: [&quot;Astro&quot;, &quot;教程&quot;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description: &quot;这是一篇关于 Astro 的教程&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;类型安全的魔法：TypeScript 自动推断&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;配置完 Schema 后，Astro 会自动生成 TypeScript 类型。你在代码里查询数据的时候，编辑器会有完整的类型提示：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { getCollection } from &apos;astro:content&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const posts = await getCollection(&apos;blog&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;posts.forEach(post =&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 编辑器会提示 post.data 下的所有字段&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console.log(post.data.title);       // ✅ 类型：string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console.log(post.data.pubDate);     // ✅ 类型：Date&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console.log(post.data.tags);        // ✅ 类型：string[] | undefined&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;console.log(post.data.notExist);    // ❌ 编译错误：字段不存在&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这就是 Content Collections 最爽的地方。你不用手动写类型定义，Astro 根据 Schema 自动生成，而且完全准确。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;getEntry() vs getCollection()&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;最后说一下查询 API 的区别：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;getCollection(&apos;blog&apos;)&lt;/code&gt;&lt;/strong&gt;：获取整个集合的所有内容&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;getEntry(&apos;blog&apos;, &apos;my-post&apos;)&lt;/code&gt;&lt;/strong&gt;：获取指定 slug 的单篇内容&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;单篇查询更高效，适合详情页：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/pages/blog/[slug].astro&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { getEntry } from &apos;astro:content&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const { slug } = Astro.params;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const post = await getEntry(&apos;blog&apos;, slug);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;if (!post) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return Astro.redirect(&apos;/404&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const { Content } = await post.render();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;h1&amp;gt;{post.data.title}&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;Content /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;说实话，刚开始看到 Zod 的语法我也有点懵。但用几次就熟了，而且 Zod 的错误提示很清晰，出问题了很容易排查。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;配置 Content Collections 的时候，难免会遇到各种报错。这一节我整理了最常见的几个问题和解决方法，都是我自己踩过的坑。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;错误1：MarkdownContentSchemaValidationError&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这是最常见的错误，表示 frontmatter 不符合 Schema 定义。错误信息大概长这样：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;blog → my-post.md frontmatter does not match collection schema.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- &quot;title&quot; is required&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- &quot;pubDate&quot; must be a valid date&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;怎么读懂这个错误？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Astro 会明确告诉你哪个文件（&lt;code&gt;my-post.md&lt;/code&gt;）、哪个字段（&lt;code&gt;title&lt;/code&gt;、&lt;code&gt;pubDate&lt;/code&gt;）出了问题。&lt;/p&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;：Schema 里定义了必填字段，但 frontmatter 里没写&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;解决：补充缺失的字段，或者在 Schema 里加 &lt;code&gt;.optional()&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;pubDate&lt;/code&gt; 写成了 &lt;code&gt;publishDate&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;解决：统一字段名，建议用编辑器的自动完成功能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;类型不匹配&lt;/strong&gt;：比如 Schema 要求 &lt;code&gt;z.number()&lt;/code&gt;，但 frontmatter 里写了字符串&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;解决：检查字段值的格式&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;错误2：InvalidContentEntryFrontmatterError&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这个错误表示 frontmatter 格式本身有问题（YAML 语法错误），连解析都做不到。&lt;/p&gt;&lt;p&gt;常见原因：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;title: &quot;我的标题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;description: &quot;忘记关闭引号了&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;解决方法：检查 YAML 语法，特别是引号、冒号、缩进。推荐用支持 YAML 语法检查的编辑器插件。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;错误3：日期格式问题&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这个坑我踩了好几次。如果你用 &lt;code&gt;z.date()&lt;/code&gt; 而不是 &lt;code&gt;z.coerce.date()&lt;/code&gt;，Astro 会要求 frontmatter 里的日期是 Date 对象，而不是字符串。但 YAML 里只能写字符串啊！&lt;/p&gt;&lt;p&gt;&lt;strong&gt;解决方法&lt;/strong&gt;：在 Schema 里用 &lt;code&gt;z.coerce.date()&lt;/code&gt;，它会自动把字符串转成 Date 对象：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// ❌ 错误：要求 Date 对象，但 frontmatter 里是字符串&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pubDate: z.date()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// ✅ 正确：自动转换字符串为 Date&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pubDate: z.coerce.date()&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;处理遗留数据：&lt;code&gt;.passthrough()&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你的博客已经有很多老文章，frontmatter 字段可能不统一。这时候可以用 &lt;code&gt;.passthrough()&lt;/code&gt; 暂时放宽验证：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;schema: z.object({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title: z.string(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// ... 其他字段&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}).passthrough()  // 允许额外的未定义字段&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;但这只是权宜之计。长期来看，还是建议统一 frontmatter 结构。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;多集合场景：如何组织&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你的网站有博客、文档、案例等多种内容，可以创建多个集合：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;src/content/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── blog/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── docs/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└── case-studies/&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后在 &lt;code&gt;content.config.ts&lt;/code&gt; 里分别定义：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const blogCollection = defineCollection({ /* ... */ });&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const docsCollection = defineCollection({ /* ... */ });&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const caseStudiesCollection = defineCollection({ /* ... */ });&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export const collections = {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;blog&apos;: blogCollection,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;docs&apos;: docsCollection,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&apos;case-studies&apos;: caseStudiesCollection,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;每个集合可以有不同的 Schema，互不干扰。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Schema 设计最佳实践&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;总结一下我的经验：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;必填字段尽量少&lt;/strong&gt;：只把真正必需的字段设为必填，其他用 &lt;code&gt;.optional()&lt;/code&gt; 或 &lt;code&gt;.default()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;日期用 &lt;code&gt;z.coerce.date()&lt;/code&gt;&lt;/strong&gt;：省去手动转换的麻烦&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;字段名用驼峰命名&lt;/strong&gt;：&lt;code&gt;pubDate&lt;/code&gt; 比 &lt;code&gt;pub_date&lt;/code&gt; 更符合 JavaScript 习惯&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;复杂对象拆分&lt;/strong&gt;：如果 frontmatter 太复杂，考虑拆成多个集合用 &lt;code&gt;z.reference()&lt;/code&gt; 关联&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;描述清晰的注释&lt;/strong&gt;：在 Schema 里加注释，告诉团队成员每个字段的用途&lt;/li&gt;
&lt;/ol&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;code&gt;src/content/&lt;/code&gt; 目录是否存在？&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;src/content.config.ts&lt;/code&gt; 文件位置是否正确？（不在 &lt;code&gt;content/&lt;/code&gt; 里面）&lt;/li&gt;
&lt;li&gt;  Schema 导出的 &lt;code&gt;collections&lt;/code&gt; 对象，键名是否和目录名一致？&lt;/li&gt;
&lt;li&gt;  Frontmatter 的 YAML 语法是否正确？（引号、冒号、缩进）&lt;/li&gt;
&lt;li&gt;  所有必填字段是否都填了？&lt;/li&gt;
&lt;li&gt;  字段类型是否和 Schema 定义一致？&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;老实讲，这些问题看起来复杂，但实际上 Astro 的错误提示已经很友好了。只要仔细看错误信息，基本都能快速定位问题。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;**不知道 Content Collections 是什么？**现在你应该明白了，它就是给 Markdown 内容加上 TypeScript 类型检查。让 Astro 能在编译时发现错误，而不是等到页面崩了才知道。&lt;/p&gt;&lt;p&gt;**配置文件怎么写？**记住三步：建 &lt;code&gt;src/content/&lt;/code&gt; 目录，创建 &lt;code&gt;src/content.config.ts&lt;/code&gt; 文件，用 &lt;code&gt;defineCollection()&lt;/code&gt; 和 Zod 定义 Schema。键名要和目录名一致。&lt;/p&gt;&lt;p&gt;**Schema 验证怎么用？**掌握基础类型（&lt;code&gt;z.string()&lt;/code&gt;、&lt;code&gt;z.coerce.date()&lt;/code&gt;、&lt;code&gt;z.array()&lt;/code&gt;），学会用 &lt;code&gt;.optional()&lt;/code&gt; 和 &lt;code&gt;.default()&lt;/code&gt;，遇到错误就看 Astro 的提示信息。&lt;/p&gt;&lt;p&gt;老实讲，Content Collections 是我认为 Astro 最值得用的功能之一。前期多花点时间配置，后期能省下无数排查 bug 的时间。而且编辑器的智能提示真的爽，写代码的体验提升了好几个档次。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;下一步行动&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你现在就想试试 Content Collections，建议这样做：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;新项目直接用&lt;/strong&gt;：创建 Astro 项目时，直接配置 Content Collections，从一开始就建立规范&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;老项目逐步迁移&lt;/strong&gt;：先用 &lt;code&gt;.passthrough()&lt;/code&gt; 让现有内容能跑起来，然后慢慢统一 frontmatter 结构&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;参考官方文档&lt;/strong&gt;：遇到问题看 &lt;a href=&quot;https://docs.astro.build/en/guides/content-collections/&quot; target=&quot;_blank&quot;&gt;Astro 官方文档&lt;/a&gt;，那里有完整的 API 参考&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Content Collections 不难，但需要动手实践。看再多教程，不如自己写一遍配置文件。试试吧，你会喜欢上这种类型安全的感觉。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Mac ARM 平台手动部署 ComfyUI 指南</title><link>https://blog.moewah.com/posts/mac-arm-comfyui-manual-installation-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/mac-arm-comfyui-manual-installation-guide/</guid><description>如何在 Mac ARM Silicon 上成功安装 ComfyUI？本文详细拆解手动部署流程，解决桌面版更新慢、BUG多的问题，提供从虚拟环境创建到插件安装的完整方案，助你高效运行 ComfyUI。</description><pubDate>Tue, 11 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;对于 Mac 用户主要推荐使用 ComfyUI Desktop 版本，你可以访问&lt;a href=&quot;https://docs.comfy.org/zh-CN/installation/desktop/macos&quot; target=&quot;_blank&quot;&gt;ComfyUI Desktop 版本安装教程&lt;/a&gt;来使用 ComfyUI，之所以选择手动安装 ComfyUI 是因为在 Mac ARM Silicon 平台的 BUG 较多而桌面版（稳定版）的更新较为缓慢，使用手动安装的方式（可以自由的切换版本）获得最及时的问题修复以及新的功能支持，同时能做到让 ComfyUI 静默的运行，是我认为较为舒服的方式。&lt;/p&gt;
&lt;p&gt;‍&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;1、创建虚拟环境&lt;a href=&quot;#1创建虚拟环境&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://docs.anaconda.com/free/miniconda/index.html#latest-miniconda-installer-links&quot; target=&quot;_blank&quot;&gt;Install Miniconda&lt;/a&gt;. 这将帮助您安装 ComfyUI 所需的正确版本的 Python 和其他库。使用 Conda 创建一个环境。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;conda create -n comfyenv&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;conda activate comfyenv&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;‍&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;2、克隆代码仓库&lt;a href=&quot;#2克隆代码仓库&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;你需要保证你的系统上已经安装了 &lt;a href=&quot;https://git-scm.com/downloads&quot; target=&quot;_blank&quot;&gt;Git&lt;/a&gt;, 首先你需要打开终端（命令行）,然后克隆代码仓库。&lt;/p&gt;&lt;p&gt;打开&lt;a href=&quot;https://support.apple.com/guide/terminal/open-or-quit-terminal-apd5265185d-f365-44cb-8b09-71a064a42125/mac&quot; target=&quot;_blank&quot;&gt;终端应用程序&lt;/a&gt;。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git clone git@github.com:comfyanonymous/ComfyUI.git&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;‍&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;3、安装GPU 及 ComfyUI 依赖&lt;a href=&quot;#3安装gpu-及-comfyui-依赖&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;1、安装 GPU 依赖&lt;/p&gt;&lt;p&gt;Mac ARM Silicon 平台执行&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;conda&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pytorch-nightly::pytorch&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;torchvision&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;torchaudio&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;pytorch-nightly&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;2、安装 ComfyUI 依赖&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/ComfyUI&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pip&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-r&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;requirements.txt&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;3、安装插件管理器（ComfyUI-Manager）&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd ~/ComfyUI/custom_nodes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git clone https://github.com/ltdrdata/ComfyUI-Manager.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd ComfyUI-Manager &amp;amp;&amp;amp; pip install -r requirements.txt&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;4、安装汉化插件（装上后还是可以选择使用英文界面，可在设置中进行切换）&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd ~/ComfyUI/custom_nodes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git clone https://github.com/AIGODLIKE/AIGODLIKE-COMFYUI-TRANSLATION.git&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;3、启动 ComfyUI&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/ComfyUI&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;python&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;main.py&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;4、添加外部模型路径（可选）&lt;a href=&quot;#4添加外部模型路径可选&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果想要共用 &lt;code&gt;ComfyUI/models&lt;/code&gt;​ 模型，通过 &lt;code&gt;extra_model_paths.yaml&lt;/code&gt; 配置文件来添加额外模型搜索路径。&lt;/p&gt;&lt;p&gt;可以在 ComfyUI 的根目录下找到 &lt;code&gt;extra_model_paths.yaml.example&lt;/code&gt; 的示例文件&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ComfyUI/extra_model_paths.yaml.example&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;复制并重命名为 &lt;code&gt;extra_model_paths.yaml&lt;/code&gt;​ 来使用, 并保持在 ComfyUI 的根目录下, 路径应该是 &lt;code&gt;ComfyUI/extra_model_paths.yaml&lt;/code&gt;&lt;/p&gt;&lt;p&gt;参考配置如下：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#Rename this to extra_model_paths.yaml and ComfyUI will load it&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#config for comfyui&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#your base path should be either an existing comfy install or a central folder where you store all of your models, loras, etc.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;comfyui:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;base_path:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/Users/gowah_yue/Documents/AIGC/ComfyUI/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#     # You can use is_default to mark that these folders should be listed first, and used as the default dirs for eg downloads&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#     #is_default: true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;animatediff_models:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/animatediff_models&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;animatediff_motion_lora:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/animatediff_motion_lora&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;animatediff_video_formats:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/animatediff_video_formats&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;blip:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/blip&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;checkpoints:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/checkpoints&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;clip:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/clip&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;clip_vision:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/clip_vision&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;CogVideo:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/CogVideo&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;configs:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/configs&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;controlnet:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/controlnet&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;diffusers:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/diffusers&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;diffusion_models:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/diffusion_models&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;embeddings:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/embeddings&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;gligen:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/gligen&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;hypernetworks:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/hypernetworks&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;insightface:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/insightface&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;Joy_caption:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/Joy_caption&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;layerstyle:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/layerstyle&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;liveportrait:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/liveportrait&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;LLM:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/LLM&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;loras:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/loras&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;model_patches:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/model_patches&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;photomaker:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/photomaker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;style_models:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/style_models&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;text_encoders:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/text_encoders&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;unet:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/unet&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;upscale_models:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/upscale_models&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;vae:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/vae&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;vae_approx:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/vae_approx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;xlabs:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;models/xlabs&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#config for a1111 ui&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#all you have to do is uncomment this (remove the #) and change the base_path to where yours is installed&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#a111:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#     base_path: path/to/stable-diffusion-webui/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#     checkpoints: models/Stable-diffusion&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#     configs: models/Stable-diffusion&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#     vae: models/VAE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#     loras: |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#          models/Lora&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;51&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#          models/LyCORIS&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;52&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#     upscale_models: |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;53&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#                   models/ESRGAN&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;54&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#                   models/RealESRGAN&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;55&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#                   models/SwinIR&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;56&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#     embeddings: embeddings&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;57&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#     hypernetworks: models/hypernetworks&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;58&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#     controlnet: models/ControlNet&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;59&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;60&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;61&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# For a full list of supported keys (style_models, vae_approx, hypernetworks, photomaker,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;62&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# model_patches, audio_encoders, classifiers, etc.) see folder_paths.py.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;63&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;64&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#other_ui:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;65&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#    base_path: path/to/ui&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;66&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#    checkpoints: models/checkpoints&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;67&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#    gligen: models/gligen&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;68&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#    custom_nodes: path/custom_nodes&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这里我将之前桌面端使用过程留存的 &lt;code&gt;models&lt;/code&gt;​ 文件夹迁移至 &lt;code&gt;/Users/gowah_yue/Documents/AIGC/ComfyUI/&lt;/code&gt;​ 并作为 &lt;code&gt;base_path&lt;/code&gt; 目录，各个模型文件夹分别使用相对路径。&lt;/p&gt;&lt;p&gt;如果想要和桌面端共存的朋友，可以在 macOS ComfyUI 桌面端 &lt;code&gt;~/Library/Application Support/ComfyUI/extra_models_config.yaml&lt;/code&gt; 做出相应的修改。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;4、为 ComfyUI 服务创建自启动脚本&lt;a href=&quot;#4为-comfyui-服务创建自启动脚本&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在 &lt;code&gt;~/Library/LaunchAgents&lt;/code&gt;​ 路径下创建 &lt;code&gt;local.startup.comfyui.plist&lt;/code&gt; 文件参考如下：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;?xml&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;version=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;1.0&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;encoding=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;UTF-8&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!DOCTYPE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;plist&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;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;-//Apple//DTD PLIST 1.0//EN&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;&quot;&lt;/span&gt;&lt;span&gt;http://www.apple.com/DTDs/PropertyList-1.0.dtd&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;plist&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;version=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;1.0&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;dict&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&amp;lt;key&amp;gt;Label&amp;lt;/key&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&amp;lt;string&amp;gt;local.startup.comfyui&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&amp;lt;key&amp;gt;EnvironmentVariables&amp;lt;/key&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&amp;lt;dict&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&amp;lt;key&amp;gt;PYTORCH_ENABLE_MPS_FALLBACK&amp;lt;/key&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&amp;lt;string&amp;gt;1&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&amp;lt;key&amp;gt;PYTORCH_MPS_HIGH_WATERMARK_RATIO&amp;lt;/key&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&amp;lt;string&amp;gt;1.0&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&amp;lt;key&amp;gt;PYTORCH_MPS_LOW_WATERMARK_RATIO&amp;lt;/key&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&amp;lt;string&amp;gt;0.9&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&amp;lt;/dict&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&amp;lt;key&amp;gt;WorkingDirectory&amp;lt;/key&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&amp;lt;string&amp;gt;/Users/gowah_yue/ComfyUI&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&amp;lt;key&amp;gt;ProgramArguments&amp;lt;/key&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&amp;lt;array&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&amp;lt;string&amp;gt;/opt/miniconda3/envs/comfyenv/bin/python3&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&amp;lt;string&amp;gt;main.py&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&amp;lt;string&amp;gt;--listen&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&amp;lt;string&amp;gt;0.0.0.0&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&amp;lt;string&amp;gt;--port&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&amp;lt;string&amp;gt;8188&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&amp;lt;string&amp;gt;--cache-classic&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&amp;lt;string&amp;gt;--use-split-cross-attention&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&amp;lt;string&amp;gt;--normalvram&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&amp;lt;string&amp;gt;--output-directory&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&amp;lt;string&amp;gt;/Users/gowah_yue/Documents/AIGC/ComfyUI/data/output&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&amp;lt;/array&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&amp;lt;key&amp;gt;RunAtLoad&amp;lt;/key&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&amp;lt;true/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&amp;lt;key&amp;gt;KeepAlive&amp;lt;/key&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&amp;lt;false/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&amp;lt;key&amp;gt;StandardOutPath&amp;lt;/key&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&amp;lt;string&amp;gt;/tmp/local.startup.comfyui.stdout.log&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&amp;lt;key&amp;gt;StandardErrorPath&amp;lt;/key&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&amp;lt;string&amp;gt;/tmp/local.startup.comfyui.stderr.log&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/dict&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/plist&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;‍&lt;/p&gt;&lt;section&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、&lt;code&gt;WorkingDirectory&lt;/code&gt;​ 的值（即 &lt;code&gt;/path/to/your/app&lt;/code&gt;​）&lt;strong&gt;必须&lt;/strong&gt;是你存放 &lt;code&gt;main.py&lt;/code&gt;​ 文件和该文件所需所有其他资源文件的&lt;strong&gt;实际目录&lt;/strong&gt;的绝对路径。&lt;/p&gt;&lt;p&gt;2、使用 &lt;code&gt;ProgramArguments&lt;/code&gt;​ 实现 Python 运行，需要在之前创建 ComfyUI 的虚拟环境下（也就是需要运行 &lt;code&gt;conda activate comfyenv&lt;/code&gt;​ 激活虚拟环境后）运行 &lt;code&gt;which python3&lt;/code&gt;​ 获取在该环境下 &lt;code&gt;python3&lt;/code&gt;​ 命令的实际路径，并写入到脚本文件的 &lt;code&gt;&amp;lt;string&amp;gt;&lt;/code&gt; 中。&lt;/p&gt;&lt;p&gt;3、脚本同时加入了优化 Pytorch 环境变量 &lt;code&gt;PYTORCH_ENABLE_MPS_FALLBACK&lt;/code&gt;​ 和 &lt;code&gt;PYTORCH_MPS_HIGH_WATERMARK_RATIO&lt;/code&gt;​ 确保 PyTorch 不支持的情况&lt;strong&gt;不会立即报错或崩溃&lt;/strong&gt;，而是会自动将该操作转移到 &lt;strong&gt;CPU&lt;/strong&gt; 上执行，同时确保 PyTorch 将 &lt;strong&gt;内存缓存&lt;/strong&gt; 限制在&lt;strong&gt;总 GPU 可用内存的 80%&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;‍&lt;/p&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 1. 卸载旧配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;launchctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;unload&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/Library/LaunchAgents/local.startup.comfyui.plist&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 2. 重新加载新配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;launchctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;load&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/Library/LaunchAgents/local.startup.comfyui.plist&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 3. 立即启动新服务&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;launchctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;local.startup.comfyui&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;‍&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;5、如何更新 ComfyUI&lt;a href=&quot;#5如何更新-comfyui&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;1、拉取最新代码&lt;/p&gt;&lt;p&gt;使用命令行进入 ComfyUI 的安装路径，然后拉取最新代码。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd &amp;lt;安装路径&amp;gt;/ComfyUI&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git pull&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;2、安装依赖&lt;/p&gt;&lt;p&gt;使用命令行进入 ComfyUI 的安装路径，然后安装依赖。&lt;/p&gt;&lt;p&gt;你需要确保当前的 Python 环境是 ComfyUI 的虚拟环境，否则依赖会安装到系统级 Python 环境，污染系统级 Python 环境。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pip install -r requirements.txt&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;‍&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;6、&lt;strong&gt;进阶优化&lt;/strong&gt;&lt;a href=&quot;#6进阶优化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;外置硬盘部署&lt;/strong&gt;：（上述的开机脚本需要修改其中的路径）&lt;br /&gt;
手动安装版本可将整个 ComfyUI 文件夹拷贝至外置 SSD，启动时指定路径：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd /Volumes/SSD/ComfyUI &amp;amp;&amp;amp; source venv/bin/activate &amp;amp;&amp;amp; python main.py&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;​&lt;strong&gt;性能调优&lt;/strong&gt;​：&lt;br /&gt;
编辑 &lt;code&gt;~/.bash_profile&lt;/code&gt; 添加环境变量提升推理速度：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export PYTORCH_ENABLE_MPS_FALLBACK=1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export PYTORCH_MPS_HIGH_WATERMARK_RATIO=0.8&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;应用环境变量&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;source&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.bash_profile&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;‍&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Astro网站SEO优化完全指南：从meta标签到排名提升</title><link>https://blog.moewah.com/posts/astro-website-seo-optimization-complete-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/astro-website-seo-optimization-complete-guide/</guid><description>Astro网站为什么搜索排名上不去？本文详细拆解从meta标签、sitemap到结构化数据的完整SEO配置方案，手把手教你提升Google收录率和搜索排名。</description><pubDate>Tue, 04 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;你花了一周时间用Astro搭建了一个漂亮的博客，满心期待地发布上线。结果两个月过去了，在Google搜索你的文章标题，翻到第三页都找不到。每天打开Google Analytics，访客数量还是个位数。你开始怀疑：是不是哪里出问题了？&lt;/p&gt;
&lt;p&gt;我刚从Next.js迁移到Astro时，听说Astro的性能特别好，加载速度能比传统React框架快40%，甚至可以拿到100分的Lighthouse评分。结果网站是快了，但搜索排名完全没起来。后来才发现，光有性能优势还不够，SEO配置才是关键。&lt;/p&gt;
&lt;p&gt;Astro的SEO优化其实不难。这篇文章教你配置完整的Astro网站SEO方案，包括meta标签、sitemap、robots.txt、结构化数据这些核心环节。每个部分都有可以直接复制的代码示例，照着做，30分钟就能完成基础配置。一两周后，你就能在Google Search Console看到网站被收录的好消息了。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;为什么Astro特别适合SEO？&lt;a href=&quot;#为什么astro特别适合seo&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Astro最大的特点就是&lt;strong&gt;默认零JavaScript&lt;/strong&gt;。它会把你的页面直接生成静态HTML，搜索引擎爬虫看到的就是纯净的HTML内容，不需要等JS执行完才能看到东西。&lt;/p&gt;&lt;p&gt;这个”岛屿架构”（Islands Architecture）特别聪明。页面主体是静态的HTML，只有需要交互的部分（比如一个点赞按钮）才会加载对应的JS。这样首屏时间超快，Google的爬虫特别喜欢。&lt;/p&gt;&lt;p&gt;我之前用Next.js的时候，即使开了SSR，打包出来的JS文件还是挺大的。迁移到Astro后，JavaScript体积直接减少了90%。Lighthouse跑分直接从78分跳到了98分。&lt;/p&gt;&lt;section&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;Astro&lt;/strong&gt;：适合博客、文档站、营销网站这种内容为主的网站。加载速度快，2025年的数据显示，Astro在开发者中的使用率已经增长到18%了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Next.js&lt;/strong&gt;：更适合需要复杂交互的Web应用，比如后台管理系统、电商网站。如果你需要很多客户端状态管理，Next.js会更合适。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Gatsby&lt;/strong&gt;：也是静态生成，跟Astro类似。但Gatsby打包出来的体积有点大，而且构建速度比Astro慢一些。&lt;/p&gt;&lt;p&gt;有个真实案例，我朋友的技术博客从Next.js迁到Astro后，加载速度提升了50%左右。Google Search Console的数据显示，页面停留时间也从平均1分20秒涨到了2分10秒。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Meta标签完整配置&lt;a href=&quot;#meta标签完整配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Meta标签是SEO优化的第一步。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;基础三件套：title、description、keywords&lt;a href=&quot;#基础三件套titledescriptionkeywords&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;我刚开始用Astro的时候，也在meta标签配置上卡了好久。看着满屏的&lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt;标签，完全不知道该从哪个开始。后来发现，其实核心就三个：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;title标签&lt;/strong&gt;：这是最重要的，Google搜索结果里显示的大标题就是它。长度控制在50-60个字符最好，太长会被截断。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;description标签&lt;/strong&gt;：搜索结果下面那段灰色的描述文字。长度120-160字符，一定要包含核心关键词。Google用点击率(CTR)来判断你的结果好不好。优化好的description能提升20-30%的点击率。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;keywords标签&lt;/strong&gt;：这个现在不太重要了，Google基本不看它。但写上也没坏处，3-5个关键词就够了。&lt;/p&gt;&lt;p&gt;在Astro中配置很简单，直接在&lt;code&gt;.astro&lt;/code&gt;文件的&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;部分写：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const title = &quot;Astro网站SEO优化完全指南&quot;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const description = &quot;教你配置Astro网站的完整SEO方案，包括meta标签、sitemap、robots.txt、结构化数据等。&quot;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;title&amp;gt;{title}&amp;lt;/title&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta name=&quot;description&quot; content={description} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta name=&quot;keywords&quot; content=&quot;Astro SEO, Astro优化, meta标签, sitemap&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Open Graph和Twitter Card&lt;a href=&quot;#open-graph和twitter-card&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这两个是社交媒体分享的时候用的。别人在微信或推特分享文章链接时，会自动显示标题、描述和配图。那就是Open Graph (OG)标签起的作用。&lt;/p&gt;&lt;p&gt;我第一次看到一大堆&lt;code&gt;og:xxx&lt;/code&gt;的标签，完全不知道哪些是必须的。后来摸索出来，核心就这几个：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;meta property=&quot;og:title&quot; content={title} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;meta property=&quot;og:description&quot; content={description} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;meta property=&quot;og:image&quot; content=&quot;https://你的网站.com/og-image.jpg&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;meta property=&quot;og:url&quot; content=&quot;https://你的网站.com/当前页面路径&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;meta property=&quot;og:type&quot; content=&quot;article&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- Twitter卡片 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;meta name=&quot;twitter:card&quot; content=&quot;summary_large_image&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;meta name=&quot;twitter:title&quot; content={title} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;meta name=&quot;twitter:description&quot; content={description} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;meta name=&quot;twitter:image&quot; content=&quot;https://你的网站.com/twitter-image.jpg&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;og&lt;img /&gt;的坑&lt;/strong&gt;：图片尺寸很关键，推荐用1200x630px。我第一次配的时候用了个500x300的小图，结果微信分享出来特别糊。后来改成1200x630，效果立马不一样了。&lt;/p&gt;&lt;/section&gt;&lt;section&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;手动给每个页面写一遍meta标签太麻烦了。创建一个&lt;code&gt;BaseHead.astro&lt;/code&gt;组件，统一管理所有meta标签。&lt;/p&gt;&lt;p&gt;创建&lt;code&gt;src/components/BaseHead.astro&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;interface Props {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title: string;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description: string;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;image?: string;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const { title, description, image = &quot;/default-og-image.jpg&quot; } = Astro.props;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const canonicalURL = new URL(Astro.url.pathname, Astro.site);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;!-- 基础meta --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta charset=&quot;utf-8&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;link rel=&quot;icon&quot; type=&quot;image/svg+xml&quot; href=&quot;/favicon.svg&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;!-- SEO --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;title&amp;gt;{title}&amp;lt;/title&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta name=&quot;description&quot; content={description} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;link rel=&quot;canonical&quot; href={canonicalURL} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;!-- Open Graph --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta property=&quot;og:type&quot; content=&quot;website&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta property=&quot;og:url&quot; content={canonicalURL} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta property=&quot;og:title&quot; content={title} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta property=&quot;og:description&quot; content={description} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta property=&quot;og:image&quot; content={new URL(image, Astro.site)} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;!-- Twitter --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta name=&quot;twitter:card&quot; content=&quot;summary_large_image&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta name=&quot;twitter:title&quot; content={title} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta name=&quot;twitter:description&quot; content={description} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;meta name=&quot;twitter:image&quot; content={new URL(image, Astro.site)} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;然后在你的页面文件里直接引用：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import BaseHead from &apos;../components/BaseHead.astro&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;BaseHead&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title=&quot;我的文章标题&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description=&quot;文章描述&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;image=&quot;/my-article-cover.jpg&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;!-- 页面内容 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果你用Content Collections管理博客文章，还能从frontmatter自动提取标题和描述，那就更方便了。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Sitemap和Robots.txt&lt;a href=&quot;#sitemap和robotstxt&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Meta标签配好之后，下一步就是让Google能找到你的网站。这就需要sitemap和robots.txt。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;Sitemap：告诉搜索引擎你有哪些页面&lt;a href=&quot;#sitemap告诉搜索引擎你有哪些页面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Sitemap就是一个XML文件，里面列出了你网站的所有页面。Google的爬虫看到这个文件，就知道该去抓取哪些页面了。配置sitemap后，搜索引擎索引时间能缩短50%左右。&lt;/p&gt;&lt;p&gt;sitemap的配置很简单，Astro官方提供了&lt;code&gt;@astrojs/sitemap&lt;/code&gt;插件，一行命令就搞定：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npx astro add sitemap&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;运行这个命令，Astro会自动修改你的&lt;code&gt;astro.config.mjs&lt;/code&gt;文件，添加sitemap配置：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { defineConfig } from &apos;astro/config&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import sitemap from &apos;@astrojs/sitemap&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default defineConfig({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;site: &apos;https://你的网站.com&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;integrations: [sitemap()],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;重点&lt;/strong&gt;：&lt;code&gt;site&lt;/code&gt;字段一定要配置，不然sitemap生成不了。这是我踩过的坑，第一次忘了配&lt;code&gt;site&lt;/code&gt;，构建的时候一直报错。&lt;/p&gt;&lt;p&gt;配置好之后，运行&lt;code&gt;npm run build&lt;/code&gt;，Astro会在&lt;code&gt;dist/&lt;/code&gt;目录生成&lt;code&gt;sitemap-0.xml&lt;/code&gt;和`sitemap-index.xml文件。如果你的网站页面特别多（超过5万个），还会自动拆分成多个sitemap文件。&lt;/p&gt;&lt;p&gt;在网站的&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;里加个sitemap链接：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;link rel=&quot;sitemap&quot; href=&quot;/sitemap-index.xml&quot; /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Robots.txt：设置抓取规则&lt;a href=&quot;#robotstxt设置抓取规则&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Robots.txt告诉搜索引擎哪些页面能抓，哪些不能抓。比如你的后台管理页面、测试页面，肯定不想被Google收录吧。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;方法1：静态文件（推荐新手）&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;直接在&lt;code&gt;public/&lt;/code&gt;目录下创建一个&lt;code&gt;robots.txt&lt;/code&gt;文件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;User-agent: *&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Allow: /&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Sitemap: https://你的网站.com/sitemap-index.xml&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果你想禁止某些路径，可以加&lt;code&gt;Disallow&lt;/code&gt;规则：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;User-agent: *&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Allow: /&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Disallow: /admin/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Disallow: /test/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Sitemap: https://你的网站.com/sitemap-index.xml&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;方法2：动态生成&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你想复用&lt;code&gt;astro.config.mjs&lt;/code&gt;里的&lt;code&gt;site&lt;/code&gt;配置，可以创建&lt;code&gt;src/pages/robots.txt.ts&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import type { APIRoute } from &apos;astro&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const robotsTxt = `&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;User-agent: *&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Allow: /&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Sitemap: ${import.meta.env.SITE}/sitemap-index.xml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;`.trim();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export const GET: APIRoute = () =&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return new Response(robotsTxt, {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;headers: { &apos;Content-Type&apos;: &apos;text/plain&apos; },&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;百度SEO的特殊注意事项&lt;a href=&quot;#百度seo的特殊注意事项&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;百度有个特殊要求：&lt;strong&gt;不支持sitemap-index.xml&lt;/strong&gt;。如果你在robots.txt里写了sitemap-index.xml，百度会提示”Robots阻止”，导致无法抓取。&lt;/p&gt;&lt;p&gt;如果你的网站需要做百度SEO，有两个办法：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;在robots.txt里只写单个sitemap文件路径（比如sitemap-0.xml），不要写sitemap-index.xml&lt;/li&gt;
&lt;li&gt;单独给百度配置一个简化版的sitemap，通过百度站长平台手动提交&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;我个人的做法是以Google为主，百度的话通过站长平台手动提交sitemap。对大多数技术博客来说，Google的流量占比更大。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;提交到Google Search Console&lt;a href=&quot;#提交到google-search-console&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;配置好sitemap和robots.txt后，别忘了去&lt;a href=&quot;https://search.google.com/search-console&quot; target=&quot;_blank&quot;&gt;Google Search Console&lt;/a&gt;提交sitemap。步骤很简单：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;添加你的网站并验证所有权&lt;/li&gt;
&lt;li&gt;左侧菜单找到”站点地图”&lt;/li&gt;
&lt;li&gt;输入&lt;code&gt;sitemap-index.xml&lt;/code&gt;并提交&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;提交之后，一般1-3天内Google就会开始抓取。你能在Search Console看到抓取进度和发现的问题。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;结构化数据（JSON-LD）&lt;a href=&quot;#结构化数据json-ld&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;结构化数据听起来很高大上，但配置起来不难。而且效果特别明显。&lt;/p&gt;&lt;section&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;你有没有注意过，有些搜索结果特别丰富？比如显示文章评分、发布时间、作者头像、甚至是食谱的烹饪时间和卡路里。这些就是”富媒体搜索结果”（Rich Snippets），背后靠的就是结构化数据。&lt;/p&gt;&lt;p&gt;结构化数据就是用一种Google能理解的格式，告诉它”这是一篇博客文章”、“作者是谁”、“发布时间是什么时候”。&lt;/p&gt;&lt;p&gt;Google推荐用JSON-LD格式，它是基于JSON的，写起来很直观。配置之后，搜索结果的点击率能提升不少。我自己的博客配置之后，点击率大概提升了15%左右。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;在Astro中实现JSON-LD&lt;a href=&quot;#在astro中实现json-ld&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在Astro里配置JSON-LD很简单，用&lt;code&gt;set:html&lt;/code&gt;指令就行。创建一个组件，比如&lt;code&gt;src/components/StructuredData.astro&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;interface Props {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type: &apos;WebSite&apos; | &apos;BlogPosting&apos; | &apos;Article&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title: string;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description: string;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;author?: string;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;datePublished?: string;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;image?: string;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type = &apos;Article&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;author = &apos;你的名字&apos;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;datePublished,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;} = Astro.props;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const canonicalURL = new URL(Astro.url.pathname, Astro.site);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const structuredData = {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;@context&quot;: &quot;https://schema.org&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;@type&quot;: type,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;headline&quot;: title,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;description&quot;: description,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;author&quot;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;@type&quot;: &quot;Person&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;name&quot;: author&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;datePublished&quot;: datePublished,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;image&quot;: image ? new URL(image, Astro.site).href : undefined,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;url&quot;: canonicalURL.href,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;mainEntityOfPage&quot;: {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;@type&quot;: &quot;WebPage&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;@id&quot;: canonicalURL.href&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;script type=&quot;application/ld+json&quot; set:html={JSON.stringify(structuredData)} /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;然后在你的文章页面里引用：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import StructuredData from &apos;../components/StructuredData.astro&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const frontmatter = {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title: &quot;Astro网站SEO优化完全指南&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description: &quot;教你配置Astro SEO&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;author: &quot;张三&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pubDate: &quot;2025-12-02&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;coverImage: &quot;/cover.jpg&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;StructuredData&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;type=&quot;BlogPosting&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title={frontmatter.title}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description={frontmatter.description}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;author={frontmatter.author}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;datePublished={frontmatter.pubDate}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;image={frontmatter.coverImage}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;!-- 文章内容 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：一定要用&lt;code&gt;set:html&lt;/code&gt;指令，不然Astro会把JSON转义成文本，就不生效了。&lt;/p&gt;&lt;/section&gt;&lt;section&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;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://validator.schema.org/&quot; target=&quot;_blank&quot;&gt;Schema.org验证器&lt;/a&gt;&lt;/strong&gt;：粘贴你的网页URL，它会检查JSON-LD是否符合标准&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://search.google.com/test/rich-results&quot; target=&quot;_blank&quot;&gt;Google富媒体搜索结果测试&lt;/a&gt;&lt;/strong&gt;：这个更重要，它会告诉你Google能不能正确识别你的结构化数据&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;两个都用，因为有时候一个检测通过，另一个会报警告。两个都通过才算真正配置成功。&lt;/p&gt;&lt;p&gt;常见错误有：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;缺少必填字段（比如&lt;code&gt;datePublished&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;图片URL不完整（要用绝对路径，不能用相对路径）&lt;/li&gt;
&lt;li&gt;JSON格式写错了（多了逗号或者少了引号）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;性能优化也是SEO优化&lt;a href=&quot;#性能优化也是seo优化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;网站性能其实也是SEO的重要部分。Google明确表示，页面加载速度会影响搜索排名。55%的用户会在3秒内离开加载慢的网站。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;Core Web Vitals：Google的三大性能指标&lt;a href=&quot;#core-web-vitalsgoogle的三大性能指标&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Google用三个指标来衡量网站性能，统称”Core Web Vitals”：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;LCP（最大内容绘制）&lt;/strong&gt;：页面主要内容加载完成的时间。标准是小于2.5秒。超过4秒就算差。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;FID（首次输入延迟）&lt;/strong&gt;：用户第一次点击页面元素，到浏览器响应的时间。标准是小于100毫秒。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;CLS（累积布局偏移）&lt;/strong&gt;：页面元素会不会突然跳动。比如你正要点一个按钮，结果图片加载完了，按钮被挤到下面去了。标准是小于0.1。&lt;/p&gt;&lt;p&gt;这三个指标直接影响Google排名。Astro天生性能就好，只要稍微注意下，很容易达标。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Astro性能优化技巧&lt;a href=&quot;#astro性能优化技巧&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;图片往往是拖慢网站的罪魁祸首。Astro有个&lt;code&gt;&amp;lt;Image&amp;gt;&lt;/code&gt;组件，可以自动优化图片：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { Image } from &apos;astro:assets&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import myImage from &apos;../assets/my-image.jpg&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;Image&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;src={myImage}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;alt=&quot;图片描述&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;width={800}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;height={600}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;loading=&quot;lazy&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这个组件会自动：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;根据设备尺寸生成多个图片版本&lt;/li&gt;
&lt;li&gt;转换成WebP格式（更小）&lt;/li&gt;
&lt;li&gt;懒加载（页面滚动到图片位置才加载）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我之前的一个项目，首页有10张大图，优化前LCP是4.2秒。换成&lt;code&gt;&amp;lt;Image&amp;gt;&lt;/code&gt;组件后，直接降到1.8秒。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;字体优化&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;自定义字体也是性能杀手。最简单的优化方法是加&lt;code&gt;font-display: swap&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@font-face {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;font-family: &apos;MyFont&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;src: url(&apos;/fonts/my-font.woff2&apos;) format(&apos;woff2&apos;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;font-display: swap;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;font-display: swap&lt;/code&gt;的意思是：字体加载期间先用系统字体显示文字，加载完再切换。&lt;/p&gt;&lt;p&gt;更好的方案是用Google Fonts的优化版：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;link rel=&quot;preconnect&quot; href=&quot;https://fonts.googleapis.com&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;link rel=&quot;preconnect&quot; href=&quot;https://fonts.gstatic.com&quot; crossorigin&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;link href=&quot;https://fonts.googleapis.com/css2?family=Inter:wght@400;700&amp;amp;display=swap&quot; rel=&quot;stylesheet&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;注意URL最后的&lt;code&gt;&amp;amp;display=swap&lt;/code&gt;，这就是字体优化。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;代码分割和懒加载&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Astro的岛屿架构本身就是最好的代码分割方案。但如果你用了React、Vue等框架的组件，记得加上懒加载指令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import MyHeavyComponent from &apos;../components/MyHeavyComponent.jsx&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- 只有当组件进入视口时才加载 --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;MyHeavyComponent client:visible /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;client:visible&lt;/code&gt;指令会等到组件滚动到可见区域才加载JS，大大提升首屏速度。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;用Lighthouse监控性能&lt;a href=&quot;#用lighthouse监控性能&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;做完优化，怎么知道效果如何呢？用Lighthouse跑分。&lt;/p&gt;&lt;p&gt;在Chrome浏览器按F12打开开发者工具，找到”Lighthouse”标签，点”Analyze page load”就行。它会给你的网站打分（满分100），并列出所有性能问题。&lt;/p&gt;&lt;p&gt;我的习惯是每次发布新版本前都跑一次Lighthouse，确保分数在90以上。低于90就得排查原因，针对性优化。&lt;/p&gt;&lt;p&gt;还有个线上工具&lt;a href=&quot;https://pagespeed.web.dev/&quot; target=&quot;_blank&quot;&gt;PageSpeed Insights&lt;/a&gt;，输入URL就能测，还能看到真实用户的性能数据。&lt;/p&gt;&lt;p&gt;Astro的优势就在这里：默认零JavaScript，性能底子好。我用Astro重建博客后，Lighthouse分数从78直接跳到98。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;section&gt;&lt;h3&gt;SEO配置检查清单（15项核心检查）&lt;a href=&quot;#seo配置检查清单15项核心检查&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;code&gt;astro.config.mjs&lt;/code&gt;中配置了&lt;code&gt;site&lt;/code&gt;字段&lt;/li&gt;
&lt;li&gt; 创建了&lt;code&gt;BaseHead.astro&lt;/code&gt;组件统一管理meta标签&lt;/li&gt;
&lt;li&gt; 每个页面都有唯一的title（50-60字符）&lt;/li&gt;
&lt;li&gt; 每个页面都有description（120-160字符）&lt;/li&gt;
&lt;li&gt; 配置了Open Graph标签（title、description、image、url）&lt;/li&gt;
&lt;li&gt; 配置了Twitter Card标签&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Sitemap和Robots&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt; 安装并配置了&lt;code&gt;@astrojs/sitemap&lt;/code&gt;&lt;/li&gt;
&lt;li&gt; &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;中添加了sitemap链接&lt;/li&gt;
&lt;li&gt; 创建了&lt;code&gt;robots.txt&lt;/code&gt;文件&lt;/li&gt;
&lt;li&gt; 已通过Google Search Console提交sitemap&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;结构化数据&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt; 首页配置了WebSite类型的JSON-LD&lt;/li&gt;
&lt;li&gt; 文章页配置了BlogPosting/Article类型的JSON-LD&lt;/li&gt;
&lt;li&gt; 通过Schema.org验证器验证通过&lt;/li&gt;
&lt;li&gt; 通过Google富媒体搜索结果测试&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;性能优化&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt; Lighthouse分数在90以上&lt;/li&gt;
&lt;li&gt; Core Web Vitals三项指标达标（LCP&amp;lt;2.5s, FID&amp;lt;100ms, CLS&amp;lt;0.1）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;全部打勾后，你的Astro网站SEO基本就配置完了。&lt;/p&gt;&lt;/section&gt;&lt;section&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;Q1: 网站不被Google收录怎么办？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;可能的原因和解决方案：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;robots.txt阻止了抓取&lt;/strong&gt;：检查robots.txt是否有&lt;code&gt;Disallow: /&lt;/code&gt;，如果有就删掉&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sitemap没提交&lt;/strong&gt;：去Google Search Console提交sitemap&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网站太新&lt;/strong&gt;：新网站需要1-2周才能被收录，耐心等待&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内容质量太差&lt;/strong&gt;：Google不收录低质量内容，确保文章有实际价值&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;Q2: sitemap提交后还是显示错误？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;检查以下几点：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;astro.config.mjs&lt;/code&gt;的&lt;code&gt;site&lt;/code&gt;字段是否正确&lt;/li&gt;
&lt;li&gt;sitemap的URL路径是否能正常访问&lt;/li&gt;
&lt;li&gt;是否有页面返回404错误&lt;/li&gt;
&lt;li&gt;百度的话，检查是否用了sitemap-index（百度不支持）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Q3: 百度SEO怎么做？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;百度SEO跟Google有些不同：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;不要在robots.txt里写&lt;code&gt;sitemap-index.xml&lt;/code&gt;，写单个sitemap文件路径&lt;/li&gt;
&lt;li&gt;通过&lt;a href=&quot;https://ziyuan.baidu.com/&quot; target=&quot;_blank&quot;&gt;百度站长平台&lt;/a&gt;手动提交sitemap&lt;/li&gt;
&lt;li&gt;百度对新站审核更严，收录时间通常比Google长&lt;/li&gt;
&lt;li&gt;百度更看重中文内容质量和原创性&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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天生适合SEO，配置起来也不复杂。&lt;/p&gt;&lt;p&gt;核心就三件事：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;基础meta标签&lt;/strong&gt;：title、description、OG标签，用BaseHead组件统一管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sitemap和robots.txt&lt;/strong&gt;：用官方插件一行命令搞定，别忘了提交到Google Search Console&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结构化数据&lt;/strong&gt;：配置JSON-LD，争取富媒体搜索结果&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;性能优化也别忽略，Lighthouse分数90+是基本要求。图片用懒加载，字体加&lt;code&gt;font-display: swap&lt;/code&gt;，这些小细节都能提升排名。&lt;/p&gt;&lt;p&gt;按照这篇文章的步骤，30分钟能完成核心配置。一两周后，你就能在Google Search Console看到网站被收录的好消息了。&lt;/p&gt;&lt;p&gt;现在，立即打开你的Astro项目，按照上面的检查清单逐项配置吧。配置完记得提交sitemap，然后耐心等待。一周后回来查看收录情况，你会惊喜地发现排名提升了。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Astro vs Next.js 性能对比真相揭秘</title><link>https://blog.moewah.com/posts/astro-vs-nextjs-performance-optimization-framework-comparison/</link><guid isPermaLink="true">https://blog.moewah.com/posts/astro-vs-nextjs-performance-optimization-framework-comparison/</guid><description>Astro和Next.js到底谁更快？本文通过实测数据对比两者在JavaScript体积、Lighthouse评分、首屏加载速度等核心指标，揭示Astro性能优势背后的架构差异，助你做出更明智的技术选型决策。</description><pubDate>Sat, 01 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;给技术博客选框架这事我纠结了好一阵子。&lt;/p&gt;
&lt;p&gt;一开始看上了 Next.js，毕竟是 Vercel 出品，React 生态又这么强大，感觉”选它准没错”。但后来在社区里看到越来越多人推荐 Astro，说什么”性能爆表”、“Lighthouse 满分”，又开始动摇了。&lt;/p&gt;
&lt;p&gt;我干脆花了两天时间，把两个框架都试了一遍。用同样的内容搭了两个版本的博客，跑了 Lighthouse，对比了构建速度，甚至把网站部署上线实测访问速度。结果让我挺惊讶的——Astro 的 Lighthouse 评分直接从 88 跳到 100，首屏加载快了将近一半。&lt;/p&gt;
&lt;p&gt;这篇文章就是我的对比总结。用真实数据说话，从性能、架构、生态、部署四个维度深度剖析这两个框架。&lt;/p&gt;
&lt;section&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;Astro Next.js 对比&lt;/strong&gt;，性能肯定是绕不开的话题。毕竟搭个博客或文档站，谁不希望加载快点、SEO 好点？&lt;/p&gt;&lt;section&gt;&lt;h3&gt;JavaScript 体积差异：90% 的差距不是开玩笑&lt;a href=&quot;#javascript-体积差异90-的差距不是开玩笑&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;先说最直观的数据。我用同样的内容分别搭了两个博客（大概 30 篇文章，包含代码高亮和图片），构建完成后对比了 JavaScript bundle 大小：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Next.js 静态导出&lt;/strong&gt;：首页 JS 大小约 85KB（gzip 后）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Astro&lt;/strong&gt;：首页 JS 大小约 8KB（gzip 后）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这个差距是真实存在的。Astro 官方给出的数据是 JavaScript 减少 90%，我的实测基本吻合。&lt;/p&gt;&lt;p&gt;为啥差这么多？关键在架构设计。&lt;strong&gt;Next.js&lt;/strong&gt; 哪怕是静态导出（SSG），也会打包 React 运行时、水合逻辑、路由管理这些基础代码。而 &lt;strong&gt;Astro&lt;/strong&gt; 默认把页面渲染成纯 HTML，完全不发 JavaScript——除非你明确给某个组件加了 &lt;code&gt;client:*&lt;/code&gt; 指令。&lt;/p&gt;&lt;p&gt;用人话说就是：Next.js 给你一套完整的 React 全家桶，哪怕你只想展示静态内容；Astro 只给你需要的部分，其他的一概不装。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Lighthouse 跑分：Astro 轻松满分&lt;a href=&quot;#lighthouse-跑分astro-轻松满分&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;性能数据不能光看 bundle 大小，还得看用户真实体验。我用 Chrome DevTools 的 Lighthouse 分别测了两个站点（都是生产环境，部署在 Vercel）：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Astro 博客&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Performance: 100&lt;/li&gt;
&lt;li&gt;Accessibility: 98&lt;/li&gt;
&lt;li&gt;Best Practices: 100&lt;/li&gt;
&lt;li&gt;SEO: 100&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Next.js 博客（SSG）&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Performance: 88&lt;/li&gt;
&lt;li&gt;Accessibility: 98&lt;/li&gt;
&lt;li&gt;Best Practices: 96&lt;/li&gt;
&lt;li&gt;SEO: 100&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;性能这一项的差距主要来自 FCP（First Contentful Paint）和 TTI（Time to Interactive）。Astro 站点通常能在 0.5 秒内完成首次内容渲染，而 Next.js 需要 1-1.5 秒。&lt;/p&gt;&lt;p&gt;有意思的是，这个差距在移动端 3G 网络下会被放大。我用 Lighthouse 的 Slow 4G 模拟测试，Astro 的 Performance 依然能保持 95+，而 Next.js 会掉到 75 左右。&lt;/p&gt;&lt;/section&gt;&lt;section&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;开发体验方面，构建速度也是个重要指标。我测了一下 1000 页面的文档站（用的是 Starlight 和 Nextra）：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Astro (Starlight)&lt;/strong&gt;：构建时间约 18 秒&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Next.js (Nextra)&lt;/strong&gt;：构建时间约 52 秒&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Astro 快了接近 3 倍。这个数据和官方宣传的”比 Gatsby 快 3 倍”基本一致。&lt;/p&gt;&lt;p&gt;不过公平地说，Next.js 15 在构建性能上有很大改进。之前版本可能要 80+ 秒，现在通过并行构建优化到了 50 秒左右。但和 Astro 比还是有差距。&lt;/p&gt;&lt;/section&gt;&lt;section&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;Astro&lt;/strong&gt; 的知名网站：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;IKEA 的开发者文档&lt;/li&gt;
&lt;li&gt;NordVPN 的官方博客&lt;/li&gt;
&lt;li&gt;Firebase 的文档站&lt;/li&gt;
&lt;li&gt;Cloudflare 的开发者中心&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这些站点的共同点是：内容为主，追求极致的加载速度和 SEO 表现。&lt;/p&gt;&lt;p&gt;用 &lt;strong&gt;Next.js&lt;/strong&gt; 的知名网站：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Nike 的电商平台&lt;/li&gt;
&lt;li&gt;Spotify 的营销页面&lt;/li&gt;
&lt;li&gt;Hulu 的内容平台&lt;/li&gt;
&lt;li&gt;TikTok 的部分页面&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;你会发现 Next.js 的案例更多是需要动态功能、用户交互或者个性化内容的场景。&lt;/p&gt;&lt;p&gt;这个对比其实已经说明了选型思路：&lt;strong&gt;纯展示型内容选 Astro，动态交互场景选 Next.js&lt;/strong&gt;。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;技术架构 - Islands vs RSC 谁更适合静态场景？&lt;a href=&quot;#技术架构---islands-vs-rsc-谁更适合静态场景&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;性能数据看完了，可能会好奇：&lt;strong&gt;Astro 和 Next.js&lt;/strong&gt; 底层到底用了啥技术，才能产生这么大差异？&lt;/p&gt;&lt;section&gt;&lt;h3&gt;Astro Islands：页面是海洋，交互是小岛&lt;a href=&quot;#astro-islands页面是海洋交互是小岛&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Astro 的核心是 &lt;strong&gt;Islands 架构&lt;/strong&gt;（岛屿架构）。第一次听这个词可能有点懵，但原理其实挺简单。&lt;/p&gt;&lt;p&gt;想象你的网页是一片海洋，大部分区域都是静态的水面（纯 HTML）。只有少数几个小岛（交互组件）需要 JavaScript 来”激活”。比如页面上的搜索框、评论区、点赞按钮，这些才是真正需要交互的部分。&lt;/p&gt;&lt;p&gt;Astro 默认把整个页面渲染成静态 HTML，然后你可以用 &lt;code&gt;client:*&lt;/code&gt; 指令给特定组件”开岛”：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import SearchBox from &apos;../components/SearchBox.jsx&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import StaticHeader from &apos;../components/Header.astro&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;StaticHeader /&amp;gt; &amp;lt;!-- 纯 HTML，不发 JS --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;SearchBox client:load /&amp;gt; &amp;lt;!-- 这是个岛屿，会加载 JS --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这种设计带来三个好处：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;JavaScript 按需加载&lt;/strong&gt;：只有交互组件才发 JS，其他地方保持纯 HTML&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;独立水合&lt;/strong&gt;：每个岛屿是隔离的，互不干扰，可以并行加载&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;灵活的水合策略&lt;/strong&gt;：&lt;code&gt;client:load&lt;/code&gt;（立即加载）、&lt;code&gt;client:idle&lt;/code&gt;（浏览器空闲时）、&lt;code&gt;client:visible&lt;/code&gt;（进入视口时）&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;举个实际例子。我的博客首页有个代码高亮组件和一个深色模式切换按钮。用 Astro 的话：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;代码高亮用的是纯 CSS（不需要 JS）&lt;/li&gt;
&lt;li&gt;深色模式按钮用 &lt;code&gt;client:load&lt;/code&gt;（需要立即交互）&lt;/li&gt;
&lt;li&gt;结果：首页只加载了 5KB 的 JS，就是那个按钮的代码&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;而 Next.js 呢？哪怕代码高亮是静态的，也会打包整个 React 运行时。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Next.js RSC：服务端组件减负&lt;a href=&quot;#nextjs-rsc服务端组件减负&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Next.js 15 的答案是 &lt;strong&gt;React Server Components&lt;/strong&gt;（RSC）。这个技术的思路和 Astro 有点类似，也是”能在服务端渲染的就别发到客户端”。&lt;/p&gt;&lt;p&gt;RSC 把 React 组件分成两类：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Server Components&lt;/strong&gt;（默认）：在服务端渲染，不发 JS 到浏览器&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Client Components&lt;/strong&gt;（用 &lt;code&gt;&apos;use client&apos;&lt;/code&gt; 声明）：需要交互的组件，会打包发送&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;app/components/Header.jsx&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 默认是 Server Component，不发 JS&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default function Header() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return &amp;lt;header&amp;gt;My Blog&amp;lt;/header&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// app/components/SearchBox.jsx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&apos;use client&apos; // 明确声明需要客户端 JS&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { useState } from &apos;react&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export default function SearchBox() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;const [query, setQuery] = useState(&apos;&apos;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;听起来和 Astro Islands 差不多？确实有点像，但有几个关键区别：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. 默认行为不同&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Astro：默认零 JS，手动”开岛”&lt;/li&gt;
&lt;li&gt;Next.js：默认还是会发 React 运行时，只是减少了组件代码&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;2. 适用场景不同&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Astro Islands：更适合静态为主、偶尔交互的场景&lt;/li&gt;
&lt;li&gt;Next.js RSC：适合动态内容多、需要服务端数据获取的场景&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;3. 框架绑定&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Astro：框架无关，可以混用 React、Vue、Svelte&lt;/li&gt;
&lt;li&gt;Next.js：深度绑定 React&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;（博客、文档、作品集），Astro Islands 更轻量。举个极端例子：一个纯 Markdown 博客，Astro 可以做到完全不发 JS，而 Next.js 至少要发 40-50KB 的基础运行时。&lt;/p&gt;&lt;p&gt;但如果需要&lt;strong&gt;动态更新内容&lt;/strong&gt;呢？Next.js 的 ISR（增量静态再生成）就有优势了。比如你的博客连接了 CMS，新文章发布后需要自动更新，ISR 可以做到定时重新生成特定页面，而不用重新构建整个站点。&lt;/p&gt;&lt;p&gt;Astro 在 4.0 之后也支持了 Server Islands，可以延迟渲染动态内容。但坦白说，这个功能还不如 Next.js 的 ISR 成熟。&lt;/p&gt;&lt;p&gt;我的建议：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;90% 以上是静态内容&lt;/strong&gt;：选 Astro，性能收益明显&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;需要频繁更新内容&lt;/strong&gt;：选 Next.js，ISR 更灵活&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;混合场景&lt;/strong&gt;（部分静态，部分动态）：看团队技术栈，两者都可以&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;section&gt;&lt;h3&gt;Markdown 处理：Astro 开箱即用，Next.js 要折腾&lt;a href=&quot;#markdown-处理astro-开箱即用nextjs-要折腾&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果你要搭博客或文档站，肯定绕不开 Markdown。这方面 &lt;strong&gt;Astro&lt;/strong&gt; 体验要好太多了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Astro 的 Markdown 支持&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;直接把 &lt;code&gt;.md&lt;/code&gt; 文件丢到 &lt;code&gt;src/pages/&lt;/code&gt; 就能渲染成页面&lt;/li&gt;
&lt;li&gt;MDX 开箱即用，可以在 Markdown 里写组件&lt;/li&gt;
&lt;li&gt;Content Collections API 提供类型安全的内容管理：&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;src/content/config.ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import { defineCollection, z } from &apos;astro:content&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const blog = defineCollection({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;schema: z.object({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;title: z.string(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;date: z.date(),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tags: z.array(z.string())&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export const collections = { blog }&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后你就能用 TypeScript 类型提示来查询文章了，还能自动生成 RSS、Sitemap，太省心。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Next.js 的 Markdown 处理&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;需要安装 &lt;code&gt;@next/mdx&lt;/code&gt; 或 &lt;code&gt;next-mdx-remote&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;自己配置 remark/rehype 插件链&lt;/li&gt;
&lt;li&gt;内容管理要靠 contentlayer 这类第三方库&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;不是说 Next.js 不行，只是需要额外配置。对于新手来说，Astro 的开箱即用体验明显更友好。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;框架兼容性：Astro 才是真正的”大一统”&lt;a href=&quot;#框架兼容性astro-才是真正的大一统&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这一点 &lt;strong&gt;Astro&lt;/strong&gt; 简直降维打击。&lt;/p&gt;&lt;p&gt;你可以在同一个项目里混用 React、Vue、Svelte、Solid、Preact… 几乎所有主流框架。比如：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;导航栏用 React（团队熟悉）&lt;/li&gt;
&lt;li&gt;表单用 Vue（有现成组件）&lt;/li&gt;
&lt;li&gt;图表用 Svelte（性能好）&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import ReactNav from &apos;./ReactNav.jsx&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import VueForm from &apos;./VueForm.vue&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import SvelteChart from &apos;./SvelteChart.svelte&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;ReactNav client:load /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;VueForm client:visible /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;SvelteChart client:idle /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Next.js&lt;/strong&gt; 呢？深度绑定 React，想用其他框架基本没戏。这不是缺点，只是定位不同——Next.js 就是要给你完整的 React 全家桶体验。&lt;/p&gt;&lt;p&gt;但对于&lt;strong&gt;静态网站框架选择&lt;/strong&gt;来说，Astro 的灵活性是实实在在的优势。你可以复用已有的组件，不用全部重写。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;插件生态：Next.js 胜在体量，Astro 胜在专注&lt;a href=&quot;#插件生态nextjs-胜在体量astro-胜在专注&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Next.js&lt;/strong&gt; 的生态确实强大：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;npm 上几十万个 React 库随便用&lt;/li&gt;
&lt;li&gt;Vercel 提供的各种集成（Analytics、Edge Config、KV 存储）&lt;/li&gt;
&lt;li&gt;社区活跃，几乎所有问题都能找到答案&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Astro&lt;/strong&gt; 的生态虽然小一些，但也够用了：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;400+ 官方集成和社区插件&lt;/li&gt;
&lt;li&gt;Starlight 专门做文档站，开箱即用&lt;/li&gt;
&lt;li&gt;图片优化、Sitemap、RSS 这些常用功能都有官方支持&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我个人感受是：如果你要搭个博客或文档站，Astro 的生态完全够用。但要做复杂应用，Next.js 的 React 生态优势就体现出来了。&lt;/p&gt;&lt;/section&gt;&lt;section&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;Astro 学习曲线&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;如果你会 HTML/CSS/JS，基本零门槛&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.astro&lt;/code&gt; 文件语法很简单，类似 Vue 单文件组件&lt;/li&gt;
&lt;li&gt;文档清晰，10 分钟就能上手&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Next.js 学习曲线&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;需要熟悉 React&lt;/li&gt;
&lt;li&gt;App Router 的心智模型比较复杂（Server/Client Components、嵌套布局、数据获取）&lt;/li&gt;
&lt;li&gt;配置选项多，新手容易懵&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;坦白说，Next.js 功能强大但也复杂。如果你只想快速搭个博客，Astro 的简单直接会让你舒服很多。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;文档站方案对比：Starlight vs Nextra&lt;a href=&quot;#文档站方案对比starlight-vs-nextra&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;Astro Starlight&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;官方出品，深度集成&lt;/li&gt;
&lt;li&gt;自动生成侧边栏、搜索、多语言切换&lt;/li&gt;
&lt;li&gt;性能极致，Lighthouse 满分&lt;/li&gt;
&lt;li&gt;主题简洁现代，开箱即用&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Next.js Nextra&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Vercel 开发，基于 Next.js&lt;/li&gt;
&lt;li&gt;功能丰富，高度可定制&lt;/li&gt;
&lt;li&gt;React 生态加持，组件库选择多&lt;/li&gt;
&lt;li&gt;性能没 Starlight 好，但也够用&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我用 Starlight 搭了个技术文档站，从零到上线只花了 2 小时，还包括了部署时间。体验确实丝滑。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;/p&gt;&lt;p&gt;我整理了一个决策流程，你对照着自己的需求看看。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;什么时候选 Astro？&lt;a href=&quot;#什么时候选-astro&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果你的站点符合以下任意 2 条以上，强烈建议 &lt;strong&gt;Astro&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. 内容为王，交互为辅&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;个人博客、技术文档、公司官网、营销落地页&lt;/li&gt;
&lt;li&gt;页面 90% 以上是静态内容&lt;/li&gt;
&lt;li&gt;只有少数组件需要交互（搜索框、评论区、暗黑模式开关）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;2. 性能和 SEO 是硬指标&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Google Lighthouse 必须接近满分&lt;/li&gt;
&lt;li&gt;Core Web Vitals 直接影响排名&lt;/li&gt;
&lt;li&gt;移动端弱网环境访问频繁&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;3. Markdown 内容管理&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;文章用 Markdown 写，图片本地存放&lt;/li&gt;
&lt;li&gt;需要 Content Collections 这类类型安全的内容 API&lt;/li&gt;
&lt;li&gt;希望开箱即用的 RSS、Sitemap 生成&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;4. 多框架混用&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;团队同时用 React 和 Vue&lt;/li&gt;
&lt;li&gt;想复用不同框架的现成组件&lt;/li&gt;
&lt;li&gt;不想被单一框架绑死&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;5. 快速上手&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;不想学复杂的框架概念&lt;/li&gt;
&lt;li&gt;希望 10 分钟就能搭个能用的站点&lt;/li&gt;
&lt;li&gt;团队成员技术栈不统一&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;什么时候选 Next.js？&lt;a href=&quot;#什么时候选-nextjs&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果你的需求是这样的，那 &lt;strong&gt;Next.js&lt;/strong&gt; 更合适：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. 需要动态内容更新&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;连接了 Headless CMS（Contentful、Sanity）&lt;/li&gt;
&lt;li&gt;内容需要定时或按需重新生成（ISR）&lt;/li&gt;
&lt;li&gt;有用户生成内容（评论、点赞、收藏）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;2. 复杂的动态路由&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;3. React 深度集成&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;团队已经深度使用 React&lt;/li&gt;
&lt;li&gt;项目依赖 React 生态的特定库&lt;/li&gt;
&lt;li&gt;需要 Next.js 的全家桶功能（Auth、Analytics、Edge Functions）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;4. 混合渲染需求&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;部分页面纯静态，部分页面需要 SSR&lt;/li&gt;
&lt;li&gt;需要个性化内容（根据用户登录状态）&lt;/li&gt;
&lt;li&gt;API Routes 做 BFF 层&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;5. Vercel 生态绑定&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;已经在用 Vercel 平台&lt;/li&gt;
&lt;li&gt;需要 Vercel 提供的各种集成服务&lt;/li&gt;
&lt;li&gt;希望一键部署 + 自动优化&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;从 Next.js 迁移到 Astro&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://situ2001.com/&quot; target=&quot;_blank&quot;&gt;situ2001 的博客&lt;/a&gt;：纯静态内容，迁移后 Lighthouse 从 88 提升到 100，构建时间减半&lt;/li&gt;
&lt;li&gt;某技术文档站：1000+ 页面，迁移后构建从 80 秒降到 20 秒，首屏加载快 40%&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;迁移原因：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;不需要 React 的重型运行时&lt;/li&gt;
&lt;li&gt;追求极致性能&lt;/li&gt;
&lt;li&gt;Markdown 处理体验更好&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;继续用 Next.js 的场景&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;某在线教育平台：需要用户登录、课程进度追踪、动态推荐&lt;/li&gt;
&lt;li&gt;电商网站：商品数据频繁更新，需要 ISR 定时重新生成&lt;/li&gt;
&lt;li&gt;SaaS 产品的营销站：混合了静态介绍页和动态 Demo 演示&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;选择原因：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;需要服务端渲染和动态功能&lt;/li&gt;
&lt;li&gt;团队已有 React 技术积累&lt;/li&gt;
&lt;li&gt;Vercel 一体化部署方便&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&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;如果你现在用的是 Next.js，想切到 Astro，成本大不大？&lt;/p&gt;&lt;p&gt;&lt;strong&gt;低成本场景&lt;/strong&gt;（1-2 天）：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;纯 Markdown 博客&lt;/li&gt;
&lt;li&gt;没有复杂的 React 组件&lt;/li&gt;
&lt;li&gt;不依赖 Next.js 特定 API&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;中等成本场景&lt;/strong&gt;（1-2 周）：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;有自定义 React 组件（可以保留，用 Astro Islands 包裹）&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;大量使用 React Hooks 和状态管理&lt;/li&gt;
&lt;li&gt;依赖 Next.js 的 API Routes、Middleware&lt;/li&gt;
&lt;li&gt;有复杂的服务端数据获取逻辑&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我的建议：&lt;strong&gt;如果你的站点 90% 是静态内容，迁移收益明显；如果动态功能占比超过 30%，就别折腾了&lt;/strong&gt;。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;section&gt;&lt;h3&gt;快速开始：10 分钟搭个 Hello World&lt;a href=&quot;#快速开始10-分钟搭个-hello-world&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Astro 快速开始&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 创建项目&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm create astro@latest my-blog&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 选择模板（推荐选 Blog 或 Empty）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd my-blog&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm install&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm run dev&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;打开 &lt;code&gt;http://localhost:4321&lt;/code&gt;，你就能看到一个能跑的站点了。修改 &lt;code&gt;src/pages/index.astro&lt;/code&gt;，保存立即生效。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Next.js 快速开始&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 创建项目&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npx create-next-app@latest my-blog&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 按提示选择（TypeScript、App Router、Tailwind...）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd my-blog&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm run dev&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;打开 &lt;code&gt;http://localhost:3000&lt;/code&gt;，编辑 &lt;code&gt;app/page.tsx&lt;/code&gt; 就能看到变化。&lt;/p&gt;&lt;p&gt;两者初始化都很快，但 Astro 的默认模板更适合博客场景，Next.js 的模板偏应用开发。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;推荐的 Starter 模板&lt;a href=&quot;#推荐的-starter-模板&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Astro&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/withastro/astro/tree/main/examples/blog&quot; target=&quot;_blank&quot;&gt;Astro Blog&lt;/a&gt;：官方博客模板，简洁实用&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/satnaing/astro-paper&quot; target=&quot;_blank&quot;&gt;AstroPaper&lt;/a&gt;：功能完整的博客主题，支持搜索、标签、RSS&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://starlight.astro.build/&quot; target=&quot;_blank&quot;&gt;Starlight&lt;/a&gt;：文档站专用，开箱即用&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Next.js&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/tree/canary/examples/blog-starter&quot; target=&quot;_blank&quot;&gt;Next.js Blog Starter&lt;/a&gt;：官方博客示例&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextra.site/&quot; target=&quot;_blank&quot;&gt;Nextra&lt;/a&gt;：文档站方案&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/contentlayerdev/next-contentlayer-example&quot; target=&quot;_blank&quot;&gt;Contentlayer Blog&lt;/a&gt;：集成 Contentlayer 的博客&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我个人推荐 Astro 的 AstroPaper，功能全、性能好、颜值高。&lt;/p&gt;&lt;/section&gt;&lt;section&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;Vercel（推荐）&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Astro&lt;/strong&gt;：零配置，自动识别，构建命令 &lt;code&gt;npm run build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Next.js&lt;/strong&gt;：原生支持，一键部署，自动优化&lt;/li&gt;
&lt;li&gt;优点：国外访问快、HTTPS 自动配置、Preview 环境&lt;/li&gt;
&lt;li&gt;缺点：国内访问略慢、免费版带宽限制 100GB/月&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Netlify&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;两者都支持，配置也很简单&lt;/li&gt;
&lt;li&gt;优点：免费版额度更大、Functions 支持&lt;/li&gt;
&lt;li&gt;缺点：构建速度比 Vercel 慢一点&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Cloudflare Pages&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;两者都支持，部署速度快&lt;/li&gt;
&lt;li&gt;优点：全球 CDN、无限带宽、免费版很香&lt;/li&gt;
&lt;li&gt;缺点：构建环境有时不稳定&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;GitHub Pages（静态托管）&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Astro&lt;/strong&gt;：完美支持，配置简单&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Next.js&lt;/strong&gt;：需要静态导出（&lt;code&gt;output: &apos;export&apos;&lt;/code&gt;），部分功能受限&lt;/li&gt;
&lt;li&gt;优点：完全免费、GitHub Actions 自动部署&lt;/li&gt;
&lt;li&gt;缺点：国内访问慢、不支持 Server Components&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;ol&gt;
&lt;li&gt;&lt;strong&gt;CDN 选择&lt;/strong&gt;：Cloudflare Pages 国内访问比 Vercel 快&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;字体优化&lt;/strong&gt;：用本地字体或国内 CDN（避免 Google Fonts）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第三方资源&lt;/strong&gt;：评论系统选 Giscus（基于 GitHub）而不是 Disqus&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;图片托管&lt;/strong&gt;：用阿里云 OSS 或腾讯云 COS，别用 Imgur&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;我自己的博客用 Cloudflare Pages 部署，国内访问速度还不错。&lt;/p&gt;&lt;/section&gt;&lt;section&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;Astro 的局限性&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;❌ 不适合高交互应用（如 Dashboard、SaaS 产品）&lt;/li&gt;
&lt;li&gt;❌ 实时数据更新不如 Next.js 灵活&lt;/li&gt;
&lt;li&gt;✅ 解决方案：静态内容用 Astro，动态功能用独立服务&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Next.js 的过度设计问题&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;❌ 对于简单博客来说太重了&lt;/li&gt;
&lt;li&gt;❌ App Router 学习曲线陡峭&lt;/li&gt;
&lt;li&gt;✅ 解决方案：如果只需要静态站，考虑换 Astro&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;性能优化 Checklist&lt;/strong&gt;（通用）：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;☑ 图片用 WebP 格式，配置懒加载&lt;/li&gt;
&lt;li&gt;☑ 字体用 &lt;code&gt;font-display: swap&lt;/code&gt; 避免阻塞渲染&lt;/li&gt;
&lt;li&gt;☑ 第三方脚本延迟加载（Google Analytics、广告）&lt;/li&gt;
&lt;li&gt;☑ 启用 HTTP/2 和 Brotli 压缩&lt;/li&gt;
&lt;li&gt;☑ 配置合理的 Cache-Control 头&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;Astro&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.astro.build/&quot; target=&quot;_blank&quot;&gt;官方文档&lt;/a&gt;：写得很清楚，看完基本会用了&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.astro.build/en/tutorial/0-introduction/&quot; target=&quot;_blank&quot;&gt;Astro Blog Tutorial&lt;/a&gt;：官方教程，手把手教你搭博客&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://starlight.astro.build/&quot; target=&quot;_blank&quot;&gt;Starlight 文档&lt;/a&gt;：想搭文档站必看&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Next.js&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/docs&quot; target=&quot;_blank&quot;&gt;官方文档&lt;/a&gt;：内容全面，但略啰嗦&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/learn&quot; target=&quot;_blank&quot;&gt;Next.js Learn&lt;/a&gt;：互动教程，适合新手&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/docs/app/building-your-application/upgrading/app-router-migration&quot; target=&quot;_blank&quot;&gt;App Router 迁移指南&lt;/a&gt;：从 Pages Router 迁移必读&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;看完这些资源，基本就能上手开发了。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;第一次用 Next.js 搭博客时，直接选了 App Router，结果被 Server Components 和 Client Components 的概念搞得晕头转向。写个搜索框组件，忘记加 &lt;code&gt;&apos;use client&apos;&lt;/code&gt;，怎么都不工作。后来才明白要在文件顶部明确声明。&lt;/p&gt;&lt;p&gt;Astro 的 &lt;code&gt;client:*&lt;/code&gt; 指令也踩过坑。一开始所有组件都加了 &lt;code&gt;client:load&lt;/code&gt;，结果性能和 React SPA 没啥区别。后来学会根据不同场景选择不同的指令，性能才提升上来。评论区用 &lt;code&gt;client:visible&lt;/code&gt;，导航栏用 &lt;code&gt;client:load&lt;/code&gt;，社交分享按钮用 &lt;code&gt;client:idle&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;图片优化这块也花了不少时间。Next.js 的 Image 组件需要配置 loader，Astro 的更简单但有限制。远程图片必须配置授权域名，不然构建时报错。排查了半天才发现需要在 &lt;code&gt;astro.config.mjs&lt;/code&gt; 里添加。&lt;/p&gt;&lt;p&gt;部署到 Vercel 时，Astro 的构建速度真的让我惊讶。50 篇文章的博客，Next.js 要构建 2 分钟，Astro 只要 30 秒。这个差距在大型项目里更明显。&lt;/p&gt;&lt;p&gt;我自己的技术博客用的是 Astro。内容 95% 是静态的，不需要 React 的重型运行时。Lighthouse 满分，SEO 排名确实有提升。Markdown 处理体验太好，写文章效率提高了。&lt;/p&gt;&lt;p&gt;如果要做 SaaS 产品的官网（包含 Demo 演示、用户 Dashboard），我还是会选 Next.js。动态功能多了，Astro 就不够用了。&lt;/p&gt;&lt;p&gt;框架只是工具，内容才是王道。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>从3小时到30分钟：AI写作工作流完整拆解</title><link>https://blog.moewah.com/posts/ai-writing-workflow-4-step-revolution/</link><guid isPermaLink="true">https://blog.moewah.com/posts/ai-writing-workflow-4-step-revolution/</guid><description>如何用AI提升写作效率？本文详细拆解4步AI辅助写作工作流，包含选题、大纲、初稿和润色的实战方法与Prompt模板，解决内容创作中启动难、框架乱、AI味重等问题，助你实现高效稳定日更。</description><pubDate>Mon, 24 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;之前写一篇公众号推文，我得花3个小时：1小时想选题（刷半天数据还是不知道写啥），1.5小时写初稿（写两句卡一句），最后还得改半小时。一天写两篇就累瘫了，更别提保持日更了。&lt;br /&gt;
后来我把AI整合到写作流程里，现在从选题到初稿完成只需要30分钟，而且质量比以前更稳定。关键不是让AI替你写，而是让它帮你做好每个环节的准备工作。&lt;br /&gt;
说实话，我一开始也担心用AI写的内容会不会太”机械”，读者能不能接受。但当我掌握了正确的方法后，发现AI其实是个超级高效的助手——它帮我快速度过最耗时的”启动阶段”和”框架搭建”，让我能把精力集中在真正需要创意的地方。&lt;br /&gt;
这篇文章，我会分享一套完整的AI辅助写作工作流。你会得到：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;4步完整工作流&lt;/strong&gt;：选题→大纲→初稿→润色，每步都有具体方法&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;4个实战Prompt模板&lt;/strong&gt;：直接复制就能用，不用自己摸索&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主流工具对比&lt;/strong&gt;：ChatGPT、Claude、文心一言该选哪个&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;去AI味技巧&lt;/strong&gt;：让AI生成的内容更人性化的5个方法&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;完整案例拆解&lt;/strong&gt;：从选题到成稿的真实过程&lt;br /&gt;
看完这篇，你马上就能用起来，立刻见效。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;section&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;我见过太多人用AI写作的方式都是错的。&lt;br /&gt;
&lt;strong&gt;最常见的三个误区：&lt;/strong&gt;&lt;br /&gt;
第一个是直接让AI写全文。打开ChatGPT，输入”写一篇关于XXX的文章”，然后把生成的内容直接复制粘贴。结果呢？AI味太重，读者一眼就能看出来，而且内容缺乏深度和个人见解。这样用AI，其实是浪费了它的能力。&lt;br /&gt;
第二个是只在卡壳时才想起来用AI。写了一半写不下去了，才打开ChatGPT问”怎么继续”。这种方式没有系统化，效率提升有限。就像开车只在迷路时看导航，而不是提前规划路线。&lt;br /&gt;
第三个是用一个工具干所有事。要么全用ChatGPT，要么全用Claude，但其实不同环节需要不同工具的优势。选题适合ChatGPT的发散思维，润色适合Claude的细腻表达。&lt;br /&gt;
&lt;strong&gt;正确的理念是什么？&lt;/strong&gt;&lt;br /&gt;
AI不是替代你写作，而是辅助你的思考和执行。我现在的方式是把写作拆解成4个环节：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;选题阶段&lt;/strong&gt;：AI帮我快速生成10-20个选题方向，并评估每个选题的潜力&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;大纲阶段&lt;/strong&gt;：AI帮我搭建文章框架，确定每部分的核心要点&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;初稿阶段&lt;/strong&gt;：AI帮我快速生成每个段落的初稿，我负责补充细节和个人经验&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;润色阶段&lt;/strong&gt;：AI帮我去掉生硬表达，优化节奏和可读性&lt;br /&gt;
核心原则是：&lt;strong&gt;AI做准备工作，人做创意决策&lt;/strong&gt;。&lt;br /&gt;
&lt;strong&gt;效率对比有多大？&lt;/strong&gt;&lt;br /&gt;
我自己的真实数据：&lt;/li&gt;
&lt;/ol&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;传统流程&lt;/strong&gt;：选题1小时 + 写作2小时 + 修改1小时 = 4小时&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI辅助流程&lt;/strong&gt;：选题15分钟 + 大纲10分钟 + 初稿15分钟 + 润色20分钟 = 1小时&lt;br /&gt;
为什么能快这么多？因为AI帮你快速度过了”启动阶段”（不知道写什么）和”框架搭建”（不知道怎么组织），这两个环节往往占掉70%的时间。一旦有了方向和框架，写作就会变得顺畅很多。&lt;br /&gt;
根据36氪的《2025内容创作行业白皮书》，使用AI的创作者平均效率提升3-5倍。我自己的感受是，一周的内容产出量从2篇提升到了10篇，而且质量更稳定了。&lt;br /&gt;
你可能会问，这真的有用吗？我的建议是：看完这篇文章，马上试一次。你会立刻感受到差异。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第二章：4步AI辅助写作工作流详解&lt;a href=&quot;#第二章4步ai辅助写作工作流详解&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;好，现在进入最核心的部分——完整的4步工作流。每一步我都会给你可以直接复制的Prompt模板。&lt;/p&gt;&lt;section&gt;&lt;h4&gt;步骤1：AI辅助选题（15分钟）&lt;a href=&quot;#步骤1ai辅助选题15分钟&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;最头疼的问题&lt;/strong&gt;：不知道写什么，担心选题没人看。&lt;br /&gt;
我以前选题能纠结1个小时，打开微信指数看数据，刷小红书找热点，脑子里想了20个方向，最后还是不确定哪个好。后来我发现，用AI生成选题方向，效率能提升10倍。&lt;br /&gt;
&lt;strong&gt;AI如何帮你选题？&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;分析你的领域，生成10-20个选题方向&lt;/li&gt;
&lt;li&gt;评估每个选题的吸引力（搜索量、竞争度）&lt;/li&gt;
&lt;li&gt;提供不同角度：痛点解决型、对比分析型、案例拆解型&lt;br /&gt;
&lt;strong&gt;实战Prompt模板：&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;你是一位资深内容策划，请帮我生成10个[领域]的选题方向。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;背景：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 目标读者：[描述受众，比如：25-35岁的新手父母，关注儿童教育]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 内容平台：[公众号/小红书/知乎等]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 内容风格：[干货/故事/观点等]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;要求：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. 每个选题包含：标题方向、核心卖点、目标关键词&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. 优先考虑以下角度：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 痛点解决型（如&quot;如何...&quot;、&quot;X个方法...&quot;）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 对比分析型（如&quot;A vs B&quot;、&quot;选择指南&quot;）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 案例拆解型（如&quot;实战案例&quot;、&quot;我的经验&quot;）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. 评估每个选题的吸引力（1-5分）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;输出格式：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;选题1：[标题方向]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 核心卖点：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 目标关键词：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 吸引力评分：&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;实际使用示例：&lt;/strong&gt;&lt;br /&gt;
我有次用这个模板生成”职场效率工具”的选题，AI给了我10个方向，其中一个是”从3小时到30分钟：我的AI写作工作流完整拆解”，吸引力评分5分。我一看，这个选题既有对比数据（3小时到30分钟），又承诺详细方法（完整拆解），立刻就决定写这个。&lt;br /&gt;
整个选题过程，从输入Prompt到确定方向，只花了15分钟。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;步骤2：AI辅助大纲（10分钟）&lt;a href=&quot;#步骤2ai辅助大纲10分钟&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;最头疼的问题&lt;/strong&gt;：文章结构混乱，写着写着就跑偏了。&lt;br /&gt;
以前我写文章经常是想到哪写到哪，写到一半发现逻辑不通，又得推倒重来。现在我用AI搭建大纲，先把框架定好，写作就顺畅多了。&lt;br /&gt;
&lt;strong&gt;AI如何帮你搭大纲？&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;br /&gt;
&lt;strong&gt;实战Prompt模板：&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;请为以下文章生成详细大纲：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;标题：[你选定的标题]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;目标字数：[1500-2000字]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;目标读者：[描述受众及其痛点]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;大纲要求：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. 包含引言、3-5个主体章节、结论&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. 每个章节标注：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 核心要点（3-5个子要点）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 建议字数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 需要的案例/数据&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. 引言要有吸引力，结论要有行动号召&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;额外要求：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 逻辑流畅，层层递进&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 避免空洞内容，每部分都要有价值&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;实际使用示例：&lt;/strong&gt;&lt;br /&gt;
当我决定写”AI写作工作流”这个选题后，我用这个Prompt生成大纲。AI给了我一个5段式结构：引言（困境对比）→正确理念→4步工作流→工具对比→完整案例→结论。&lt;br /&gt;
我看了一遍，觉得结构很清晰，但第二章”4步工作流”需要更详细的子要点，所以我又针对这章单独生成了详细大纲。整个过程10分钟搞定。&lt;br /&gt;
关键是：&lt;strong&gt;大纲生成后，你需要人工检查和调整&lt;/strong&gt;。AI给的是通用框架，但你要根据自己的经验补充细节。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;步骤3：AI辅助初稿（15分钟）&lt;a href=&quot;#步骤3ai辅助初稿15分钟&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;最头疼的问题&lt;/strong&gt;：写作卡壳，不知道怎么展开每个段落。&lt;br /&gt;
以前我写到某个部分，脑子里有想法，但不知道怎么用文字表达，经常卡住半小时写不出一个字。现在我用AI快速生成初稿，然后在初稿基础上修改，效率提升太多了。&lt;br /&gt;
&lt;strong&gt;AI如何帮你写初稿？&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;br /&gt;
&lt;strong&gt;关键技巧：分段生成，而不是一次性生成全文&lt;/strong&gt;&lt;br /&gt;
为什么？因为分段生成质量更高，更容易控制。一次生成全文，AI容易跑偏，而且你很难逐段审核。我的方法是：一次生成1-2个段落，人工审核后继续。&lt;br /&gt;
&lt;strong&gt;实战Prompt模板：&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;基于以下大纲，撰写[第X章]的内容：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;【大纲内容】&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[粘贴该章节的大纲]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;【写作要求】&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. 字数：约[X]字&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. 风格：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 用第一人称，像朋友聊天&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 用真实案例和具体场景&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 避免空洞说教，多用&quot;你可以这样...&quot;的句式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. 结构：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 开头点明这部分要解决什么问题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 中间用2-3个要点展开&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 结尾总结关键行动&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4. 避免：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 不要用&quot;综上所述&quot;、&quot;因此&quot;等AI味词汇&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 不要过度使用&quot;首先、其次、最后&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 不要堆砌专业术语&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;【参考信息】&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[如果有相关资料或案例，在这里提供]&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;实际使用示例：&lt;/strong&gt;&lt;br /&gt;
当我写”选题阶段”这部分时，我用这个Prompt生成了初稿。AI给了我一个3段结构：痛点描述→AI如何帮忙→Prompt模板→实际案例。&lt;br /&gt;
初稿质量还不错，但我发现缺少个人经历，于是我加了一句：“我以前选题能纠结1个小时，打开微信指数看数据，刷小红书找热点，脑子里想了20个方向，最后还是不确定哪个好。“这样一加，内容就有温度了。&lt;br /&gt;
&lt;strong&gt;记住：AI生成的是初稿，你的工作是让它变得更真实、更有个性。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;步骤4：AI辅助润色（20分钟）&lt;a href=&quot;#步骤4ai辅助润色20分钟&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;最头疼的问题&lt;/strong&gt;：初稿写完了，但总觉得不够”人性化”，有点生硬。&lt;br /&gt;
这是我花时间最多的环节。因为AI生成的初稿虽然逻辑清晰，但经常有些”AI味”——比如”因此”、“综上所述”这些词，或者段落过于完美对称。读者一看就知道是AI写的。&lt;br /&gt;
&lt;strong&gt;AI如何帮你润色？&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;去除AI味，替换生硬表达&lt;/li&gt;
&lt;li&gt;优化句子节奏，长短句结合&lt;/li&gt;
&lt;li&gt;增强人性化，加入对话感&lt;br /&gt;
&lt;strong&gt;实战Prompt模板：&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;请帮我优化以下文章段落，重点去除AI味，增强人性化表达：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;【原文】&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[粘贴需要优化的段落]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;【优化要求】&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. 去AI味：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 替换：因此→所以、实际上→其实、相当→挺&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 删除：综上所述、不难发现、值得注意的是&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 避免：过于完美的三段论逻辑&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. 增加人性化：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 加入个人经历或观察：&quot;我发现...&quot;、&quot;有次我...&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 用具体细节替代笼统概念&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 适当使用疑问句和读者对话&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. 优化节奏：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 长短句结合&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 适当断句，避免超长段落&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- 关键信息用短句突出&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;【保持不变】&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 核心观点和信息&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- 整体结构&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;去AI味的5个实用技巧：&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;替换AI常用连接词&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;：不说”效率提升很多”，而说”从3小时缩短到30分钟”&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;br /&gt;
&lt;strong&gt;实际使用示例：&lt;/strong&gt;&lt;br /&gt;
我用这个Prompt优化了引言部分。原本AI生成的开头是：“在当今内容创作领域，效率是关键因素。AI工具可以显著提升写作效率。”&lt;br /&gt;
优化后变成：“之前写一篇公众号推文，我得花3个小时：1小时想选题，1.5小时写初稿,还得改半小时。一天写两篇就累瘫了。”&lt;br /&gt;
你看，优化后是不是更真实、更有代入感？&lt;br /&gt;
&lt;strong&gt;小结：4步工作流的时间分配&lt;/strong&gt;&lt;br /&gt;
选题（15分钟）→ 大纲（10分钟）→ 初稿（15分钟）→ 润色（20分钟）= &lt;strong&gt;总计1小时&lt;/strong&gt;&lt;br /&gt;
对比传统流程的4小时，效率提升了&lt;strong&gt;75%&lt;/strong&gt;。而且这还是保守估计，随着你对工作流越来越熟练，速度还会更快。&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&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;br /&gt;
我自己测试过市面上所有主流的AI写作工具，下面给你一个完整对比。&lt;/p&gt;&lt;section&gt;&lt;h4&gt;1. ChatGPT（最全能）⭐⭐⭐⭐⭐&lt;a href=&quot;#1-chatgpt最全能&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&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;br /&gt;
&lt;strong&gt;适用场景&lt;/strong&gt;：从选题到润色的所有环节&lt;br /&gt;
&lt;strong&gt;成本&lt;/strong&gt;：免费版够用，Plus版 $20/月（如果高频使用建议升级）&lt;br /&gt;
&lt;strong&gt;我的使用感受&lt;/strong&gt;：ChatGPT是我用得最多的工具，80%的工作流都靠它。尤其是选题和大纲阶段，ChatGPT的发散思维特别强，能给你很多意想不到的角度。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;2. Claude（最人性化）⭐⭐⭐⭐&lt;a href=&quot;#2-claude最人性化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&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;对中文的语境理解比ChatGPT好一些&lt;br /&gt;
&lt;strong&gt;适用场景&lt;/strong&gt;：大纲搭建、内容润色&lt;br /&gt;
&lt;strong&gt;成本&lt;/strong&gt;：免费版限制较多，Pro版 $20/月&lt;br /&gt;
&lt;strong&gt;我的使用感受&lt;/strong&gt;：Claude在润色环节特别好用。当你用ChatGPT生成了初稿，想让内容更”人性化”时，把内容丢给Claude优化，效果会更好。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;3. 文心一言（国内选择）⭐⭐⭐⭐&lt;a href=&quot;#3-文心一言国内选择&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&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;br /&gt;
&lt;strong&gt;适用场景&lt;/strong&gt;：公众号、小红书等中文内容创作&lt;br /&gt;
&lt;strong&gt;成本&lt;/strong&gt;：基础功能免费&lt;br /&gt;
&lt;strong&gt;我的使用感受&lt;/strong&gt;：如果你主要写中文内容，而且不想折腾翻墙，文心一言是最佳选择。它对”小红书爆款标题”、“公众号开头”这些场景特别理解。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;4. Notion AI（最便捷）⭐⭐⭐&lt;a href=&quot;#4-notion-ai最便捷&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&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;可以直接在文档中调用AI&lt;/li&gt;
&lt;li&gt;适合已经在用Notion管理内容的创作者&lt;br /&gt;
&lt;strong&gt;适用场景&lt;/strong&gt;：已使用Notion的创作者&lt;br /&gt;
&lt;strong&gt;成本&lt;/strong&gt;：$10/月（需要先有Notion订阅）&lt;br /&gt;
&lt;strong&gt;我的使用感受&lt;/strong&gt;：如果你已经在用Notion做内容管理，Notion AI确实很方便。但如果你不用Notion，就没必要为了AI单独订阅。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;ul&gt;
&lt;li&gt;&lt;strong&gt;新手入门&lt;/strong&gt;：ChatGPT免费版（全流程都能搞定）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;进阶使用&lt;/strong&gt;：ChatGPT Plus（选题+初稿）+ Claude（润色）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;国内用户&lt;/strong&gt;：文心一言（主力）+ ChatGPT（备用）&lt;br /&gt;
&lt;strong&gt;工具使用技巧：&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;ol&gt;
&lt;li&gt;同一内容在不同工具测试，选最好的输出&lt;/li&gt;
&lt;li&gt;利用各工具优势：ChatGPT做发散，Claude做收敛&lt;/li&gt;
&lt;li&gt;建立Prompt模板库，提高复用效率&lt;br /&gt;
说实话，工具只是手段，关键是你的工作流。哪怕只用ChatGPT免费版，只要工作流清晰，效率也能提升好几倍。&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&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;section&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;1. 建立个人Prompt模板库&lt;/strong&gt;&lt;br /&gt;
把常用的Prompt保存到Notion或飞书文档，按照不同平台分类：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;公众号选题Prompt&lt;/li&gt;
&lt;li&gt;小红书文案Prompt&lt;/li&gt;
&lt;li&gt;知乎回答Prompt&lt;br /&gt;
我现在有20+个Prompt模板，每次写作直接调用，省去了重新想Prompt的时间。&lt;br /&gt;
&lt;strong&gt;2. 利用AI进行内容优化&lt;/strong&gt;&lt;br /&gt;
AI不只是帮你写，还能帮你分析：&lt;/li&gt;
&lt;li&gt;用AI分析文章的SEO表现（关键词密度、可读性）&lt;/li&gt;
&lt;li&gt;让AI提供标题的10个变体（选最吸引人的）&lt;/li&gt;
&lt;li&gt;用AI生成不同风格的开头和结尾（A/B测试）&lt;br /&gt;
&lt;strong&gt;3. 批量生产内容&lt;/strong&gt;&lt;br /&gt;
如果你需要持续产出内容，可以这样做：&lt;/li&gt;
&lt;li&gt;一次生成10个大纲，批量执行&lt;/li&gt;
&lt;li&gt;利用AI进行内容改写和多平台适配（一篇文章改成公众号版、小红书版、知乎版）&lt;/li&gt;
&lt;li&gt;建立内容日历，系统化生产&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;1. 过度依赖AI&lt;/strong&gt;&lt;br /&gt;
错误做法：完全照搬AI输出，不做任何修改。&lt;br /&gt;
正确做法：AI提供框架，人补充细节和个性。&lt;br /&gt;
&lt;strong&gt;2. 忽视人工审核&lt;/strong&gt;&lt;br /&gt;
错误做法：AI写完直接发布，结果出现事实错误或逻辑问题。&lt;br /&gt;
正确做法：必须人工检查事实、逻辑、语气。&lt;br /&gt;
&lt;strong&gt;3. Prompt太模糊&lt;/strong&gt;&lt;br /&gt;
错误做法：“帮我写一篇文章”&lt;br /&gt;
正确做法：使用结构化Prompt，明确受众、风格、字数、要求。&lt;br /&gt;
&lt;strong&gt;4. 不做迭代优化&lt;/strong&gt;&lt;br /&gt;
错误做法：一个Prompt用到底，效果不好也不调整。&lt;br /&gt;
正确做法：根据实际效果持续优化Prompt模板。&lt;br /&gt;
&lt;strong&gt;5. 忽视平台特性&lt;/strong&gt;&lt;br /&gt;
错误做法：所有平台用同一套内容。&lt;br /&gt;
正确做法：根据平台调整风格和结构（公众号要深度，小红书要视觉，知乎要专业）。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&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辅助写作的本质，不是让AI替代你，而是优化你的工作流程。&lt;br /&gt;
回顾一下核心要点：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;4步工作流是关键&lt;/strong&gt;：选题→大纲→初稿→润色，每个环节都有对应的Prompt模板&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具选择看需求&lt;/strong&gt;：ChatGPT是最全能选择，Claude适合润色，文心一言适合国内用户&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;人机协作是核心&lt;/strong&gt;：AI做80%的执行工作，人做20%的创意决策&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;去AI味很重要&lt;/strong&gt;：用Prompt优化+人工调整，让内容更人性化&lt;br /&gt;
&lt;strong&gt;立即行动清单：&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;保存本文的4个Prompt模板（选题、大纲、初稿、润色）&lt;/li&gt;
&lt;li&gt;选择一个AI工具（推荐ChatGPT，免费版就够用）&lt;/li&gt;
&lt;li&gt;用本文的工作流写一篇文章&lt;/li&gt;
&lt;li&gt;记录时间，对比效率提升&lt;br /&gt;
试试看，你会发现写作不再是痛苦的事，而是高效的创作过程。当你掌握这套方法后，再也不用为内容产出发愁了&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>SEO入门指南：5个技巧让网站排名飙升</title><link>https://blog.moewah.com/posts/seo-website-optimization-beginner-guide/</link><guid isPermaLink="true">https://blog.moewah.com/posts/seo-website-optimization-beginner-guide/</guid><description>SEO真的那么难吗？本文用真实案例拆解5个简单易上手的优化技巧，帮你解决网站没人访问、排名靠后的问题，轻松提升搜索引擎可见度。</description><pubDate>Wed, 29 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;去年有个做手工的朋友小王跟我吐槽，说他花了三个月搭建了一个自己的作品展示网站，设计特别用心，产品照片也拍得很专业。结果每个月访问量只有可怜的100多人，还有一大半是他自己点进去的。他当时特别沮丧，问我：“是不是我的东西不够好？”&lt;/p&gt;
&lt;p&gt;其实不是。我看了他的网站，发现问题根本不在内容质量，而是SEO做得太差了——搜索引擎根本找不到他的网站。后来我教他做了一些最基本的优化，两个月后月访问量涨到了接近10000。&lt;/p&gt;
&lt;p&gt;SEO听起来挺高深，什么”爬虫”、“索引”、“权重”一堆专业术语。但SEO其实没那么神秘，很多技巧今天学了明天就能用。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;SEO到底是什么？&lt;a href=&quot;#seo到底是什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;你去图书馆找书，要么问管理员，要么查电脑目录。搜索引擎就像这个图书馆管理员，它的工作是帮用户找到最合适的”书”（网页）。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;这就是SEO要解决的问题——让搜索引擎更容易”找到”和”推荐”你的内容。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;当你在百度或Google搜索”北京好吃的火锅”，为什么海底捞、小龙坎这些餐厅排在前面？不只是因为它们有名，更重要的是它们的网站做了优化：标题写得清楚、内容详细、用户评价多、网站打开速度快。搜索引擎会根据这些信号判断：“这家店应该比较靠谱，推荐给用户吧。”&lt;/p&gt;&lt;p&gt;Google在2022年更新了一个挺重要的标准，叫E-E-A-T：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Experience（经验）&lt;/strong&gt;：你有没有真实体验过？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expertise（专业）&lt;/strong&gt;：你在这个领域懂不懂行？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Authority（权威）&lt;/strong&gt;：别人认不认可你？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trust（可信度）&lt;/strong&gt;：你的信息准确吗？&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;搜索引擎现在越来越聪明，它要的是真正对用户有帮助的内容，而不是那些专门为了排名硬凑出来的文章。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;2025年最重要的SEO趋势&lt;a href=&quot;#2025年最重要的seo趋势&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;SEO这东西一直在变。我记得2020年的时候，还有人在拼命堆关键词，现在这招早就不管用了，反而会被搜索引擎惩罚。&lt;/p&gt;&lt;p&gt;2024年3月，Google做了一次挺大的核心更新，目标是减少40%的”垃圾内容”。什么叫垃圾内容？就是那种看起来像文章，但读起来完全没营养，纯粹为了凑字数的东西。&lt;/p&gt;&lt;p&gt;还有一个趋势：**网站速度现在成了排名因素。**Google推出了一个叫Core Web Vitals的指标，说白了就是衡量”你的网页卡不卡”。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LCP（最大内容绘制）&lt;/strong&gt;：网页主要内容加载完成要多久？理想状态是2.5秒以内&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FID（首次交互延迟）&lt;/strong&gt;：用户点击按钮后，网页反应快不快？应该在100毫秒以内&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLS（累积布局偏移）&lt;/strong&gt;：你有没有遇到过那种情况——刚想点个按钮，页面突然跳了一下，你点到广告上了？这就是布局偏移&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我有个做电商的朋友，他的网站之前LCP是4.5秒，用户跳出率高达62%。后来他优化了一下图片压缩，用了CDN，LCP降到了2.1秒，跳出率直接降到35%，转化率提升了40%。&lt;/p&gt;&lt;p&gt;另外，AI对SEO的影响也越来越大。现在搜索引擎能更好地理解用户到底想要什么。比如你搜”怎么让孩子爱上阅读”，它不只是匹配关键词，而是真的理解你是个家长，想找实用的育儿方法。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;5个立即可用的SEO技巧&lt;a href=&quot;#5个立即可用的seo技巧&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;我见过太多新手犯这个错误了。我自己刚开始做网站那会儿，也以为SEO就是把关键词往文章里多塞几遍。结果文章标题写成”SEO SEO SEO优化技巧大全”，读起来完全不通顺，用户看了就想关掉。&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;/li&gt;
&lt;li&gt;长尾词：“上班族15分钟能做的川菜家常菜”（竞争小，而且搜这个的人意图明确）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;我有个写美食的朋友，原来她的文章标题都是”川菜推荐”、“川菜做法”这种。后来改成”上班族15分钟能做的川菜家常菜”、“新手也能学会的麻婆豆腐”，结果流量涨了3倍。因为搜索这些长尾词的人，就是真的想学做菜的。&lt;/p&gt;&lt;p&gt;还有个概念叫”关键词集群”，听起来挺专业，其实就是一篇文章解决一类相关问题。比如你写”如何选购笔记本电脑”，文章里可以自然地涉及”学生笔记本推荐”、“游戏本性能对比”、“轻薄本续航测试”这些相关词。搜索引擎现在挺聪明，能理解这些词是相关的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;错误做法&lt;/strong&gt;：文章标题”SEO SEO SEO优化技巧”&lt;/p&gt;&lt;p&gt;&lt;strong&gt;正确做法&lt;/strong&gt;：标题”新手网站没流量？这5个SEO技巧帮你解决”&lt;/p&gt;&lt;p&gt;第二个标题自然、有吸引力，而且解决了具体问题。关键词”SEO”和”优化”都在里面，但读起来完全不生硬。&lt;/p&gt;&lt;/section&gt;&lt;section&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;/p&gt;&lt;p&gt;你的网站排在搜索结果第三位，但如果标题写得不吸引人，用户照样不点你，反而点了排第五的那个。这就是CTR（点击率）的作用。&lt;/p&gt;&lt;p&gt;我给你看个对比：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;普通标题&lt;/strong&gt;：“Python教程”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优化后&lt;/strong&gt;：“Python入门教程：3天学会写第一个爬虫程序”&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;哪个更吸引你？肯定是第二个对吧。因为它告诉你：1）适合入门新手；2）只需要3天；3）能学会具体的东西（爬虫）。&lt;/p&gt;&lt;p&gt;有个数据我印象特别深：某个技术博客把标题从”JavaScript基础”改成”JavaScript零基础教程：7天从入门到做出第一个网页”，CTR从1.5%直接跳到6.2%，排名还提升了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;那怎么写好标题呢？&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;包含核心关键词（让搜索引擎知道你讲什么）&lt;/li&gt;
&lt;li&gt;说明具体价值（用户能得到什么）&lt;/li&gt;
&lt;li&gt;最好有数字（3个方法、5个技巧，人对数字特别敏感）&lt;/li&gt;
&lt;li&gt;不要超过60个字符（太长会被截断）&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Meta Description（就是搜索结果下面的那段描述文字）也一样重要。很多人不写，让搜索引擎自己抓取，结果抓的内容乱七八糟。你应该自己写一段150字左右的描述，总结文章核心价值，同时自然地包含关键词。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;技巧3：内容质量 &amp;gt; 内容数量（10X内容策略）&lt;a href=&quot;#技巧3内容质量--内容数量10x内容策略&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;我之前也陷入过误区，觉得文章越多越好，一天发三篇。结果每篇都写得很浅，用户看了没收获，排名也上不去。&lt;/p&gt;&lt;p&gt;后来我了解到一个概念叫”10X内容”——就是&lt;strong&gt;比竞争对手好10倍的内容。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;举个例子。假设你要写”如何选购笔记本电脑”，你搜一下这个关键词，看看排名前面的文章都写了什么。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A文章&lt;/strong&gt;：500字，泛泛而谈”要看处理器、内存、硬盘”，没有具体型号推荐&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;B文章&lt;/strong&gt;：3000字，包含15款笔记本实测数据、详细的价格对比表、按使用场景（学生、设计、游戏）分类推荐，还有购买避坑指南&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;你觉得哪个会排名更高？肯定是B对吧。事实也是这样，我观察了很多竞争激烈的关键词，排在第一页的几乎都是这种深度长文。&lt;/p&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;：不只停留在表面，深入讲清楚原理和细节&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;我自己写文章的时候，会先搜索这个关键词，看排名前10的文章都讲了什么，然后问自己：“我能提供什么他们没有的价值？”&lt;/p&gt;&lt;p&gt;记住：&lt;strong&gt;宁可一个月出一篇高质量文章，也不要一周出七篇水文。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;我刚开始的时候，看到一些服务商说”花1000块给你100个外链”，我还心动了。幸好我没买，后来才知道那些垃圾外链不仅没用，反而可能害你被搜索引擎惩罚。&lt;/p&gt;&lt;p&gt;**什么是高质量外链？**就是有权威的网站主动链接到你的内容，因为你的内容确实有价值。&lt;/p&gt;&lt;p&gt;比如，某个行业研究机构发布了一份独家的市场分析报告，数据详实、观点独到。结果有50多个行业网站、新闻媒体引用了这份报告，并且附上了来源链接。这50个外链的价值，远远超过你花钱买的1000个垃圾链接。&lt;/p&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;：行业报告、深度教程、实用工具&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;：LinkedIn、Facebook、知乎这些平台也能带来流量&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;我有个朋友做了一个特别实用的Excel模板工具，免费分享出来，结果被很多办公类公众号、知乎专栏引用，自然带来了几百个外链。&lt;/p&gt;&lt;p&gt;避坑：千万别花钱买那种批量外链服务。搜索引擎现在能识别出来，一旦被发现，你的网站可能直接被降权。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;技巧5：技术优化，让网站”跑得快”&lt;a href=&quot;#技巧5技术优化让网站跑得快&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这个技巧说起来有点技术，但其实操作起来不难。&lt;/p&gt;&lt;p&gt;网站速度现在是排名因素。用户打开一个网页，等了10秒还在加载，早就烦了关掉了。Google的数据显示，网页加载时间每增加1秒，转化率下降7%。&lt;/p&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;：这个最简单也最有效。用TinyPNG这种工具压缩一下，画质基本没影响，大小能减少70%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用CDN&lt;/strong&gt;：CDN就是内容分发网络，简单说就是把你的网站内容分布到全国各地的服务器上&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;减少JS和CSS文件&lt;/strong&gt;：如果你用WordPress或者其他建站工具，很可能加载了一堆用不到的脚本文件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;移动端适配&lt;/strong&gt;：现在超过60%的流量来自手机，如果你的网站在手机上显示错乱，排名肯定上不去&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;我之前帮一个做教育的朋友优化过网站。他的网站之前LCP是4.5秒，用户跳出率62%。我们做了这些优化：把首页的大图从3MB压缩到500KB，换了个更快的主机，用上了CDN，结果LCP降到2.1秒，跳出率降到35%，最关键的是转化率提升了40%。&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;✓ 首页加载时间在3秒以内吗？&lt;/li&gt;
&lt;li&gt;✓ 有没有死链接或404错误页面？&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;新手最容易踩的3个坑&lt;a href=&quot;#新手最容易踩的3个坑&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;说了这么多技巧，我还想提醒你三个常见的错误，我自己当初也踩过。&lt;/p&gt;&lt;section&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;有个做护肤品的老板，听说SEO重要，就把关键词往文章里猛塞。标题是”护肤品护肤品推荐最好的护肤品”，文章每两句话就出现一次”护肤品”。结果网站被Google降权了，排名从第一页直接掉到找不着。&lt;/p&gt;&lt;p&gt;记住：关键词密度控制在2-3%就够了，最重要的是自然。如果你读着都觉得别扭，搜索引擎肯定也觉得不对劲。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;坑2：忽视用户体验，只为SEO而SEO&lt;a href=&quot;#坑2忽视用户体验只为seo而seo&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;我见过一些文章，明明是写给搜索引擎看的，不是给人看的。通篇都是关键词和术语，读起来像机器人写的。&lt;/p&gt;&lt;p&gt;这就本末倒置了。**SEO的最终目的是什么？是让真实的用户找到你的内容，并且觉得有用。**如果用户点进来看了10秒就关掉，跳出率高得吓人，搜索引擎会判断”这内容不行”，你的排名照样掉。&lt;/p&gt;&lt;p&gt;先写给人看，再考虑SEO。写完之后再自然地优化一下关键词、标题，而不是为了SEO牺牲可读性。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;这个我太理解了。我刚开始做SEO的时候，优化了一周，天天去查排名，发现一点变化都没有，就开始怀疑”是不是方法不对？”&lt;/p&gt;&lt;p&gt;后来我了解到，&lt;strong&gt;SEO是长期投资，通常需要3-6个月才能看到明显效果。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;制定一个至少3个月的SEO计划，持续优化，别急着看短期结果。很多人就是因为太急，一两周没效果就放弃了。&lt;/p&gt;&lt;p&gt;回顾一下这5个技巧：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;关键词要”融进去”&lt;/strong&gt;：用长尾关键词，自然地融入内容&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;标题和描述很关键&lt;/strong&gt;：决定用户点不点你，要写得有吸引力&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;质量大于数量&lt;/strong&gt;：一篇10X内容胜过十篇水文&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;**SEO是个持续优化的过程，不是一次性工程。**但好消息是，你不需要一次性做完所有事情。从最简单的开始：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;今天就检查一下你的网站标题是否优化了&lt;/li&gt;
&lt;li&gt;用Google Search Console（免费工具）看看自己的网站数据&lt;/li&gt;
&lt;li&gt;优先做好这3件事：关键词、标题、内容质量&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果你现在还没有网站也没关系，把这些概念记住，等你开始做内容的时候，从第一篇文章就把SEO考虑进去，比后期再补救容易多了。&lt;/p&gt;&lt;p&gt;SEO没有想象中那么难，也没有捷径。踏踏实实做好内容，用心优化细节，3个月后你回头看，一定会发现变化。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>通过 Let&apos;s Encrypt 获取免费 SSL 证书的两种方法！</title><link>https://blog.moewah.com/posts/164/</link><guid isPermaLink="true">https://blog.moewah.com/posts/164/</guid><description>如何通过Let&apos;s Encrypt获取免费SSL证书？本文详细对比acme.sh和certbot两种方法，手把手教你配置泛域名SSL证书，解决自动化续期问题。涵盖DNS验证、命令行操作等实战步骤，快速上手无需复杂配置。适合服务器管理员和开发者参考学习。</description><pubDate>Tue, 14 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;Let’s Encrypt 是目前免费 SSL 证书应用最广泛的一家，不仅免费而且证书也被众多机构认可。以前 Let’s Encrypt 的证书只支持顶级域名申请，不过现在已经支持通配符/泛域名 SSL 证书。泛域名证书比单域名证书方便多了，一次签发所有子域名通用，只需要担心续期问题。&lt;/p&gt;&lt;p&gt;&lt;img loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;900&quot; src=&quot;/_astro/164_2792785620.CNwRbmUx_Z92jVa.webp&quot; srcset=&quot;/_astro/164_2792785620.CNwRbmUx_t8Um3.webp 640w, /_astro/164_2792785620.CNwRbmUx_Z8hKnz.webp 750w, /_astro/164_2792785620.CNwRbmUx_1Oek5F.webp 828w, /_astro/164_2792785620.CNwRbmUx_Z2rjn03.webp 1080w, /_astro/164_2792785620.CNwRbmUx_Z8cqGd.webp 1280w, /_astro/164_2792785620.CNwRbmUx_Z92jVa.webp 1600w&quot; /&gt;&lt;/p&gt;&lt;p&gt;今天我们来说下如何申请使用 Let’s Encrypt 泛域名 SSL 证书，这里提供两种方式：acme.sh 和 certbot。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;一、通过 acme.sh 获取 Let’s Encrypt SSL 证书&lt;a href=&quot;#一通过-acmesh-获取-lets-encrypt-ssl-证书&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;acme.sh 是一个纯 Shell 脚本编写的 ACME 客户端，支持多种验证方式，特别适合需要自动化 DNS 验证的场景。&lt;/p&gt;&lt;section&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;Debian/Ubuntu 和 CentOS 8+ 都可以用同样的方式安装：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://get.acme.sh&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sh&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;或者用 wget：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-O&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://get.acme.sh&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sh&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;安装成功后，acme.sh 会被安装到用户目录下的 &lt;code&gt;.acme.sh&lt;/code&gt; 目录中。&lt;/p&gt;&lt;/section&gt;&lt;section&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;安装完成后需要创建一个 bash alias，或者直接加载配置：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;alias&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;acme.sh=~/.acme.sh/acme.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;或：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;source&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.bashrc&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;设置 Let’s Encrypt 为默认 CA&lt;a href=&quot;#设置-lets-encrypt-为默认-ca&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;自 2022 年以后，acme.sh 默认将 CA 改为 ZeroSSL。如果希望使用 Let’s Encrypt，需要切换：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;acme.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--set-default-ca&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--server&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;letsencrypt&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;如果不设置这一步，申请证书时会卡在获取 EAB 授权那一步。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&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;这里使用 DNS 自动验证方式验证域名所有权。acme.sh 目前支持 Cloudflare、DNSPod、CloudXNS、GoDaddy 以及 OVH 等数十种解析商的自动集成，请自行查看官方提供的 &lt;a href=&quot;https://github.com/acmesh-official/acme.sh/wiki/dnsapi&quot; target=&quot;_blank&quot;&gt;DNS API 文档&lt;/a&gt;&lt;/p&gt;&lt;section&gt;&lt;h4&gt;Cloudflare&lt;a href=&quot;#cloudflare&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;如果你的域名使用 Cloudflare 解析，设置 API Token：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CF_Token&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;你的_Cloudflare_API_Token&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;acme.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--issue&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--dns&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dns_cf&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;example.com&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;.example.com&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;DNSPod&lt;a href=&quot;#dnspod&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DP_Id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;你的_DNSPod_ID&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DP_Key&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;你的_DNSPod_Key&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;acme.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--issue&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--dns&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dns_dp&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;example.com&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;.example.com&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;手动 DNS 验证&lt;a href=&quot;#手动-dns-验证&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;如果你的 DNS 提供商没有提供 API，可以使用手动验证方式。比如使用 Hurricane (dns.he.net)：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HE_Username&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;用户名&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;HE_Password&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;密码&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;acme.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--issue&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--dns&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dns_he&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;example.com&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;.example.com&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;第一个 &lt;code&gt;-d&lt;/code&gt; 后不能只写通配符域名 &lt;code&gt;*.example.com&lt;/code&gt;，否则可能会出现签发的证书无法被信任的情况，一定要写个单域名。第二个 &lt;code&gt;-d&lt;/code&gt; 后面可以写泛域名。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&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;--installcert&lt;/code&gt; 命令，并将证书复制到指定目标位置:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;acme.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--installcert&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;example.com&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;--key-file&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/nginx/ssl/example.com.key&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;--fullchain-file&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/nginx/ssl/fullchain.cer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;--reloadcmd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;systemctl reload nginx&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果使用 service:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;acme.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--installcert&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;example.com&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;--key-file&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/nginx/ssl/example.com.key&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;--fullchain-file&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/nginx/ssl/fullchain.cer&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;--reloadcmd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;service nginx reload&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;该命令会被自动记录，以后自动更新证书的时候也会自动执行该命令。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&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;acme.sh 安装时会自动创建一个 cron 任务，每天检查证书是否需要续期。证书在 60 天以后会自动更新，无需任何操作。&lt;/p&gt;&lt;p&gt;如果需要手动触发续期：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;acme.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--renew&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;example.com&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--force&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Nginx 配置&lt;a href=&quot;#nginx-配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;创建配置文件 &lt;code&gt;/etc/nginx/conf.d/example.com.conf&lt;/code&gt;:&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen &lt;/span&gt;&lt;span&gt;80&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name &lt;/span&gt;&lt;span&gt;&lt;span&gt;example.com www.example.com&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;301&lt;/span&gt;&lt;span&gt;&lt;span&gt; https://&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;request_uri&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen &lt;/span&gt;&lt;span&gt;443&lt;/span&gt;&lt;span&gt;&lt;span&gt; ssl http2&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name &lt;/span&gt;&lt;span&gt;&lt;span&gt;example.com www.example.com&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_certificate &lt;/span&gt;&lt;span&gt;&lt;span&gt;/etc/nginx/ssl/fullchain.cer&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_certificate_key &lt;/span&gt;&lt;span&gt;&lt;span&gt;/etc/nginx/ssl/example.com.key&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_protocols &lt;/span&gt;&lt;span&gt;&lt;span&gt;TLSv1.2 TLSv1.3&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_ciphers &lt;/span&gt;&lt;span&gt;&lt;span&gt;HIGH:!aNULL:!MD5&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_prefer_server_ciphers &lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;root &lt;/span&gt;&lt;span&gt;&lt;span&gt;/var/www/html&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;index &lt;/span&gt;&lt;span&gt;&lt;span&gt;index.html&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;测试配置并重启 Nginx:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nginx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-t&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;reload&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nginx&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;Nginx 的配置 &lt;code&gt;ssl_certificate&lt;/code&gt; 使用 &lt;code&gt;/etc/nginx/ssl/fullchain.cer&lt;/code&gt;，而不是 &lt;code&gt;/etc/nginx/ssl/example.com.cer&lt;/code&gt;，否则 SSL Labs 的测试会报 &lt;code&gt;Chain issues Incomplete&lt;/code&gt; 错误&lt;/li&gt;
&lt;li&gt;如果提示 &lt;code&gt;acme.sh: command not found&lt;/code&gt;，需要执行 &lt;code&gt;source ~/.bashrc&lt;/code&gt; 或注销并重新登录&lt;/li&gt;
&lt;li&gt;证书在 90 天以后会自动更新，无需任何操作&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;二、通过 certbot 获取 Let’s Encrypt SSL 证书&lt;a href=&quot;#二通过-certbot-获取-lets-encrypt-ssl-证书&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Certbot 是 Let’s Encrypt 官方推荐的获取证书客户端，支持所有 Unix 内核的操作系统。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;安装&lt;a href=&quot;#安装-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;Debian/Ubuntu&lt;a href=&quot;#debianubuntu&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;certbot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;python3-certbot-nginx&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;CentOS 8+&lt;a href=&quot;#centos-8&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dnf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;epel-release&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dnf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;certbot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;python3-certbot-nginx&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;生成证书&lt;a href=&quot;#生成证书-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;HTTP 验证(单域名证书)&lt;a href=&quot;#http-验证单域名证书&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;如果你的网站已经运行在 Nginx 上，可以使用 webroot 模式:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;certbot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;certonly&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--webroot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-w&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/var/www/html&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;example.com&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;www.example.com&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这个命令会在 &lt;code&gt;/var/www/html&lt;/code&gt; 中创建 &lt;code&gt;.well-known&lt;/code&gt; 文件夹，里面包含一些验证文件。certbot 会通过访问 &lt;code&gt;example.com/.well-known/acme-challenge&lt;/code&gt; 来验证域名是否绑定的这个服务器。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;Standalone 验证&lt;a href=&quot;#standalone-验证&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;如果你的服务没有网站根目录，可以使用 standalone 模式。这个模式会自动启用服务器的 80 端口来验证域名的归属:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;certbot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;certonly&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--standalone&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;example.com&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;www.example.com&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;使用 standalone 模式时，如果有其他服务(如 nginx)占用了 80 端口，必须先停止这些服务，在证书生成完毕后再启用。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;DNS 验证(泛域名证书)&lt;a href=&quot;#dns-验证泛域名证书&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;泛域名证书必须使用 DNS 验证方式:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;certbot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;certonly&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--manual&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--preferred-challenges=dns&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;example.com&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;.example.com&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;执行这个命令后，certbot 会提示你添加一个 TXT 记录到你的 DNS 配置中。按照提示在 DNS 管理界面添加记录，然后按回车继续。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;自动化 DNS 验证&lt;a href=&quot;#自动化-dns-验证&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;如果使用支持 API 的 DNS 提供商，可以自行搜索安装对应的 certbot 插件，来实现自动化 DNS 验证。例如使用 Cloudflare：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;python3-certbot-dns-cloudflare&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;创建 credentials 文件 &lt;code&gt;/etc/letsencrypt/secrets/certbot-cloudflare.ini&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;dns_cloudflare_api_token&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 你的_Cloudflare_API_Token&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;设置文件权限：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;chmod&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;600&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/letsencrypt/secrets/certbot-cloudflare.ini&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后运行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;certbot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;certonly&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--dns-cloudflare&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--dns-cloudflare-credentials&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/letsencrypt/secrets/certbot-cloudflare.ini&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;example.com&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;.example.com&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&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;/etc/letsencrypt/live/example.com&lt;/code&gt; 目录下看到对应域名的文件夹，里面存放了证书文件：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fullchain.pem&lt;/code&gt;: 证书链(包含证书和中间证书)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;privkey.pem&lt;/code&gt;: 私钥&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cert.pem&lt;/code&gt;: 证书&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chain.pem&lt;/code&gt;: 中间证书&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Nginx 配置&lt;a href=&quot;#nginx-配置-1&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen &lt;/span&gt;&lt;span&gt;80&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name &lt;/span&gt;&lt;span&gt;&lt;span&gt;example.com www.example.com&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;301&lt;/span&gt;&lt;span&gt;&lt;span&gt; https://&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;request_uri&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen &lt;/span&gt;&lt;span&gt;443&lt;/span&gt;&lt;span&gt;&lt;span&gt; ssl http2&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name &lt;/span&gt;&lt;span&gt;&lt;span&gt;example.com www.example.com&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_certificate &lt;/span&gt;&lt;span&gt;&lt;span&gt;/etc/letsencrypt/live/example.com/fullchain.pem&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_certificate_key &lt;/span&gt;&lt;span&gt;&lt;span&gt;/etc/letsencrypt/live/example.com/privkey.pem&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_protocols &lt;/span&gt;&lt;span&gt;&lt;span&gt;TLSv1.2 TLSv1.3&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_ciphers &lt;/span&gt;&lt;span&gt;&lt;span&gt;HIGH:!aNULL:!MD5&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_prefer_server_ciphers &lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;root &lt;/span&gt;&lt;span&gt;&lt;span&gt;/var/www/html&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;index &lt;/span&gt;&lt;span&gt;&lt;span&gt;index.html&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;测试配置并重启 Nginx：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&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;-t&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;reload&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nginx&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;Let’s Encrypt 提供的证书只有 90 天的有效期。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;从 certbot v0.19.0 开始，安装时会自动创建 systemd timer 和 cron job（通常在 &lt;code&gt;/etc/cron.d/certbot&lt;/code&gt;），所以大多数情况下不需要手动添加续期任务。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;检查自动续期是否正常工作：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;certbot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;renew&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--dry-run&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这个命令会模拟续期过程，如果一切正常，说明自动续期已配置好。&lt;/p&gt;&lt;section&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;如果你的证书使用 standalone 模式生成，或者自动续期没有正常工作，则需要手动添加续期任务。&lt;/p&gt;&lt;p&gt;使用 standalone 模式时，&lt;strong&gt;如果有其他服务（如 nginx）占用了 80 端口，必须先停止这些服务，在证书生成完毕后再启用。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;编辑 crontab:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;crontab&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-e&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;添加以下内容:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0,12&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;certbot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;renew&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-q&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这个设置会在每天凌晨 0 点和 12 点检查并续期证书。&lt;/p&gt;&lt;p&gt;如果是 standalone 模式，需要使用 pre/post hook：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;15&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;/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;certbot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;renew&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--pre-hook&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;systemctl stop nginx&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--post-hook&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;systemctl start nginx&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;或者使用 service：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;15&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;/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;certbot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;renew&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--pre-hook&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;service nginx stop&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--post-hook&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;service nginx start&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;--pre-hook&lt;/code&gt; 表示执行更新操作之前要做的事情，&lt;code&gt;--post-hook&lt;/code&gt; 表示执行更新完成后要做的事情。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;strong&gt;acme.sh&lt;/strong&gt;: 轻量级，纯 Shell 实现，支持更多 DNS 提供商的自动化，适合需要自动化 DNS 验证的场景&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;certbot&lt;/strong&gt;: 官方推荐，功能完善，支持自动配置 Nginx，文档完善，适合常规使用&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;选择哪种方式主要看你的具体需求。如果你需要支持更多的 DNS 提供商或者喜欢轻量级的解决方案，acme.sh 是不错的选择。如果你希望使用官方推荐的工具并享受自动配置的便利，certbot 会更适合。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;无论选择哪种方式，都能帮你轻松获取免费的 SSL 证书，让你的网站拥抱 HTTPS。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Docker-Compose 自部署 MinIO S3 对象存储服务</title><link>https://blog.moewah.com/posts/2877/</link><guid isPermaLink="true">https://blog.moewah.com/posts/2877/</guid><description>如何用Docker Compose快速部署MinIO S3对象存储？本文详细拆解环境准备、配置文件编写及启动验证全流程，手把手指导你搭建私有化数据存储平台。支持Lobe-Chat、思源笔记等应用的S3兼容数据同步，确保高效安全的数据管理。</description><pubDate>Tue, 14 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;MinIO 是个开源的对象存储服务器，兼容 Amazon S3 API。MinIO 在大数据、云计算和容器化环境中广泛应用，为应用程序提供了可靠、高效的对象存储服务。很多项目都支持 S3 接口，Lobe-Chat、思源笔记、Obsidian 的 Self-hosted LiveSync 插件都能用它做数据同步。因此自部署一个  MinIO 单节点 S3 对象存储服务器，自己用起来也方便许多。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; width=&quot;1500&quot; height=&quot;500&quot; src=&quot;/_astro/minio_S3_cover.ZW9OiiBw_Z2kVX6c.webp&quot; srcset=&quot;/_astro/minio_S3_cover.ZW9OiiBw_1tT4Pl.webp 640w, /_astro/minio_S3_cover.ZW9OiiBw_1BuvMR.webp 750w, /_astro/minio_S3_cover.ZW9OiiBw_yhxWa.webp 828w, /_astro/minio_S3_cover.ZW9OiiBw_Z1guzmx.webp 1080w, /_astro/minio_S3_cover.ZW9OiiBw_ZnOCGC.webp 1280w, /_astro/minio_S3_cover.ZW9OiiBw_Z2kVX6c.webp 1500w&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;section&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;先确认有 Docker:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker-compose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果没有 Docker 或 Docker Compose，装一下:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装 Docker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-sSL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://get.docker.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;sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;enable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装 Docker Compose&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-L&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;https://github.com/docker/compose/releases/download/v2.9.0/docker-compose-&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt;uname&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-s&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;uname&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-m&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-o&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/usr/local/bin/docker-compose&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 赋予 docker-compose 执行权限&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod&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;/usr/local/bin/docker-compose&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir&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;/opt/minio/{s3_data,config}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/opt/minio&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;docker-compose.yml:&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;version&lt;/span&gt;&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;3.5&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;minio&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;minio/minio:RELEASE.2025-04-22T22-12-26Z&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;container_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;minio&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;restart&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;always&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &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;9000:9000&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# API&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &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;9001:9001&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;TZ&lt;/span&gt;&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;Asia/Shanghai&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;MINIO_ROOT_USER&lt;/span&gt;&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;admin&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;MINIO_ROOT_PASSWORD&lt;/span&gt;&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;your-strong-password&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;MINIO_CORS_ALLOW_ORIGIN&lt;/span&gt;&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;*&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;healthcheck&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;test&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&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;CMD&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;curl&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;-f&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;http://localhost:9000/minio/health/live&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;interval&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;30s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;timeout&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;10s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;retries&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;start_period&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;60s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./s3_data:/data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./config:/root/.minio&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;command&lt;/span&gt;&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;server /data --console-address :9001 --address :9000&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;启动:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker-compose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;up&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;等几分钟容器完全启动，浏览器访问控制台:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;http://你的服务器IP:9001&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;用你设置的用户名密码登录。&lt;/p&gt;&lt;p&gt;API 地址是:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;http://你的服务器IP:9000&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 停止&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker-compose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;down&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 重启&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker-compose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;restart&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 更新镜像&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker-compose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pull&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker-compose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;up&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 查看日志&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker-compose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;logs&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-f&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;minio&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Ubuntu/Debian&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ufw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;allow&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;9000/tcp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ufw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;allow&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;9001/tcp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# CentOS/RHEL&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;firewall-cmd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--add-port=9000/tcp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--permanent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;firewall-cmd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--add-port=9001/tcp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--permanent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;firewall-cmd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--reload&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;看端口占用:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;netstat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-tlnp&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;grep&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;:9000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;netstat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-tlnp&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;grep&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;:9001&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;检查容器状态:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ps&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;grep&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;minio&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Nginx 反向代理&lt;a href=&quot;#nginx-反向代理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;防火墙开放 80 和 443 端口&lt;/li&gt;
&lt;li&gt;准备两个二级域名, DNS 记录指向你的服务器 IP:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;api.your-domain.com&lt;/code&gt; → 你的服务器 IP&lt;/li&gt;
&lt;li&gt;&lt;code&gt;console.your-domain.com&lt;/code&gt; → 你的服务器 IP&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&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;Debian/Ubuntu 保存到 &lt;code&gt;/etc/nginx/sites-available/minio&lt;/code&gt;，CentOS/RHEL 保存到 &lt;code&gt;/etc/nginx/conf.d/minio.conf&lt;/code&gt;:&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# API&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen &lt;/span&gt;&lt;span&gt;80&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name &lt;/span&gt;&lt;span&gt;&lt;span&gt;api.your-domain.com&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;301&lt;/span&gt;&lt;span&gt;&lt;span&gt; https://&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;request_uri&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen &lt;/span&gt;&lt;span&gt;443&lt;/span&gt;&lt;span&gt;&lt;span&gt; ssl http2&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name &lt;/span&gt;&lt;span&gt;&lt;span&gt;api.your-domain.com&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_certificate &lt;/span&gt;&lt;span&gt;&lt;span&gt;/etc/ssl/certs/your-domain.crt&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_certificate_key &lt;/span&gt;&lt;span&gt;&lt;span&gt;/etc/ssl/private/your-domain.key&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_protocols &lt;/span&gt;&lt;span&gt;&lt;span&gt;TLSv1.2 TLSv1.3&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_ciphers &lt;/span&gt;&lt;span&gt;&lt;span&gt;ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_prefer_server_ciphers &lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;add_header &lt;/span&gt;&lt;span&gt;Strict-Transport-Security &lt;/span&gt;&lt;span&gt;&quot;max-age=31536000; includeSubDomains&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt; always&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;add_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Content-Type-Options nosniff&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;add_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Frame-Options DENY&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_pass &lt;/span&gt;&lt;span&gt;&lt;span&gt;http://localhost:9000&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;Host &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;http_host&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Real-IP &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;remote_addr&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Forwarded-For &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_add_x_forwarded_for&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Forwarded-Proto &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;scheme&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_connect_timeout &lt;/span&gt;&lt;span&gt;300&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_http_version &lt;/span&gt;&lt;span&gt;1.1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;Connection &lt;/span&gt;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;chunked_transfer_encoding &lt;/span&gt;&lt;span&gt;off&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Console&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen &lt;/span&gt;&lt;span&gt;80&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name &lt;/span&gt;&lt;span&gt;&lt;span&gt;console.your-domain.com&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;301&lt;/span&gt;&lt;span&gt;&lt;span&gt; https://&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;request_uri&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen &lt;/span&gt;&lt;span&gt;443&lt;/span&gt;&lt;span&gt;&lt;span&gt; ssl http2&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name &lt;/span&gt;&lt;span&gt;&lt;span&gt;console.your-domain.com&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_certificate &lt;/span&gt;&lt;span&gt;&lt;span&gt;/etc/ssl/certs/your-domain.crt&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_certificate_key &lt;/span&gt;&lt;span&gt;&lt;span&gt;/etc/ssl/private/your-domain.key&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_protocols &lt;/span&gt;&lt;span&gt;&lt;span&gt;TLSv1.2 TLSv1.3&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;51&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_ciphers &lt;/span&gt;&lt;span&gt;&lt;span&gt;ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;52&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_prefer_server_ciphers &lt;/span&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;53&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;54&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;add_header &lt;/span&gt;&lt;span&gt;Strict-Transport-Security &lt;/span&gt;&lt;span&gt;&quot;max-age=31536000; includeSubDomains&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt; always&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;55&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;add_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Content-Type-Options nosniff&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;56&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;add_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Frame-Options DENY&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;57&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;58&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;59&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_pass &lt;/span&gt;&lt;span&gt;&lt;span&gt;http://localhost:9001&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;60&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;Host &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;http_host&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;61&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Real-IP &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;remote_addr&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;62&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Forwarded-For &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_add_x_forwarded_for&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;63&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Forwarded-Proto &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;scheme&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;64&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Forwarded-Prefix /&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;65&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;66&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_http_version &lt;/span&gt;&lt;span&gt;1.1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;67&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;Upgrade &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;http_upgrade&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;68&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;Connection &lt;/span&gt;&lt;span&gt;&quot;upgrade&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;69&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;70&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_connect_timeout &lt;/span&gt;&lt;span&gt;300&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;71&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_send_timeout &lt;/span&gt;&lt;span&gt;300&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;72&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_read_timeout &lt;/span&gt;&lt;span&gt;300&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;73&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;74&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;申请 SSL 证书&lt;a href=&quot;#申请-ssl-证书&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;推荐用 Let’s Encrypt:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Debian/Ubuntu&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;certbot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;python3-certbot-nginx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;certbot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;certonly&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;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;api.your-domain.com&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;console.your-domain.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# CentOS/RHEL&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dnf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;certbot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;python3-certbot-nginx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;certbot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;certonly&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;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;api.your-domain.com&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;console.your-domain.com&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;证书在 &lt;code&gt;/etc/letsencrypt/live/your-domain.com/&lt;/code&gt;,包含 &lt;code&gt;fullchain.pem&lt;/code&gt; 和 &lt;code&gt;privkey.pem&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;改 Nginx 配置里的证书路径:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ssl_certificate &lt;/span&gt;&lt;span&gt;&lt;span&gt;/etc/letsencrypt/live/your-domain.com/fullchain.pem&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ssl_certificate_key &lt;/span&gt;&lt;span&gt;&lt;span&gt;/etc/letsencrypt/live/your-domain.com/privkey.pem&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;测试并重载:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&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;-t&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;reload&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nginx&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;现在用 HTTPS 访问:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;API: &lt;code&gt;https://api.your-domain.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;控制台: &lt;code&gt;https://console.your-domain.com&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>《楚门的世界》：被监控的完美人生真相</title><link>https://blog.moewah.com/posts/truman-show-perfect-life-surveillance/</link><guid isPermaLink="true">https://blog.moewah.com/posts/truman-show-perfect-life-surveillance/</guid><description>楚门如何挣脱24小时直播的牢笼？本文深度解析《楚门的世界》中关于真实与虚假、自由与操控的哲学命题，揭示媒体异化和存在主义困境，带你思考在信息时代下个体身份的迷失与觉醒。</description><pubDate>Sun, 12 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h3&gt;&lt;strong&gt;电影基本情况&lt;/strong&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; 《楚门的世界》（The Truman Show）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;导演：&lt;/strong&gt; 彼得·威尔（Peter Weir），澳大利亚籍。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代表作：&lt;/strong&gt; 《死亡诗社》（Dead Poets Society）、《怒海争锋：极地征伐》（Master and Commander: The Far Side of the World）等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;上映日期：&lt;/strong&gt; 1998年6月5日（美国）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;电影风格：&lt;/strong&gt; 科幻喜剧、剧情片、社会讽刺片。 影片融合了戏剧的深度、科幻的设定以及喜剧的元素，以一种温和而深刻的方式探讨了模拟现实、存在主义、监视、隐私、大众媒体异化等严肃议题。 电影在视觉上模仿电视节目的拍摄手法，如使用1.66:1的画幅比例、大量俯拍和带有暗角的镜头，营造出一种被“监视”的独特视效，强化了影片主题。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;&lt;strong&gt;导演创作动机与表达意图&lt;/strong&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;威尔通过《楚门的世界》提出了对媒体权力、消费主义以及现代社会中“真人秀”文化兴起的深刻反思。他让观众成为“真人秀”的观看者，从而反思自身在媒体消费中的“窥视癖”与被动接受。 影片的核心在于呈现一个被精心构建的“完美世界”如何剥夺了个体的自由意志和对真实世界的认知权，并借由楚门最终挣脱束缚的旅程，歌颂了人类追求真相和自由的勇气。彼得·威尔曾表示，这部电影的灵感来源于一个人的生活在不知情的情况下被24小时电视转播给全世界的设想。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;&lt;strong&gt;核心台词与逐条分析&lt;/strong&gt;&lt;a href=&quot;#核心台词与逐条分析&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;以下是影片中体现主题的10条以上核心台词及其场景分析：&lt;/p&gt;&lt;ol&gt;
&lt;li&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; 影片开篇及楚门每次出门与邻居打招呼时（如第5分钟，以及影片结尾楚门走出摄影棚前）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主题关联：&lt;/strong&gt; 这句话是楚门的标志性问候语，贯穿影片始终。它最初体现了楚门阳光、积极、充满仪式感的生活态度，但在影片结尾，当楚门真正走出虚假世界时，这句话成为了他对过去虚假生活的告别，以及对未知真实世界的一种勇敢而真诚的问候。它象征着个体从被设定的人生中觉醒，走向自主选择的自由。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;导演意图：&lt;/strong&gt; 强调楚门作为“真实人”（True Man）的特质，即使身处谎言，其本性依然真诚，并用这种看似日常的问候语，为影片的超现实设定增添了一丝悲剧性的讽刺意味。&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;strong&gt;场景片段：&lt;/strong&gt; 影片开场，克里斯托弗在接受访谈时（如第2分钟）。&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;
&lt;p&gt;&lt;strong&gt;“他就是出生在直播现场。”&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;场景片段：&lt;/strong&gt; 影片开场，主持人介绍《楚门秀》的起源时（如第3分钟）。&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;
&lt;p&gt;&lt;strong&gt;“我的生活不分公私，‘楚门秀’就是我全部的生活。”&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;场景片段：&lt;/strong&gt; 楚门的“妻子”梅丽尔（Meryl）在一次节目中对着镜头说的话（如第20分钟左右，当楚门开始怀疑时，她仍旧机械性地表演）。&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;
&lt;p&gt;&lt;strong&gt;“我们都在寻找自己的真实，但我们却不知道它在哪里。”&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;场景片段：&lt;/strong&gt; 楚门在怀疑人生后，与友人马龙的对话或内心独白（如第50分钟左右）。&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;
&lt;p&gt;&lt;strong&gt;“我不想再被控制，我想要自由。”&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;场景片段：&lt;/strong&gt; 楚门多次尝试逃离海景镇，面对重重阻碍时的挣扎与呐喊（如第65分钟，他试图搭乘巴士离开，却被各种意外阻拦）。&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;
&lt;p&gt;&lt;strong&gt;“我不知道这个世界是什么，但我知道，我要离开它。”&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;场景片段：&lt;/strong&gt; 楚门驾驶帆船冲破风暴，即将抵达摄影棚尽头时（如第95分钟）。&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;
&lt;p&gt;&lt;strong&gt;“你为什么不把那个世界也拍下来？它和这个世界一样虚假。”&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;场景片段：&lt;/strong&gt; 楚门的“真爱”西尔维娅（Sylvia）在访谈中质问克里斯托弗（如第98分钟）。&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;
&lt;p&gt;&lt;strong&gt;“我给了楚门过正常生活的机会。而你所生活的世界，是一个病态的世界。”&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;场景片段：&lt;/strong&gt; 克里斯托弗在影片结尾，通过扩音器与楚门对话时（如第100分钟）。&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;
&lt;p&gt;&lt;strong&gt;“你是真的。这就是为什么大家那么爱看你。”&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;场景片段：&lt;/strong&gt; 影片结尾，克里斯托弗试图劝说楚门留下时对他说的话（如第101分钟）。&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;
&lt;p&gt;&lt;strong&gt;“没有剧本，没有提示卡。它不总是莎士比亚，但它是真实的，它就是生活。”&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;场景片段：&lt;/strong&gt; 影片开场，克里斯托弗介绍《楚门秀》的特点时（如第2分钟）。&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;/ol&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;&lt;strong&gt;影片风格类型对表达的影响&lt;/strong&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;&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;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;&lt;strong&gt;影片在影史中的独特价值与社会意义&lt;/strong&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;ol&gt;
&lt;li&gt;&lt;strong&gt;对“真人秀”文化的预言与批判：&lt;/strong&gt; 影片上映于1998年，早于全球真人秀节目的大规模兴起。它精准预言了未来媒体对个人生活的过度介入和消费，以及大众对“真实”娱乐的狂热追捧。 影片中的“楚门秀”成为了后来许多真人秀节目的原型与反思对象，其对“窥视癖”和媒体操控的批判至今仍具有强烈的现实意义。&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; 影片在全球取得了2.64亿美元的票房成功，并在第71届奥斯卡金像奖上获得多项提名，金·凯瑞也凭借此片获得了金球奖最佳男主角奖。 它证明了深刻的艺术主题可以通过引人入胜的故事和精湛的表演，赢得商业上的巨大成功。在豆瓣电影Top250中，该片位列前茅（如第10位或第17位，不同时期排名略有波动），评分高达9.3分，拥有超过百万观众的评价，被无数影迷奉为必看经典。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“楚门的世界妄想症”的命名：&lt;/strong&gt; 影片的影响力甚至延伸到了心理学领域。在电影上映十年后，有心理学者将一种妄想症命名为“楚门的世界妄想症”（Truman Show delusion），患者认为自己正生活在一部真人秀中，备受监控。 编剧安德鲁·尼科尔曾戏谑地表示，当有疾病以自己的作品命名时，就知道它已经成功了。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;影史参照：&lt;/strong&gt;
《楚门的世界》常被拿来与奥威尔的《1984》、赫胥黎的《美丽新世界》等反乌托邦文学作品相提并论，它们共同探讨了极权主义和技术对个人自由的压制。在电影领域，它与《黑客帝国》（The Matrix）同样对“何为真实”进行了深入探讨，但《楚门的世界》更侧重于对媒体和个人隐私的批判，其背景并非完全的虚拟世界，而是基于现实的“被构建的真实”。它也启发了后来许多关于虚拟现实、社会实验和媒体操控主题的电影和电视剧。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;</content:encoded></item><item><title>PVE 8.1 无法进入系统，只显示 grub&gt; ？试试这篇修复指南！</title><link>https://blog.moewah.com/posts/5327/</link><guid isPermaLink="true">https://blog.moewah.com/posts/5327/</guid><description>Proxmox VE 8.1 启动时卡在grub&gt;界面怎么办？本文提供从救援模式进入、修复引导文件到重新生成grub.cfg的完整解决方案，帮助你快速恢复系统正常运行。</description><pubDate>Fri, 28 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这篇指南将帮助你解决 Proxmox VE 8.1 无法启动，仅停留在 grub&amp;gt; 提示符界面的问题。&lt;/p&gt;
&lt;section&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;当你启动 Proxmox VE 8.1 时，系统无法正常加载，而是在黑屏界面显示 “grub&amp;gt;” 提示符，无法进入系统。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;屏幕显示信息如下：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;GNU&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;GRUB&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2.06-13+pmx1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Minimal&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;BASH-like&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;line&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;editing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;is&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;supported.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;For&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;the&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;first&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;word,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TAB&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lists&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;possible&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;command&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;completions.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Anywhere&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TAB&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lists&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;possible&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;device&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;or&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;competions.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;grub&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&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;磁盘故障或错误&lt;/li&gt;
&lt;li&gt;意外断电导致系统文件损坏&lt;/li&gt;
&lt;li&gt;引导文件（例如 /boot/grub/grub.cfg）丢失或损坏&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&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;p&gt;&lt;strong&gt;进入救援模式:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 Proxmox VE 安装 USB 启动盘启动你的服务器。&lt;/li&gt;
&lt;li&gt;在启动菜单中选择 “Advanced options”。&lt;/li&gt;
&lt;li&gt;选择 “Rescue boot” 并进入救援模式。&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;/boot/grub/grub.cfg&lt;/code&gt; 文件是否存在：&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ls&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/boot/grub/grub.cfg&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;如果文件存在，使用文本编辑器（例如 nano）打开文件，检查其内容是否正常：&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nano&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/boot/grub/grub.cfg&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&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;p&gt;如果 &lt;code&gt;/boot/grub/grub.cfg&lt;/code&gt; 文件丢失或损坏，可以使用以下命令修复：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首先，使用 &lt;code&gt;grub-install&lt;/code&gt; 命令安装 GRUB 引导程序：&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装到默认的系统盘&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;grub-install&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 或安装到指定系统盘&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;grub-install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/dev/sdX&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;将 &lt;code&gt;/dev/sdX&lt;/code&gt; 替换为你的系统磁盘（例如 /dev/sda）。&lt;/li&gt;
&lt;li&gt;然后，使用 &lt;code&gt;update-grub&lt;/code&gt; 命令重新生成引导配置文件：&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;update-grub&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;该命令将扫描系统中的可用内核和操作系统，并自动生成 &lt;code&gt;/boot/grub/grub.cfg&lt;/code&gt; 文件。&lt;/li&gt;
&lt;/ul&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;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;reboot&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;希望这篇指南能够帮助你解决 Proxmox VE 8.1 无法启动的问题！&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>301重定向 vs Canonical标签：SEO实战经验分享</title><link>https://blog.moewah.com/posts/708/</link><guid isPermaLink="true">https://blog.moewah.com/posts/708/</guid><description>301重定向和canonical标签有什么区别？本文详细解析两者本质差异及实战应用场景，帮助你正确使用SEO技术避免权重损失和索引混乱。</description><pubDate>Mon, 26 Feb 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;做了几年SEO，301重定向和canonical标签这两个东西，我踩过坑，也吃过亏。&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;301重定向和canonical本质完全不同&lt;/strong&gt;，但很多人搞混了，包括刚开始的我。&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;section&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;301是服务器级别的指令，告诉搜索引擎和浏览器”这个页面搬家了”。用户访问旧URL时，地址栏会直接跳转到新URL，搜索引擎也会把旧页面的所有权重、排名信号全部传递给新页面。旧页面会被搜索引擎从索引中移除。&lt;/p&gt;&lt;p&gt;Canonical只是HTML里的一行标签，告诉搜索引擎”这几个页面内容都差不多，但这个URL才是正版”。用户访问时页面不跳转，地址栏也不变，搜索引擎只是会把排名信号合并到你指定的那个URL。&lt;strong&gt;新旧页面可能都在索引里&lt;/strong&gt;。&lt;/p&gt;&lt;section&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;301&lt;/strong&gt;是你真的搬了家，所有信件和访客都被引导到新地址，老地址没人去了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Canonical&lt;/strong&gt;是你还是住这里，但你告诉所有人”如果要在官方通讯录里找我，就记这个电话号码”，其他号码也能打到你。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;，所有流量和权重都导向一个全新的URL → 用301。&lt;/p&gt;&lt;p&gt;比如博客从 &lt;code&gt;www.moewah.com&lt;/code&gt; 迁移到 &lt;code&gt;blog.moewah.com&lt;/code&gt;，旧文章 &lt;code&gt;https://www.moewah.com/archives/5341.html&lt;/code&gt; 迁移到 &lt;code&gt;https://blog.moewah.com/posts/5341/&lt;/code&gt;，旧页面就不要了，直接301过去。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;新旧页面同时存在且内容高度相似&lt;/strong&gt;，但你需要保留所有URL供用户访问 → 用canonical。&lt;/p&gt;&lt;p&gt;同一篇文章可以通过 &lt;code&gt;https://blog.moewah.com/posts/5341/&lt;/code&gt;、&lt;code&gt;https://blog.moewah.com/posts/5341/?ref=twitter&lt;/code&gt;、&lt;code&gt;https://blog.moewah.com/posts/5341/?sort=newest&lt;/code&gt; 访问，内容都差不多。就让后两个都指向 &lt;code&gt;https://blog.moewah.com/posts/5341/&lt;/code&gt;。用户访问哪个都行，搜索引擎也知道哪个才是正版。&lt;/p&gt;&lt;p&gt;如果既改了URL又出现了新的重复页面？&lt;strong&gt;两个都要用&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;先把旧的、已迁移的URL用301重定向到新的主URL，比如 &lt;code&gt;www.moewah.com&lt;/code&gt; 的文章全部 301 到 &lt;code&gt;blog.moewah.com&lt;/code&gt;。然后在新站点上，如果又因为参数产生了新的重复页面，就用canonical指向主URL。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&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;www.moewah.com&lt;/code&gt; 迁移到 &lt;code&gt;blog.moewah.com&lt;/code&gt; 为例。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;Nginx 301 重定向&lt;a href=&quot;#nginx-301-重定向&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;全站所有页面 301 重定向&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen &lt;/span&gt;&lt;span&gt;80&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name &lt;/span&gt;&lt;span&gt;&lt;span&gt;www.moewah.com&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;301&lt;/span&gt;&lt;span&gt;&lt;span&gt; https://blog.moewah.com&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;request_uri&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen &lt;/span&gt;&lt;span&gt;443&lt;/span&gt;&lt;span&gt;&lt;span&gt; ssl&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name &lt;/span&gt;&lt;span&gt;&lt;span&gt;www.moewah.com&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;301&lt;/span&gt;&lt;span&gt;&lt;span&gt; https://blog.moewah.com&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;request_uri&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;仅对文章页 301 重定向&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;把 &lt;code&gt;https://www.moewah.com/archives/5341.html&lt;/code&gt; 迁移到 &lt;code&gt;https://blog.moewah.com/posts/5341/&lt;/code&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 方式1：单页面重定向&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;/archives/5341.html &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;301&lt;/span&gt;&lt;span&gt; https://blog.moewah.com/posts/5341/;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 方式2：正则批量重定向&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;^/archives/(\d+)\.html$ &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;301&lt;/span&gt;&lt;span&gt;&lt;span&gt; https://blog.moewah.com/posts/&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Canonical 标签写法&lt;a href=&quot;#canonical-标签写法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;旧页面&lt;/strong&gt;：移除 canonical 标签或删除整个 HTML 文件&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- 旧页面不添加 canonical --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- 文件会被 301 重定向，无需 canonical --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;新页面&lt;/strong&gt;：canonical 指向自身 URL&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;head&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rel&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;canonical&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://blog.moewah.com/posts/5341/&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;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;head&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;别对一个页面既做301又设置canonical&lt;/strong&gt;。旧页面要做301跳转前，先把canonical标签删了，不然搜索引擎会收到矛盾信号，搞不清你到底想干嘛。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;301重定向链别太长&lt;/strong&gt;。A重定向到B，B又重定向到C，甚至还有D，每次跳转都会削弱权重传递。A直接到C最好。&lt;/p&gt;&lt;p&gt;Canonical只是建议，不是命令。搜索引擎可能会忽略，但一般都会尊重。&lt;/p&gt;&lt;p&gt;规范页面要自引用，canonical指向自己。&lt;/p&gt;&lt;section&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;canonical 检查点：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;每个页面只有一个canonical&lt;/li&gt;
&lt;li&gt;不指向404页面&lt;/li&gt;
&lt;li&gt;没有循环（A指向B，B指向A）&lt;/li&gt;
&lt;li&gt;HTTPS页面不指向HTTP&lt;/li&gt;
&lt;li&gt;用绝对地址&lt;/li&gt;
&lt;li&gt;所有重复内容都被覆盖了&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;301 测试检查：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;测试301重定向要测所有HTTP方法&lt;/strong&gt;，不只是GET&lt;/li&gt;
&lt;li&gt;验证返回状态码是”301 Moved Permanently”&lt;/li&gt;
&lt;li&gt;重定向链不超过2次跳转&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;p&gt;用301来永久搬家，用canonical来声明正版。&lt;/p&gt;&lt;p&gt;网站迁移时301是必须的、首要的操作，因为它直接影响用户访问和核心权重的传递。Canonical更多用于站内日常的SEO优化管理。&lt;/p&gt;&lt;p&gt;这么多年搞下来，我发现很多人把这两个东西混为一谈。其实它们解决的问题完全不一样：一个是处理URL变更，一个是处理重复内容。搞清楚这个，基本就不会再犯错。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>PVE更新CPU微码解决N5105虚拟机死机问题</title><link>https://blog.moewah.com/posts/5302/</link><guid isPermaLink="true">https://blog.moewah.com/posts/5302/</guid><description>N5105虚拟机频繁死机怎么办？本文详细讲解在Proxmox VE系统中更新Intel CPU微码至0x24000024的完整步骤，包括自动与手动更新方法，有效解决虚拟机崩溃问题。</description><pubDate>Mon, 03 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;N5105 的 VM 死机、重启问题一直备受用户抱怨，就在前不久畅网也放出了适用于 CPU 微码更新的 BIOS 固件来解决这类问题。除了更新使用官方的 BIOS 固件，宿主机系统为 PVE 的黑群晖用户也可以通过手动更新 CPU 微码的方式来修复解决，普遍认为更新 Intel 的 CPU 微码版本至 &lt;strong&gt;0x24000024&lt;/strong&gt; 可以解决。&lt;/p&gt;
&lt;p&gt;下面是 Proxmox VE 7.x 更新 CPU 微码的步骤，包括手动更新方法，具体操作步骤，如下：&lt;/p&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 更新&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt update&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 建议升级使用 6.2 内核&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt install pve-kernel-6.2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 下载并安装最新的微码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt install intel-microcode -y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 必须要重启&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;reboot&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;检查微码版本：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;要检查当前使用的微码版本是否是最新版本，您可以使用以下命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;dmesg | grep microcode&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;如果通过以上步骤无法获取到最新版本，则需要手动更新 CPU 微码。例如，对于Intel处理器，可以从 Intel 在 github 的 &lt;a href=&quot;https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files&quot; target=&quot;_blank&quot;&gt;Intel-Linux-Processor-Microcode-Data-Files&lt;/a&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 创建存放微码的目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir /lib/firmware/intel-ucode&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 下载数据文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files/archive/main.zip&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 解压文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;unzip main.zip&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 拷贝目录文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cp -r ./Intel-Linux-Processor-Microcode-Data-Files-main/intel-ucode/* /lib/firmware/intel-ucode/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 更新initramfs&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;update-initramfs -u&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 重启服务器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;reboot&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;重启后，重新运行 &lt;code&gt;dmesg | grep microcode&lt;/code&gt;​  命令确认 intel-microcode 版本，如果一切顺利的话，你的 Intel CPU 的固件将已经是最新的版本了。&lt;/p&gt;&lt;p&gt;‍&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Duplicacy CLI 快速入门与配置指南</title><link>https://blog.moewah.com/posts/5292/</link><guid isPermaLink="true">https://blog.moewah.com/posts/5292/</guid><description>如何使用Duplicacy CLI进行跨平台备份？本文详解Duplicacy的安装、初始化及云存储配置，支持S3、Google Cloud等主流平台，提供增量加密备份解决方案。</description><pubDate>Wed, 21 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Duplicacy 是一个用 Go 语言实现的，开源的，跨平台的备份工具。其 Cli 命令行版本对个人用户完全免费，Gui 网页版需要付费授权，支持 Amazon S3，Google Cloud Storage，Microsoft Azure，Dropbox 和 Backblaze 等云存储以及本地磁盘，SFTP 等，支持多个客户端备份到同一个云存储，支持增量备份，支持加密备份等功能特点。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Duplicacy.jpg&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;720&quot; src=&quot;/_astro/5292_3430712679_eb0ee6.BAOGo2WW_Z46MCe.webp&quot; srcset=&quot;/_astro/5292_3430712679_eb0ee6.BAOGo2WW_Z2ahdWx.webp 640w, /_astro/5292_3430712679_eb0ee6.BAOGo2WW_oyyUc.webp 750w, /_astro/5292_3430712679_eb0ee6.BAOGo2WW_ZAD1kE.webp 828w, /_astro/5292_3430712679_eb0ee6.BAOGo2WW_Z29H9qW.webp 1080w, /_astro/5292_3430712679_eb0ee6.BAOGo2WW_Z46MCe.webp 1280w&quot; /&gt;&lt;figcaption&gt;Duplicacy.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&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;Duplicacy Cli 执行文件可以在 &lt;a href=&quot;https://github.com/gilbertchen/duplicacy/releases&quot; target=&quot;_blank&quot;&gt;github release&lt;/a&gt; 获取。在使用 Duplicacy 命令行界面 (CLI) 之前，我们需要先进行安装。下面的安装步骤主要分为 Linux、macOS 和 Windows 三个部分。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;对于 Linux 用户&lt;a href=&quot;#对于-linux-用户&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;打开你的终端并输入以下命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://github.com/gilbertchen/duplicacy/releases/download/v2.1.2/duplicacy_linux_x64_2.1.2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod&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;duplicacy_linux_x64_2.1.2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mv&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;duplicacy_linux_x64_2.1.2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/usr/local/bin/duplicacy&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这些命令将会下载 Duplicacy 的二进制文件，为其添加可执行权限，并将其移动到 /usr/local/bin 目录，使得你可以在任何目录下直接运行 Duplicacy。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;对于 macOS 用户&lt;a href=&quot;#对于-macos-用户&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;打开你的终端并输入以下命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://github.com/gilbertchen/duplicacy/releases/download/v2.1.2/duplicacy_osx_x64_2.1.2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod&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;duplicacy_osx_x64_2.1.2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mv&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;duplicacy_osx_x64_2.1.2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/usr/local/bin/duplicacy&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;和 Linux 安装步骤类似，这些命令将下载 Duplicacy 的二进制文件，添加可执行权限，并将其移动到 /usr/local/bin 目录。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;对于 Windows 用户&lt;a href=&quot;#对于-windows-用户&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;打开 &lt;a href=&quot;https://github.com/gilbertchen/duplicacy/releases&quot; target=&quot;_blank&quot;&gt;Duplicacy 的发布页面&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;从最新发布的版本中下载名为 duplicacy_win_x64_*.exe 的文件。&lt;/li&gt;
&lt;li&gt;将下载的 .exe 文件复制到一个在你的 PATH 环境变量中的目录，例如 C:\Windows\System32。&lt;/li&gt;
&lt;li&gt;在命令提示符或 PowerShell 中，你可以通过输入 duplicacy 来运行程序。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;注意：请在下载时检查最新的版本号，并在下载链接中相应地替换。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;Duplicacy 使用名为 “存储库” 的目录来存储你的备份文件。要开始使用 Duplicacy，你首先需要切换到你希望备份的目录，并运行 init 命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;path/to/your/repository&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;duplicacy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mywork&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sftp://user@192.168.1.100/path/to/storage&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这个 init 命令将你的存储库与位于 192.168.1.100 的远程存储空间通过 SFTP 连接起来。这个过程可能会对你的远程存储空间进行初始化（创建所需的 duplicacy 配置文件和文件夹）。请注意，这个操作要求远程存储上的目标文件夹必须已经存在（Duplicacy 不会自动创建文件夹）。&lt;/p&gt;&lt;p&gt;在此过程中，你的存储库会被分配一个名为 mywork 的存储库 ID，这是一个在备份到同一存储空间的多个存储库中唯一标识此存储库的标识符。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;一旦你的存储库与远程存储空间连接，你就可以开始创建备份了。通过执行以下的 backup 命令来进行备份：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;duplicacy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;backup&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-stats&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;请注意，第一次备份可能需要一些时间，因为它会上传存储库中的所有文件。但是，后续的备份会更快，因为只有新的或被修改的文件会被上传。每个备份都由存储库 ID 和从 1 开始递增的修订号唯一标识。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;如果需要将存储库恢复到以前的状态，你可以使用 restore 命令。例如，要恢复到修订 1，你可以执行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;duplicacy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;restore&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-r&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;在某些情况下，你可能不希望直接在原始存储库上执行恢复操作，因为这可能会覆盖那些未备份的文件。或者，你可能想在另一台计算机上执行恢复操作。在这种情况下，Duplicacy 提供了很大的灵活性，允许你在任何位置创建新的存储库。只要新的存储库有相同的存储库 ID，Duplicacy 就会将其视为原始存储库的克隆：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;path/to/your/restore/dir&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;duplicacy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mywork&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sftp://user@192.168.1.100/path/to/storage&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;duplicacy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;restore&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-r&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;path/to/your/repository2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;duplicacy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mywork2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sftp://user@192.168.1.100/path/to/storage&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;duplicacy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;backup&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;请注意，在这个例子中，我们使用了新的存储库 ID mywork2，虽然存储地址仍然相同。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;Duplicacy 提供了一套命令来管理你的备份：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;list：列出所有备份&lt;/li&gt;
&lt;li&gt;check：检查备份的完整性&lt;/li&gt;
&lt;li&gt;diff：比较同一存储库的两个备份，或者比较两个备份中的同一文件&lt;/li&gt;
&lt;li&gt;cat：打印备份中的一个文件&lt;/li&gt;
&lt;li&gt;history：展示一个文件随时间变化的历史记录&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;以下是这些命令的使用方式：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;duplicacy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;list&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;duplicacy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;check&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;duplicacy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;diff&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;duplicacy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cat&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;duplicacy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;history&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;你可以使用 prune 命令按修订号、标签或保留策略删除备份：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;duplicacy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;prune&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-r&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;# 删除修订号为 1 的备份&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;duplicacy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;prune&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;quick&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 删除所有带 &apos;quick&apos; 标签的备份&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;duplicacy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;prune&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-keep&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1:7&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;# 对超过 7 天的备份，每天保留 1 个&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;duplicacy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;prune&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-keep&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;7:30&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;# 对超过 30 天的备份，每 7 天保留 1 个&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;duplicacy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;prune&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-keep&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0:180&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;# 删除超过 180 天的所有备份&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;请注意，第一次调用 prune 命令时，它会删除指定的备份，但保留所有未引用的数据块（称为化石）。由于它使用两步化石收集算法来清理数据块，你需要再次运行 prune 命令以从存储空间中删除这些化石：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;duplicacy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;prune&lt;/span&gt;&lt;span&gt;           &lt;/span&gt;&lt;span&gt;# 如果满足删除条件，将从存储中删除已删除备份的数据块&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;为了备份到多个存储空间，可以使用 add 命令添加新的存储。add 命令类似于 init 命令，只是第一个参数是用于区分不同存储的存储名称：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;duplicacy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;s3&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mywork&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;s3://amazon.com/mybucket/path/to/storage&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;你可以通过指定存储名称备份到任何存储：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;duplicacy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;backup&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-storage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;s3&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然而，如果存储库在两次备份操作之间发生了变化，那么以这种方式创建的备份在不同的存储上将会不同。一个更好的方法是使用 copy 命令，将指定的备份从一个存储复制到另一个存储：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;duplicacy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;copy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-r&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;-to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;s3&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;# 将修订 1 的备份复制到 s3 存储&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;duplicacy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;copy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;s3&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 将每个备份复制到 s3 存储&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;通过上述步骤，你应该已经掌握了如何使用 Duplicacy CLI 来备份和恢复你的数据。如果你需要进一步了解 Duplicacy 的更多功能和高级设置，可以查看 &lt;a href=&quot;https://duplicacy.com/&quot; target=&quot;_blank&quot;&gt;Duplicacy 的官方文档&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;如果你在使用过程中遇到任何问题，也可以在 Duplicacy 的&lt;a href=&quot;https://forum.duplicacy.com/&quot; target=&quot;_blank&quot;&gt;论坛&lt;/a&gt;上寻求帮助。记住，数据备份是保护你的数据不受损失的重要手段，所以始终保持定期备份的好习惯！&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Linux病毒扫描工具ClamAV配置使用教程</title><link>https://blog.moewah.com/posts/5296/</link><guid isPermaLink="true">https://blog.moewah.com/posts/5296/</guid><description>如何在Linux系统中安装和配置ClamAV进行病毒扫描？本文详细讲解ClamAV的安装、数据库更新及命令行使用方法，提供从基础配置到高级扫描技巧的完整解决方案，助你有效防御恶意软件。</description><pubDate>Wed, 21 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ClamAV 是一款开源的防病毒引擎，用于检测各类恶意软件。其特色是提供命令行扫描，定制病毒数据库更新，以及对新病毒的快速反应。适用于各种系统，包括Windows、Mac以及Linux等。本教程将指导你如何安装、配置和使用 ClamAV 的主要功能。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;clamAV.png&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;535&quot; src=&quot;/_astro/5296_1266166949_5e8a1a.V3QRouYN_15xE28.webp&quot; srcset=&quot;/_astro/5296_1266166949_5e8a1a.V3QRouYN_11M3zz.webp 640w, /_astro/5296_1266166949_5e8a1a.V3QRouYN_29slSN.webp 750w, /_astro/5296_1266166949_5e8a1a.V3QRouYN_14Bmcz.webp 828w, /_astro/5296_1266166949_5e8a1a.V3QRouYN_15xE28.webp 1024w&quot; /&gt;&lt;figcaption&gt;clamAV.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 安装&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;对于 Debian/Ubuntu 系统，使用以下命令安装：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo apt-get update&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo apt-get install clamav clamav-daemon&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;对于 CentOS/RHEL 系统，使用以下命令安装：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo yum install epel-release&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo yum install clamav clamav-update&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;2. 配置&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;完成安装后，必须更新 ClamAV 的病毒数据库。这将帮助 ClamAV 识别并抵御最新的威胁。可以使用以下命令进行更新：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo freshclam&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;3. 使用&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;以下是 ClamAV 关于 &lt;code&gt;clamscan&lt;/code&gt; 命令常见使用示例，更多用法请运行 &lt;code&gt;clamscan -help&lt;/code&gt; 查看帮助文件：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 扫描单个文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;clamscan /path/to/your/file&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 扫描整个目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;clamscan -r /path/to/directory&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 自动删除检测到的病毒&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;clamscan --remove -r /path/to/directory&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 为扫描结果生成报告&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;clamscan -r /path/to/directory &amp;gt; scanreport.txt&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 在扫描时显示病毒被发现的信息&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;clamscan -r --bell -i /path/to/directory&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;clamdscan&lt;/code&gt;是ClamAV防病毒服务器&lt;code&gt;clamd&lt;/code&gt;的客户端，用于与后台持续运行并加载病毒数据库的&lt;code&gt;clamd&lt;/code&gt;进行交互以执行病毒扫描，使得频繁或大规模的扫描任务更加高效。&lt;/p&gt;
&lt;p&gt;如果要使用 ClamAV 守护进程 &lt;code&gt;clamdscan&lt;/code&gt; 命令进行扫描，首先确保守护进程已启动：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo systemctl start clamav-daemon&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;接下来，使用 &lt;code&gt;clamdscan&lt;/code&gt; 命令执行扫描，例如：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;clamdscan /path/to/your/file&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;或&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;clamdscan -r /path/to/your/directory&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;多线程递归扫描目录文件，同时会传递文件描述符：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;clamdscan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--multiscan&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--fdpass&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/path/to/scan&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;最后&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;本文介绍了如何在多种主流 Linux 发行版上安装和配置 ClamAV，以及如何使用它的主要功能进行病毒扫描。希望你能够通过本教程快速掌握 ClamAV 的主要功能，并有效保护你的系统安全。&lt;/p&gt;</content:encoded></item><item><title>甲骨文Debian扩容引导卷无损调整分区</title><link>https://blog.moewah.com/posts/5226/</link><guid isPermaLink="true">https://blog.moewah.com/posts/5226/</guid><description>如何在不丢失数据的情况下扩容甲骨文ARM实例的Debian引导卷？本文详细演示从云端分配容量到本地调整分区大小的全流程，解决Mastodon存储空间不足问题，确保系统稳定运行。</description><pubDate>Thu, 01 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;早前，本喵在甲骨文薅了 2台 x86 + 1台 ARM的机器，默认分配的引导卷大小为 47 GB/台，而免费引导卷容量总量为 200 GB，也就是说还有59 GB可被使用。考虑到最近在  ARM 上部署的 Mastodon 像雪球一般越滚越大非常占用空间，在没有便宜的大盘鸡商家可以薅羊毛的情况下，还是决定扩容 ARM  引导卷好好利用剩余的免费额度，以解燃眉之急。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Oracle Cloud.png&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;477&quot; src=&quot;/_astro/5226_1511345459_b2ce86.DRpGeEYM_Z29wVxg.webp&quot; srcset=&quot;/_astro/5226_1511345459_b2ce86.DRpGeEYM_Z1hsyBe.webp 640w, /_astro/5226_1511345459_b2ce86.DRpGeEYM_Z22lUyr.webp 750w, /_astro/5226_1511345459_b2ce86.DRpGeEYM_vNHYK.webp 828w, /_astro/5226_1511345459_b2ce86.DRpGeEYM_Z29wVxg.webp 1024w&quot; /&gt;&lt;figcaption&gt;Oracle Cloud.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&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;figure&gt;&lt;img alt=&quot;01.jpg&quot; loading=&quot;lazy&quot; width=&quot;1322&quot; height=&quot;568&quot; src=&quot;/_astro/5226_989742394_36fd7d.BEsUKNXS_Z1CtGOS.webp&quot; srcset=&quot;/_astro/5226_989742394_36fd7d.BEsUKNXS_Z2nLpCs.webp 640w, /_astro/5226_989742394_36fd7d.BEsUKNXS_11ilIr.webp 750w, /_astro/5226_989742394_36fd7d.BEsUKNXS_1frvxO.webp 828w, /_astro/5226_989742394_36fd7d.BEsUKNXS_28sXWF.webp 1080w, /_astro/5226_989742394_36fd7d.BEsUKNXS_Z2eF0IL.webp 1280w, /_astro/5226_989742394_36fd7d.BEsUKNXS_Z1CtGOS.webp 1322w&quot; /&gt;&lt;figcaption&gt;01.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;在实例列表中找到待扩容的ARM实例，并点击查看实例详细信息&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;02.jpg&quot; loading=&quot;lazy&quot; width=&quot;1278&quot; height=&quot;479&quot; src=&quot;/_astro/5226_3255353276_1988c8.CJj_2DYG_Zbewst.webp&quot; srcset=&quot;/_astro/5226_3255353276_1988c8.CJj_2DYG_1p1aX0.webp 640w, /_astro/5226_3255353276_1988c8.CJj_2DYG_1kolAt.webp 750w, /_astro/5226_3255353276_1988c8.CJj_2DYG_Z16v9qz.webp 828w, /_astro/5226_3255353276_1988c8.CJj_2DYG_ZLBtOb.webp 1080w, /_astro/5226_3255353276_1988c8.CJj_2DYG_Zbewst.webp 1278w&quot; /&gt;&lt;figcaption&gt;02.jpg&lt;/figcaption&gt;&lt;/figure&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;figure&gt;&lt;img alt=&quot;03.jpg&quot; loading=&quot;lazy&quot; width=&quot;1291&quot; height=&quot;261&quot; src=&quot;/_astro/5226_652308678_941878.BCKjP7Fo_Z1lLF4Y.webp&quot; srcset=&quot;/_astro/5226_652308678_941878.BCKjP7Fo_15vJKa.webp 640w, /_astro/5226_652308678_941878.BCKjP7Fo_Z1ifMkW.webp 750w, /_astro/5226_652308678_941878.BCKjP7Fo_kihdo.webp 828w, /_astro/5226_652308678_941878.BCKjP7Fo_26LLKI.webp 1080w, /_astro/5226_652308678_941878.BCKjP7Fo_Z220hdp.webp 1280w, /_astro/5226_652308678_941878.BCKjP7Fo_Z1lLF4Y.webp 1291w&quot; /&gt;&lt;figcaption&gt;03.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;点击 &lt;strong&gt;编辑&lt;/strong&gt; ，卷大小 (GB) 输入 100&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;04.jpg&quot; loading=&quot;lazy&quot; width=&quot;1287&quot; height=&quot;564&quot; src=&quot;/_astro/5226_2518465705_4703aa.RZKVpm0S_Z2nWN2s.webp&quot; srcset=&quot;/_astro/5226_2518465705_4703aa.RZKVpm0S_1SXPPL.webp 640w, /_astro/5226_2518465705_4703aa.RZKVpm0S_v04Sa.webp 750w, /_astro/5226_2518465705_4703aa.RZKVpm0S_Z1daBH7.webp 828w, /_astro/5226_2518465705_4703aa.RZKVpm0S_2anQ3w.webp 1080w, /_astro/5226_2518465705_4703aa.RZKVpm0S_255QTd.webp 1280w, /_astro/5226_2518465705_4703aa.RZKVpm0S_Z2nWN2s.webp 1287w&quot; /&gt;&lt;figcaption&gt;04.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;保存更改后，默认会弹出提示窗口。（本喵dd Debian 系统，因此官方的帮助信息对我毫无用处，这里直接点关闭！！)&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;05.jpg&quot; loading=&quot;lazy&quot; width=&quot;1126&quot; height=&quot;422&quot; src=&quot;/_astro/5226_1828601469_a5e314.B5nBpUVw_Z1lOC1C.webp&quot; srcset=&quot;/_astro/5226_1828601469_a5e314.B5nBpUVw_Z1Narhx.webp 640w, /_astro/5226_1828601469_a5e314.B5nBpUVw_Z1RMgE4.webp 750w, /_astro/5226_1828601469_a5e314.B5nBpUVw_Kum7O.webp 828w, /_astro/5226_1828601469_a5e314.B5nBpUVw_1drWDJ.webp 1080w, /_astro/5226_1828601469_a5e314.B5nBpUVw_Z1lOC1C.webp 1126w&quot; /&gt;&lt;figcaption&gt;05.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;需要重启一下实例，才能被系统识别。（接下来的内容需要在 SSH 终端完成 ↓↓↓）&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;步骤二：调整 Debian 分区大小&lt;a href=&quot;#步骤二调整-debian-分区大小&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;root@Miao:~# df -h&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Filesystem      Size  Used Avail Use% Mounted on&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;udev             12G     0   12G   0% /dev&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tmpfs           2.4G   17M  2.4G   1% /run&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/dev/sda2        45G   12G   30G  29% /&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tmpfs            12G     0   12G   0% /dev/shm&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tmpfs           5.0M     0  5.0M   0% /run/lock&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tmpfs            12G     0   12G   0% /sys/fs/cgroup&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/dev/sda1       512M  5.9M  506M   2% /boot/efi&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;overlay          45G   12G   30G  29% /var/lib/docker/overlay2/33d3828f5992089ba173d758b0b0539695b4d2906ae5d4fa6e570712c5375d83/merged&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tmpfs           2.4G     0  2.4G   0% /run/user/0&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;查看硬盘信息，记下第2分区&lt;code&gt;/dev/sda2&lt;/code&gt; 开始的磁柱号这里是&lt;code&gt;1050624&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;root@Miao:~# fdisk -l /dev/sda&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;GPT PMBR size mismatch (97677311 != 209715199) will be corrected by write.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;The backup GPT table is not on the end of the device. This problem will be corrected by write.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Disk /dev/sda: 100 GiB, 107374182400 bytes, 209715200 sectors&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Disk model: BlockVolume&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Units: sectors of 1 * 512 = 512 bytes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Sector size (logical/physical): 512 bytes / 4096 bytes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;I/O size (minimum/optimal): 4096 bytes / 1048576 bytes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Disklabel type: gpt&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Disk identifier: 123CBC0C-456F-7890-9D45-90C1234F123&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Device        Start      End  Sectors  Size Type&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/dev/sda1      2048  1050623  1048576  512M EFI System&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/dev/sda2   1050624 95676415 94625792 45.1G Linux filesystem&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/dev/sda3  95676416 97675263  1998848  976M Linux swap&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;屏幕打印信息显示，100 G 硬盘已生效，但剩余容量并没有分配到分区中，结合硬盘使用情况，我们需要扩展剩余容量给 &lt;code&gt;/dev/sda2&lt;/code&gt; 以达到扩容需求。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;修改分区大小&lt;a href=&quot;#修改分区大小&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;1、先删除分区&lt;a href=&quot;#1先删除分区&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;顺序：先删除第3分区，接着删除第2分区&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;root@Miao:~# fdisk /dev/sda&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Command (m for help): d （删除分区）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Partition number (1-3, default 3): 3 （删除第3分区也就是虚拟内存）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Partition 3 has been deleted.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Command (m for help): d （继续删除分区）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Partition number (1,2, default 2): 2 （删除第2分区也就是主分区）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Partition 2 has been deleted.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Command (m for help): w （分区写入硬盘）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;The partition table has been altered.&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;2、重新建立分区&lt;a href=&quot;#2重新建立分区&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;先建立第2分区也就是主分区&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;root@Miao:~# fdisk /dev/sda&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Command (m for help): n （新建分区）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Partition number (2-128, default 2): 2 （创建第2分区）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;First sector (1050624-209715166, default 1050624): （确保第2分区开始的磁柱号与原来保持一致否则会导致数据丢失，这里默认为1050624 是一致，回车键确认）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Last sector, +/-sectors or +/-size{K,M,G,T,P} (1050624-209715166, default 209715166): +96G （输入分配的容量，主分区我给96G）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Created a new partition 2 of type &apos;Linux filesystem&apos; and of size 96 GiB.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Partition #2 contains a ext4 signature.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Do you want to remove the signature? [Y]es/[N]o: N （不要格式化，不要格式化，不要格式化）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Command (m for help): w （分区写入硬盘）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;The partition table has been altered.&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;然后把剩余容量用来建立第3分区也就是 swap 分区&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;root@Miao:~# fdisk /dev/sda&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Command (m for help): n （创建分区）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Partition number (3-128, default 3): 3 （创建第3分区）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;First sector (202377216-209715166, default 202377216): （回车）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Last sector, +/-sectors or +/-size{K,M,G,T,P} (202377216-209715166, default 209715166): （回车）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Created a new partition 3 of type &apos;Linux filesystem&apos; and of size 3.5 GiB.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Command (m for help): t （修改分区类型）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Partition number (1-3, default 3): 3 （修改第3分区）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Partition type (type L to list all types): L （输入L列出所有分区类型，输入Q退出列表）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;1 EFI System                     C12A7328-F81F-11D2-BA4B-00A0C93EC93B&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;2 MBR partition scheme           024DEE41-33E7-11D3-9D69-0008C781F39F&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;3 Intel Fast Flash               D3BFE2DE-3DAF-11DF-BA40-E3A556D89593&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;4 BIOS boot                      21686148-6449-6E6F-744E-656564454649&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;5 Sony boot partition            F4019732-066E-4E12-8273-346C5641494F&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;6 Lenovo boot partition          BFBFAFE7-A34F-448A-9A5B-6213EB736C22&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;7 PowerPC PReP boot              9E1A2D38-C612-4316-AA26-8B49521E5A8B&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;8 ONIE boot                      7412F7D5-A156-4B13-81DC-867174929325&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;9 ONIE config                    D4E6E2CD-4469-46F3-B5CB-1BFF57AFC149&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;10 Microsoft reserved             E3C9E316-0B5C-4DB8-817D-F92DF00215AE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;11 Microsoft basic data           EBD0A0A2-B9E5-4433-87C0-68B6B72699C7&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;12 Microsoft LDM metadata         5808C8AA-7E8F-42E0-85D2-E1E90434CFB3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;13 Microsoft LDM data             AF9B60A0-1431-4F62-BC68-3311714A69AD&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;14 Windows recovery environment   DE94BBA4-06D1-4D40-A16A-BFD50179D6AC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;15 IBM General Parallel Fs        37AFFC90-EF7D-4E96-91C3-2D7AE055B174&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;16 Microsoft Storage Spaces       E75CAF8F-F680-4CEE-AFA3-B001E56EFC2D&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;17 HP-UX data                     75894C1E-3AEB-11D3-B7C1-7B03A0000000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;18 HP-UX service                  E2A1E728-32E3-11D6-A682-7B03A0000000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;19 Linux swap                     0657FD6D-A4AB-43C4-84E5-0933C84B4F4F&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Partition type (type L to list all types): 19 （列表显示 swap 分区类型的编号为19，输入19即可）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Changed type of partition &apos;Linux filesystem&apos; to &apos;Linux swap&apos;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Command (m for help): w （分区写入硬盘）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;The partition table has been altered.&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;3、启用 swap 分区&lt;a href=&quot;#3启用-swap-分区&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;格式化 swap 分区（记下swap的UUID，一会儿要用）&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;root@Miao:~# mkswap /dev/sda3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Setting up swapspace version 1, size = 3.5 GiB (3757023232 bytes)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;no label, UUID=456b6e71-7cfc-6c13-bcc0-c1b4110613e9&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;启用 swap 分区&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;swapon /dev/sda3&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;使用 &lt;code&gt;vim&lt;/code&gt; 或&lt;code&gt;nano&lt;/code&gt; 修改硬盘挂载文件（将挂载的 swap 分区 UUID 替换为新生成的 UUID）&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nano /etc/fstab&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;保存修改，重启系统&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;reboot&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;4、resize2fs 调整文件系统大小&lt;a href=&quot;#4resize2fs-调整文件系统大小&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;resize2fs /dev/sda2&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;最后，查看磁盘使用情况：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;root@Miao:~# df -h&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Filesystem      Size  Used Avail Use% Mounted on&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;udev             12G     0   12G   0% /dev&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tmpfs           2.4G  8.9M  2.4G   1% /run&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/dev/sda2        95G   12G   78G  14% /&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tmpfs            12G     0   12G   0% /dev/shm&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tmpfs           5.0M     0  5.0M   0% /run/lock&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tmpfs            12G     0   12G   0% /sys/fs/cgroup&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/dev/sda1       512M  5.9M  506M   2% /boot/efi&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;overlay          95G   12G   78G  14% /var/lib/docker/overlay2/33d3828f5992089ba173d758b0b0539695b4d2906ae5d4fa6e570712c5375d83/merged&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tmpfs           2.4G     0  2.4G   0% /run/user/0&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;All Done. 扩容完成！&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>群晖部署ZeroSSL泛域名证书实战指南</title><link>https://blog.moewah.com/posts/5199/</link><guid isPermaLink="true">https://blog.moewah.com/posts/5199/</guid><description>如何在群晖NAS上自动签发泛域名证书？本文详解使用ZeroSSL替代Let&apos;s Encrypt的部署流程，涵盖SSH配置、脚本克隆与DNS API集成，解决证书自动化管理难题。</description><pubDate>Wed, 02 Nov 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;考虑到 ZeroSSL 对比 Let’s Encrypt 有更好兼容性，且接口不存在使用频率的限制。因此本脚本默认使用 ZeroSSL 作为证书签发服务器。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;ZeroSSL.jpg&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;505&quot; src=&quot;/_astro/5199_2502383466_a2b32d.DOzHHZGN_GzrH9.webp&quot; srcset=&quot;/_astro/5199_2502383466_a2b32d.DOzHHZGN_2mXJ9K.webp 640w, /_astro/5199_2502383466_a2b32d.DOzHHZGN_olfrk.webp 750w, /_astro/5199_2502383466_a2b32d.DOzHHZGN_Z1Vzx1e.webp 828w, /_astro/5199_2502383466_a2b32d.DOzHHZGN_GzrH9.webp 1024w&quot; /&gt;&lt;figcaption&gt;ZeroSSL.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;部署教程&lt;a href=&quot;#部署教程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1、启用 SSH 服务&lt;a href=&quot;#1启用-ssh-服务&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;进入 DSM &lt;strong&gt;控制面板&lt;/strong&gt; &amp;gt; &lt;strong&gt;终端机和 SNMP&lt;/strong&gt; &amp;gt; &lt;strong&gt;终端机&lt;/strong&gt;，勾选启用 SSH 服务。指定 SSH 连接的端口号并保存设置。为了确保系统安全性，建议将默认端口 &lt;code&gt;22&lt;/code&gt; 替换为其他端口号。更多详见&lt;a href=&quot;https://blog.moewah.com/posts/1048/&quot;&gt;《群晖Synology如何获取root权限？》&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&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;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 切换为root用户&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo -i&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 进入目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd /volume1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# DSM 6.x 系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git clone https://github.com/hugoyue/syno-acme.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# DSM 7.x 系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git clone -b dsm7 https://github.com/hugoyue/syno-acme.git&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;blockquote&gt;&lt;p&gt;建议先在 ZeroSSL 官方网站：&lt;a href=&quot;https://zerossl.com/&quot; target=&quot;_blank&quot;&gt;https://zerossl.com/&lt;/a&gt; 使用邮箱注册账号，然后使用同一个邮箱账号配置 config 变量中的 &lt;code&gt;ZeroSSL_Email&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;使用 &lt;code&gt;vim&lt;/code&gt; 或 &lt;code&gt;nano&lt;/code&gt; 命令修改 &lt;code&gt;config&lt;/code&gt; 配置文件&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vim /volume1/syno-acme/config&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;根据注释信息，进行修改：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 你主域名，如 baidu.com sina.com.cn 等&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export DOMAIN=your_domain&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# DNS类型，根据域名服务商而定，例如阿里云对应（dns_ali），Dnspod 对应（dns_dp）等&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export DNS=dns_xxx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# DNS API 生效等待时间 值(单位：秒)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 某些域名服务商的API生效时间较大，需要将这个值加大(比如900)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export DNS_SLEEP=600&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 设置证书签发服务器 zerossl 或 letsencrypt&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export SERVER_NAME=&quot;zerossl&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 填写用于注册 ZeroSSL 账号的邮箱&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export ZeroSSL_Email=email@example.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 填写 dns_ali 对应阿里云域名服务商提供的授权密钥&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export Ali_Key=&quot;LTqIA87hOKdjevsf5&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export Ali_Secret=&quot;0p5EYueFNq501xnCPzKNbx6K51qPH2&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 填写 DNS=dns_dp 对应 DNS 域名平台提供的授权密钥&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export DP_Id=&quot;1234&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export DP_Key=&quot;sADDsdasdgdsf&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 若需要开启bark通知，请取消 # 注释符，并替换 BARK_API_URL&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#export BARK_API_URL=&quot;https://api.day.app/XXXXXXXXXXXXXXXXXXXXXX&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#export BARK_SOUND=&quot;newmail&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#export BARK_GROUP=ACME&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;其它域名服务商，可以参照 &lt;a href=&quot;https://github.com/acmesh-official/acme.sh/tree/master/dnsapi&quot; target=&quot;_blank&quot;&gt;https://github.com/acmesh-official/acme.sh/tree/master/dnsapi&lt;/a&gt; 来添加自己的配置。一般情况下，这个页面每个文件对应一个域名服务商，比如&lt;code&gt;dns_ali.sh&lt;/code&gt;对应阿里云，文件名去掉&lt;code&gt;.sh&lt;/code&gt;扩展名就是DNS类型，比如阿里云的DNS类型就是&lt;code&gt;dns_ali&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;&lt;section&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;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 赋予执行权限&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod +x /volume1/syno-acme/cert-up.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 生成证书/更新证书&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/volume1/syno-acme/cert-up.sh update &amp;gt;&amp;gt; /volume1/syno-acme/log.txt 2&amp;gt;&amp;amp;1&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;免费的 ZeroSSL 证书有效期只有三个月，这里我们配置一条定时任务，使其保持在每月1日1时整，执行一次更新&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 编辑 crontab 文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vim /etc/crontab&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 增加一条任务计划，保存并退出&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;0 1 1 * * root /volume1/syno-acme/cert-up.sh update &amp;gt;&amp;gt; /volume1/syno-acme/log.txt 2&amp;gt;&amp;amp;1&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;重启 CRON 服务，使其生效。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# DSM 6.x 系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;synoservice --restart crond&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# DSM 7.x 系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;synosystemctl restart crond&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;日常维护&lt;a href=&quot;#日常维护&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;code&gt;/volume1/syno-acme/backup&lt;/code&gt; 下，存储在以时间日期命名的文件夹内，例如 &lt;code&gt;20221023030003&lt;/code&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 回滚到最近的一次备份&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/volume1/syno-acme/cert-up.sh revert&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 回滚到指定日期、时间的备份，例如 20221023030003&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/volume1/syno-acme/cert-up.sh revert 20221023030003&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;查看最近 1000 条日志记录，寻找问题根源。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tail -n 1000 /volume1/syno-acme/log.txt&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;section&gt;&lt;h4&gt;3.1）问题一&lt;a href=&quot;#31问题一&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;若证书服务器使用的是 zerossl，在进行 DNS 验证过程时出现提示信息 &lt;code&gt;Processing, The CA is processing your order, please just wait.&lt;/code&gt; 无法完成验证，请修改 &lt;code&gt;config&lt;/code&gt; 文件，将：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export SERVER_NAME=&quot;zerossl&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;修改为:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export SERVER_NAME=&quot;letsencrypt&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后，重新执行 &lt;strong&gt;生成证书/更新证书&lt;/strong&gt; 的相关命令。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;3.2）问题二&lt;a href=&quot;#32问题二&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;若证书服务器使用的是 letsencrypt，如果出现 &lt;code&gt;code:60&lt;/code&gt; 错误，无法建立SSL连接，请升级群辉内置CA机构根证书，请以 root 用户执行以下命令:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 备份根证书&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mv /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt.bak&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 更新根证书&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl -Lko /etc/ssl/certs/ca-certificates.crt https://curl.se/ca/cacert.pem&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;3.3）问题三&lt;a href=&quot;#33问题三&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;兼容性相关问题可通过 &lt;code&gt;https://ssl-config.mozilla.org/&lt;/code&gt; 在线工具，依据服务器环境生成 SSL 配置文件来获得更好的证书兼容性。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>群晖部署Bitwarden密码管理器全攻略</title><link>https://blog.moewah.com/posts/5218/</link><guid isPermaLink="true">https://blog.moewah.com/posts/5218/</guid><description>如何在群晖NAS上私有化部署Bitwarden密码管理器？本文详解Vaultwarden安装步骤、Docker配置及HTTPS反向代理，实现个人密码安全托管与自动同步。</description><pubDate>Wed, 02 Nov 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Bitwarden 是一款开源的密码管理器，其功能主要有账号密码管理、自动生成密码、导出所有密码、密码自动填充、方便切换多个账号等。而 Vaultwarden 是一个使用 Rust 编写的非官方 Bitwarden 服务器实现，它与官方 Bitwarden 客户端兼容，且支持更多的系统平台和架构。本文介绍如何在群晖 Synology DSM 上部署安装 Bitwarden 密码管理器，将重要的个人密码托管在自己的服务器上。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;bitwarden.png&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;575&quot; src=&quot;/_astro/5218_56586671_d42d4f.CRJ2Es2j_Z2jPatT.webp&quot; srcset=&quot;/_astro/5218_56586671_d42d4f.CRJ2Es2j_Z1i98gV.webp 640w, /_astro/5218_56586671_d42d4f.CRJ2Es2j_1VLj8P.webp 750w, /_astro/5218_56586671_d42d4f.CRJ2Es2j_29SiFH.webp 828w, /_astro/5218_56586671_d42d4f.CRJ2Es2j_Z2jPatT.webp 1024w&quot; /&gt;&lt;figcaption&gt;bitwarden.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&gt;&lt;h3&gt;启用 SSH 服务&lt;a href=&quot;#启用-ssh-服务&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;进入 DSM &lt;strong&gt;控制面板&lt;/strong&gt; &amp;gt; &lt;strong&gt;终端机和 SNMP&lt;/strong&gt; &amp;gt; &lt;strong&gt;终端机&lt;/strong&gt;，勾选启用 SSH 服务。指定 SSH 连接的端口号并保存设置。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 切换至 root 用户&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 创建目录，用于存放 vaultwarden 数据&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir -p /volume1/docker/vw-data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 下载 docker 最新镜像&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker pull vaultwarden/server:latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 创建并运行容器（完整命令）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker run -d --name bitwarden \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-v /volume1/docker/vw-data:/data/ \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-p 8080:80 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-p 3012:3012 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-e SIGNUPS_ALLOWED=false \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-e WEBSOCKET_ENABLED=true \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-e INVITATIONS_ALLOWED=false \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-e ADMIN_TOKEN=随机字符串 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-e DOMAIN=https://yourdomain.com:7878 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--restart=always \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vaultwarden/server:latest&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&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;-e SIGNUPS_ALLOWED=false&lt;/code&gt;，禁止注册。&lt;/li&gt;
&lt;li&gt;如需开放注册、配置SMTP邮箱发信等，需要在 &lt;code&gt;/admin&lt;/code&gt; 管理页面内进行设置，而启用 admin 管理页面，需要配置变量 &lt;code&gt;-e ADMIN_TOKEN=随机字符串&lt;/code&gt;（随机字符串可通过运行 &lt;code&gt;openssl rand -base64 16&lt;/code&gt; 命令生成一个）。访问 &lt;code&gt;/admin&lt;/code&gt; 进入管理页面需要输入已定义的字符串才能进入。&lt;/li&gt;
&lt;li&gt;配置变量&lt;code&gt;-e WEBSOCKET_ENABLED=true&lt;/code&gt;以启用 WebSocket 连接，保持服务端与客户端实时同步。&lt;/li&gt;
&lt;li&gt;配置变量&lt;code&gt;-e DOMAIN=你的域名:端口&lt;/code&gt;，懂得都懂 &lt;code&gt;443&lt;/code&gt; 和 &lt;code&gt;80&lt;/code&gt; 端口被禁用。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;更多参数配置，请访问 —&amp;gt; &lt;a href=&quot;https://github.com/dani-garcia/vaultwarden/wiki&quot; target=&quot;_blank&quot;&gt;官方WIKI&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;部署SSL证书&lt;a href=&quot;#部署ssl证书&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;详细教程，请参考&lt;a href=&quot;https://blog.moewah.com/posts/5199/&quot;&gt;《群晖 Synology 部署 ZeroSSL 泛域名证书》&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;反向代理/启用HTTPS&lt;a href=&quot;#反向代理启用https&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;创建 Nginx 配置文件&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 进入目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd /etc/nginx/sites-enabled&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 编辑文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vim bitwarden.server.conf&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Nginx 示例配置：&lt;/strong&gt;
更多反代相关配置，请参考-&amp;gt;&lt;a href=&quot;https://github.com/dani-garcia/vaultwarden/wiki/Proxy-examples&quot; target=&quot;_blank&quot;&gt;官方文档&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen 7878 default; #禁止通过IP访问&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name _;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return 403;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 可替换为其它可用端口，前提是已做好端口映射和防火墙开放行&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen 7878 ssl http2;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 替换为自己的域名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name yourdomain.com;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_certificate /usr/syno/etc/certificate/system/default/fullchain.pem;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_certificate_key /usr/syno/etc/certificate/system/default/privkey.pem;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_protocols TLSv1.2 TLSv1.3;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_ciphers &apos;TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:SSLCipherSuiteECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256;&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;add_header Strict-Transport-Security &quot;max-age=63072000; includeSubdomains; preload&quot;; #开启HSTS&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 非443端口强制跳转https，注意不可有其他跳转&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;error_page 497 301 =307 https://$host:$server_port$request_uri;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 反向代理&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;location / {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_http_version 1.1;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header Upgrade $http_upgrade;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header Connection $connection_upgrade;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header Host $host;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header X-Real-IP $remote_addr;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header X-Forwarded-Proto $scheme;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_pass http://127.0.0.1:8080;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;location /admin {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_http_version 1.1;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header Upgrade $http_upgrade;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header Connection $connection_upgrade;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header Host $host;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header X-Real-IP $remote_addr;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header X-Forwarded-Proto $scheme;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_pass http://127.0.0.1:8080;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;重载 Nginx 服务&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# DSM 6.x 系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;synoservice --reload nginx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# DSM 7.x 系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl reload nginx&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;首次使用 Bitwarden 需要创建账号，浏览器访问 &lt;code&gt;https://域名.com:端口/admin&lt;/code&gt;，输入预先配置的 &lt;code&gt;ADMIN_TOKEN&lt;/code&gt; 值，进入管理页面，优先配置 SMTP 邮箱发信后，重新回到首页通过创建账号进行登录。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>自建临时文件分享平台完整部署指南</title><link>https://blog.moewah.com/posts/5160/</link><guid isPermaLink="true">https://blog.moewah.com/posts/5160/</guid><description>如何快速搭建一个安全可靠的临时文件分享系统？本文详解基于Docker的Send项目部署流程，包含Redis配置、反向代理设置及域名绑定方案，助你实现私有化文件共享。</description><pubDate>Tue, 25 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt; 说起临时文件分享工具，不得不提 Mozilla Firefox Send，它是一款基于Web网页的、开源、跨平台、无需登录、可免费使用的在线文件托管与共享服务，体验非常优雅。但因为此前遭到一些用户滥用，被用来发送恶意软件并进行钓鱼攻击，导致 Mozilla 毅然决然停止了相关开发，但不代表 Send 真正的死去，GitHub 社区用户 timvisee 开启新的分支，增加了一系列新功能，继续保持着项目的更新和活力。项目地址 - &amp;gt; &lt;a href=&quot;https://github.com/timvisee/send&quot; target=&quot;_blank&quot;&gt;Github - Send&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;firefox-send.jpg&quot; loading=&quot;lazy&quot; width=&quot;1196&quot; height=&quot;595&quot; src=&quot;/_astro/5160_2275735952_fb445d.DEIbd90c_2efo4K.webp&quot; srcset=&quot;/_astro/5160_2275735952_fb445d.DEIbd90c_2oohLx.webp 640w, /_astro/5160_2275735952_fb445d.DEIbd90c_ZKgK3H.webp 750w, /_astro/5160_2275735952_fb445d.DEIbd90c_25exek.webp 828w, /_astro/5160_2275735952_fb445d.DEIbd90c_Z88mn0.webp 1080w, /_astro/5160_2275735952_fb445d.DEIbd90c_2efo4K.webp 1196w&quot; /&gt;&lt;figcaption&gt;firefox-send.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;Docker 部署教程&lt;a href=&quot;#docker-部署教程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;1、安装 Docker&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装 docker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-sSL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://get.docker.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;sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 启动 docker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 设置为开机启动&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;enable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;2、使用 Docker 创建一个网络，以允许容器与容器间相互通信&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;network&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;timviseesend&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;3、创建、运行一个端口为 6379、密码为空的 REDIS 容器。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&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;--net=timviseesend&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--name=docker-redis&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;6379:6379&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;$PWD&lt;/span&gt;&lt;span&gt;/redis:/data&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;redis&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;redis-server&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--appendonly&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yes&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;4、请在合适的目录下运行下面命令，创建、运行 SEND 容器&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--net=timviseesend&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$PWD&lt;/span&gt;&lt;span&gt;/uploads:/uploads&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1443:1443&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&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;&apos;&lt;/span&gt;&lt;span&gt;FILE_DIR=/uploads&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&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;&apos;&lt;/span&gt;&lt;span&gt;BASE_URL=http://www.yourdomain.com&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--restart=always&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;gowah/send:latest&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&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;$PWD&lt;/code&gt; 即当前路径下创建 &lt;code&gt;uploads&lt;/code&gt; 目录用于存储上传文件；&lt;/li&gt;
&lt;li&gt;默认端口为 1443 端口，即&lt;code&gt;-p 1443:1443&lt;/code&gt;。变更端口，例如变更 1443 端口为7080 端口，则修改为 &lt;code&gt;-p 7080:1443&lt;/code&gt; ，请确保防火墙已开放相关端口。&lt;/li&gt;
&lt;li&gt;请替换变量环境中的 &lt;code&gt;BASE_URL&lt;/code&gt; ，将 &lt;code&gt;www.yourdomain.com&lt;/code&gt;替换为你自己的域名。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;更多配置选项，请查看 -&amp;gt; &lt;a href=&quot;https://github.com/timvisee/send/blob/master/docs/docker.md&quot; target=&quot;_blank&quot;&gt;官方文档&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&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;关于 Nginx 反向代理，这里就大概发个反代配置，添加到 nginx 配置文件。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;...此处省略...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;#在 nginx 配置文件里添加&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;location / {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_pass http://127.0.0.1:1443;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header X-Real-IP $remote_addr;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header Host $host;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;location /api/ws {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_redirect off;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_pass http://0.0.0.0:1443;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_http_version 1.1;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header Upgrade $http_upgrade;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header Connection &quot;upgrade&quot;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header Host $http_host;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;...此处省略...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;重新启动一下 nginx ，打开浏览器输入 &lt;code&gt;http://www.yourdomain.com&lt;/code&gt; 访问。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;SEND.jpg&quot; loading=&quot;lazy&quot; width=&quot;1359&quot; height=&quot;639&quot; src=&quot;/_astro/5160_437416084_ad8108.CghSUM8H_TaI2e.webp&quot; srcset=&quot;/_astro/5160_437416084_ad8108.CghSUM8H_Z2bhhLF.webp 640w, /_astro/5160_437416084_ad8108.CghSUM8H_ZGPGd6.webp 750w, /_astro/5160_437416084_ad8108.CghSUM8H_Zqp94n.webp 828w, /_astro/5160_437416084_ad8108.CghSUM8H_Z1UfokT.webp 1080w, /_astro/5160_437416084_ad8108.CghSUM8H_Z2aNqwV.webp 1280w, /_astro/5160_437416084_ad8108.CghSUM8H_TaI2e.webp 1359w&quot; /&gt;&lt;figcaption&gt;SEND.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;关于启用https 协议相关的内容，请移步 -&amp;gt; &lt;a href=&quot;https://blog.moewah.com/posts/164/&quot;&gt;《免费申请Let’s Encrypt泛域名SSl证书》&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>DIUN：Docker镜像更新通知神器</title><link>https://blog.moewah.com/posts/5151/</link><guid isPermaLink="true">https://blog.moewah.com/posts/5151/</guid><description>如何监控Docker镜像更新而不自动升级？DIUN是一款专注通知的轻量级工具，帮助你主动查看镜像变更日志，避免盲目更新导致容器异常，确保系统稳定运行。</description><pubDate>Mon, 24 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt; DIUN，是一款基于 Go 编写的 CLI 应用程序，DIUN (Docker Image Update Notifier)，字面意思：Docker 镜像更新通知器。DIUN 与 &lt;a href=&quot;https://blog.moewah.com/posts/3863/&quot;&gt;WatchTower&lt;/a&gt; 的区别在于 DIUN 专注于监控 Docker 注册表中镜像更新的通知功能，而 WatchTower 监控镜像的更新，同时支持自动更新镜像和容器。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Docker-Image-Update-Notifier.png&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;628&quot; src=&quot;/_astro/5151_3628616939_766a9e.DANbidaZ_2jRA2T.webp&quot; srcset=&quot;/_astro/5151_3628616939_766a9e.DANbidaZ_2w0Fag.webp 640w, /_astro/5151_3628616939_766a9e.DANbidaZ_Z1qvakr.webp 750w, /_astro/5151_3628616939_766a9e.DANbidaZ_ZxFvwx.webp 828w, /_astro/5151_3628616939_766a9e.DANbidaZ_Z1mvBM.webp 1080w, /_astro/5151_3628616939_766a9e.DANbidaZ_2jRA2T.webp 1200w&quot; /&gt;&lt;figcaption&gt;Docker-Image-Update-Notifier.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;当一些项目包含 Dockerfile 文件被修改或项目被重构时，盲目使用 WatchTower 进行自动更新可能会导致容器无法正常使用。DIUN 只通知不更新，便于我们主动查看项目的更新日志了解项目更改内容，确认是否有必要做一些修改及调整，以确保在我们更新容器后它能正常被使用。&lt;/p&gt;
&lt;p&gt;项目地址: &lt;a href=&quot;https://github.com/crazy-max/diun&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;Github - DIUN&lt;/strong&gt; &lt;/a&gt;&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;通过 docker-compose 部署&lt;a href=&quot;#通过-docker-compose-部署&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1、安装 Docker 和 Docker Compose&lt;a href=&quot;#1安装-docker-和-docker-compose&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装 Docker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl -sSL https://get.docker.com/ | sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl start docker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl enable docker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装 Docker Compose&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl -L https://github.com/docker/compose/releases/download/v2.9.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 赋予 docker-compose 执行权限&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod +x /usr/local/bin/docker-compose&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2、创建 &lt;code&gt;yml&lt;/code&gt;文件&lt;a href=&quot;#2创建-yml文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir diun&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd diun&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nano docker-compose.yml&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;section&gt;&lt;h4&gt;编辑 &lt;code&gt;docker-compose.yml&lt;/code&gt; 文件&lt;a href=&quot;#编辑-docker-composeyml-文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;version&lt;/span&gt;&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;3.5&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;diun&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;crazymax/diun:latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;container_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;diun&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;command&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;serve&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &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;./data:/data&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &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;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &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;TZ=Asia/Shanghai&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &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;LOG_LEVEL=info&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &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;LOG_JSON=false&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &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;DIUN_WATCH_WORKERS=20&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &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;DIUN_WATCH_SCHEDULE=0 */6 * * *&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &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;DIUN_PROVIDERS_DOCKER=true&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;labels&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &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;diun.enable=true&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;restart&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;always&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;配置 Diun 监控计划，需要在 &lt;code&gt;docker-compose.yml&lt;/code&gt; 文件定义变量环境 &lt;code&gt;DIUN_WATCH_SCHEDULE&lt;/code&gt;，这里设置为每 6 小时监测一次本地 Docker 实例中所有正在运行的容器。（如果需要，请查看&lt;a href=&quot;https://pkg.go.dev/github.com/robfig/cron#hdr-CRON_Expression_Format&quot; target=&quot;_blank&quot;&gt;CRON 表达式格式&lt;/a&gt;）。&lt;/p&gt;&lt;/section&gt;&lt;section&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;Diun 支持对接到 Gotify、Mail、Slack、Telegram 等通知服务，这里我选择使用 Telegram Bot 来推送更新通知。创建一个 Telegram Bot 获取 &lt;code&gt;TOKEN&lt;/code&gt;、&lt;code&gt;CHATID&lt;/code&gt; 后，并在&lt;code&gt;docker-compose.yml&lt;/code&gt;文件中添加以下环境变量：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;DIUN_NOTIF_TELEGRAM_TOKEN=&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;DIUN_NOTIF_TELEGRAM_CHATIDS=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;#can be more than one (comma separated)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;DIUN_NOTIF_TELEGRAM_TEMPLATEBODY=&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;更多详细信息，参考&lt;a href=&quot;https://crazymax.dev/diun/notif/telegram/&quot; target=&quot;_blank&quot;&gt;官方文档&lt;/a&gt;，包括&lt;code&gt;templateBody&lt;/code&gt;可以根据需要修改默认值。&lt;strong&gt;如果您在多台机器上运行 Diun，强烈推荐&lt;/strong&gt;。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&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;p&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt; 文件编辑完成后，运行以下命令启动 Diun：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker-compose up -d&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;测试通知：&lt;/strong&gt; 在运行状态，请使用以下命令进行测试。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker-compose exec diun diun notif test&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果一切顺利，Telegram 将收到来自 Diun  的新通知。&lt;/p&gt;&lt;/section&gt;&lt;section&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;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker-compose pull&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker-compose up -d&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>使用Buildx构建多架构Docker镜像全流程</title><link>https://blog.moewah.com/posts/5125/</link><guid isPermaLink="true">https://blog.moewah.com/posts/5125/</guid><description>如何实现跨平台的Docker镜像构建？本文详解使用Buildx插件在不修改Dockerfile的情况下，轻松构建多架构镜像并推送到Docker Hub的完整方案，解决开发中常见的兼容性问题。</description><pubDate>Sat, 22 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Buildx 是一款用于通过 BuildKit 扩展构建功能的 Docker CLI 插件，使用 Buildx，我们无需对 Dockerfile 进行任何修改，就可以构建不同 CPU 架构的 Docker 镜像，并支持推送到 Docker Hub，省时、省钱还省力。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;BuildKit.jpg&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;482&quot; src=&quot;/_astro/5125_3764841691_fe871e.CMnnvS_W_1OWVFj.webp&quot; srcset=&quot;/_astro/5125_3764841691_fe871e.CMnnvS_W_Z13Qmfi.webp 640w, /_astro/5125_3764841691_fe871e.CMnnvS_W_2bfXd8.webp 750w, /_astro/5125_3764841691_fe871e.CMnnvS_W_ZkKw2B.webp 828w, /_astro/5125_3764841691_fe871e.CMnnvS_W_1OWVFj.webp 1024w&quot; /&gt;&lt;figcaption&gt;BuildKit.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;注意：在开始之前，默认已经在 Linux 系统(各大发行版)下安装好了 64 位的 Docker，且运行 &lt;code&gt;docker --version&lt;/code&gt; 查询的 Docker 版本大于 19.03。&lt;/p&gt;&lt;/blockquote&gt;
&lt;section&gt;&lt;h3&gt;安装 Docker Buildx&lt;a href=&quot;#安装-docker-buildx&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;（1）使用二进制安装&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 下载二进制文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget https://github.com/docker/buildx/releases/download/v0.9.1/buildx-v0.9.1.linux-amd64&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 创建文件夹&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir -p $HOME/.docker/cli-plugins&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 移动文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mv buildx-v0.9.1.linux-amd64 $HOME/.docker/cli-plugins/docker-buildx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 赋予二进制文件执行权限&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod +x $HOME/.docker/cli-plugins/docker-buildx&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;（2）编译二进制文件安装&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;建议采用编译安装的方式，避免在接下来的过程中出现奇怪的错误。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export DOCKER_BUILDKIT=1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker build --platform=local -o . &quot;https://github.com/docker/buildx.git&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir -p $HOME/.docker/cli-plugins&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mv buildx $HOME/.docker/cli-plugins/docker-buildx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod +x $HOME/.docker/cli-plugins/docker-buildx&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;启用 Buildx 插件&lt;a href=&quot;#启用-buildx-插件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Docker Buildx 属于实验性功能，在确保 Docker 版本不低于 &lt;code&gt;19.03&lt;/code&gt; ，通过执行以下命令开启新特性，以启用 buildx 插件。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;export DOCKER_CLI_EXPERIMENTAL=enabled&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;初始化 Docker Buildx&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker buildx create --name builderx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker buildx use builderx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker buildx inspect --bootstrap&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;启用 binfmt_misc&lt;a href=&quot;#启用-binfmt_misc&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果你使用的是 Docker 桌面版（包含 macOS 和 Windows）默认已启用，而对于 Linux 系统，可通过运行一个特权容器来启用 &lt;code&gt;binfmt_misc&lt;/code&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;docker run --privileged --rm tonistiigi/binfmt --install all&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;验证是 binfmt_misc 否开启：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ls -al /proc/sys/fs/binfmt_misc/&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;buildx 会通过 QEMU 模拟器和 binfmt_misc 模拟不同平台构建镜像，请查看是否包含 &lt;code&gt;qemu-*&lt;/code&gt; 文件，如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;total 0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;drwxr-xr-x 2 root root 0 Oct 22 00:50 .&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;dr-xr-xr-x 1 root root 0 Oct  9 15:02 ..&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-rw-r--r-- 1 root root 0 Oct 22 00:50 qemu-aarch64&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-rw-r--r-- 1 root root 0 Oct 22 00:50 qemu-arm&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-rw-r--r-- 1 root root 0 Oct 22 00:50 qemu-ppc64le&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-rw-r--r-- 1 root root 0 Oct 22 00:50 qemu-s390x&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--w------- 1 root root 0 Oct 22 00:50 register&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-rw-r--r-- 1 root root 0 Oct 22 00:50 status&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;构建多平台镜像&lt;a href=&quot;#构建多平台镜像&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;可提前通过 &lt;code&gt;docker login&lt;/code&gt; 命令登录 Docker Hub，在完成构建多平台镜像后，会同时推送镜像至 Docker Hub。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;安装并启用后，我们就可以使用 Docker Buildx 来构建多平台镜像了，以往我们进行构建镜像的命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;build&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;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;IMAGE_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;VERSION&lt;/span&gt;&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;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;使用 &lt;code&gt;Docker Buildx&lt;/code&gt; 体验上与 &lt;code&gt;docker build&lt;/code&gt; 用法基本相同，构建多平台的命令为：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;buildx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--platform&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;linux/amd64,linux/arm64&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;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;IMAGE_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;VERSION&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--push&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--platform&lt;/code&gt; ：指定需要构建的平台，例如:&lt;code&gt;linux/amd64&lt;/code&gt;、&lt;code&gt;linux/arm64&lt;/code&gt;或&lt;code&gt;darwin/amd64&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--push&lt;/code&gt; ：指构建完毕后自动推送到 Docker hub 仓库；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-t&lt;/code&gt; ：镜像的名称及 tag；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.&lt;/code&gt; ：表示 &lt;code&gt;Dockerfile&lt;/code&gt; 文件位于当前路径下。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;dockhub.jpg&quot; loading=&quot;lazy&quot; width=&quot;911&quot; height=&quot;565&quot; src=&quot;/_astro/5125_974022416_9ec13c.5PT0avgA_Z1xQFOu.webp&quot; srcset=&quot;/_astro/5125_974022416_9ec13c.5PT0avgA_Z12azCR.webp 640w, /_astro/5125_974022416_9ec13c.5PT0avgA_Z1yaE31.webp 750w, /_astro/5125_974022416_9ec13c.5PT0avgA_Z1b7hwS.webp 828w, /_astro/5125_974022416_9ec13c.5PT0avgA_Z1xQFOu.webp 911w&quot; /&gt;&lt;figcaption&gt;dockhub.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;如上图，Docker 镜像完成构建、推送后，我们可以在 Docker Hub 找到对应镜像的 tag 就可以看到支持多个平台。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>群晖Docker部署ChineseSubfinder字幕刮削器</title><link>https://blog.moewah.com/posts/5057/</link><guid isPermaLink="true">https://blog.moewah.com/posts/5057/</guid><description>如何自动化下载电影电视剧中文字幕？本文详解在群晖NAS Docker环境下部署ChineseSubfinder的全流程，支持与Emby、Jellyfin等媒体服务器联动，一键解决字幕刮削难题。</description><pubDate>Fri, 29 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;如今我们在家愉快的观影一部大作之前，需要自己动手一边找资源、一边找字幕，费时费力。如果你是影视剧的藏家，如果你有家庭影院的需求，这会是一场噩梦。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;ChineseSubfinder.jpg&quot; loading=&quot;lazy&quot; width=&quot;1900&quot; height=&quot;1100&quot; src=&quot;/_astro/5057_3464493239_a84c37.BLXXDYRV_9lxo9.webp&quot; srcset=&quot;/_astro/5057_3464493239_a84c37.BLXXDYRV_Zehq1J.webp 640w, /_astro/5057_3464493239_a84c37.BLXXDYRV_1msNWn.webp 750w, /_astro/5057_3464493239_a84c37.BLXXDYRV_Z2kobe3.webp 828w, /_astro/5057_3464493239_a84c37.BLXXDYRV_18XhlY.webp 1080w, /_astro/5057_3464493239_a84c37.BLXXDYRV_2mhSjD.webp 1280w, /_astro/5057_3464493239_a84c37.BLXXDYRV_mO8yM.webp 1668w, /_astro/5057_3464493239_a84c37.BLXXDYRV_9lxo9.webp 1900w&quot; /&gt;&lt;figcaption&gt;ChineseSubfinder.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;ChineseSubFinder 项目存在的意义就是自动化搞定电影、电视剧的中文字幕下载。目前支持的字幕网站有 zimuku、subhd、shooter、xunlei 等，支持与 Emby、Jellyfin、Plex、Sonarr、Radarr、TMM 等程序进行联动提高字幕刮削整体效率，项目地址： &lt;a href=&quot;https://github.com/allanpk716/ChineseSubFinder&quot; target=&quot;_blank&quot;&gt;https://github.com/allanpk716/ChineseSubFinder&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;注：
本文内容记录基于群晖 Docker 环境部署安装 ChineseSubfinder 的过程，若你的系统与之不同，请格外注意系统间的差异。
本教程基于 ChineseSubFinder 版本 v0.25.x 编写，对 v0.31.x 以上版本并不适用，请参考项目官方文档。
教程更新是兴趣、是记录，唯独不是义务。&lt;/p&gt;&lt;/blockquote&gt;
&lt;section&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、通过 SSH 访问群晖NAS，运行 &lt;code&gt;sudo -i &lt;/code&gt; 切换至 &lt;code&gt;root&lt;/code&gt;账号；
2、在群晖 docker 目录下创建文件夹用于映射容器内部的 config 和 cache 文件夹，并给予读写权限：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 创建文件夹&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir -p /volume1/docker/chinesesubfinder/{config,cache}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 给文件夹读写权限&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod -R 777 /volume1/docker/chinesesubfinder&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker run -itd \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--net=host \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--restart=unless-stopped \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--name=ChineseSubfinder \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-e PUID=1026 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-e PGID=100 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-e TZ=Asia/Shanghai \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-v /volume1/docker/chinesesubfinder/config:/config \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-v /volume1/docker/chinesesubfinder/cache:/app/cache \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-v /volume1/video:/media \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;allanpk716/chinesesubfinder:latest&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&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;UID&lt;/code&gt;为&lt;code&gt;1026&lt;/code&gt;，默认&lt;code&gt;GID&lt;/code&gt;为&lt;code&gt;100&lt;/code&gt;，如果不确定请运行 &lt;code&gt;id [user]&lt;/code&gt; 查看，例如查看管理员为 &lt;code&gt;admin&lt;/code&gt; 的 &lt;code&gt;PUID&lt;/code&gt;、&lt;code&gt;UGID&lt;/code&gt; 则运行 &lt;code&gt;id admin&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;网络模式为 &lt;code&gt;--net=host&lt;/code&gt; 不需要再做端口映射，默认端口为 &lt;code&gt;19035&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;命令行中的 &lt;code&gt;/volume1/video&lt;/code&gt; 我这里为群晖视频根目录（电影、电视剧目录我都存放在此目录下），挂载至容器内部的 &lt;code&gt;/media&lt;/code&gt; 目录。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&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;http://ip:19035/&lt;/code&gt;，进入到配置中心&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;1.jpg&quot; loading=&quot;lazy&quot; width=&quot;2364&quot; height=&quot;1344&quot; src=&quot;/_astro/5057_870405662_6b5655.D_uz22mA_23NV8m.webp&quot; srcset=&quot;/_astro/5057_870405662_6b5655.D_uz22mA_1ljfz0.webp 640w, /_astro/5057_870405662_6b5655.D_uz22mA_Z1a25mc.webp 750w, /_astro/5057_870405662_6b5655.D_uz22mA_qwmRt.webp 828w, /_astro/5057_870405662_6b5655.D_uz22mA_Zmo3al.webp 1080w, /_astro/5057_870405662_6b5655.D_uz22mA_Z253j3q.webp 1280w, /_astro/5057_870405662_6b5655.D_uz22mA_Z25yHr1.webp 1668w, /_astro/5057_870405662_6b5655.D_uz22mA_2pJiq8.webp 2048w, /_astro/5057_870405662_6b5655.D_uz22mA_23NV8m.webp 2364w&quot; /&gt;&lt;figcaption&gt;1.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;创建管理账号，填写电影目录和电视剧目录，根据你容器挂载的路径来来填写，并注意对应关系。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;2.jpg&quot; loading=&quot;lazy&quot; width=&quot;2028&quot; height=&quot;1264&quot; src=&quot;/_astro/5057_1870048667_535bba.CTiLfWMd_1OATov.webp&quot; srcset=&quot;/_astro/5057_1870048667_535bba.CTiLfWMd_25OnXU.webp 640w, /_astro/5057_1870048667_535bba.CTiLfWMd_Z1fYno0.webp 750w, /_astro/5057_1870048667_535bba.CTiLfWMd_Z1HBcFY.webp 828w, /_astro/5057_1870048667_535bba.CTiLfWMd_ZTijrs.webp 1080w, /_astro/5057_1870048667_535bba.CTiLfWMd_hjXX5.webp 1280w, /_astro/5057_1870048667_535bba.CTiLfWMd_Z1LYnW7.webp 1668w, /_astro/5057_1870048667_535bba.CTiLfWMd_1OATov.webp 2028w&quot; /&gt;&lt;figcaption&gt;2.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;媒体服务器，暂时选择 &lt;strong&gt;无&lt;/strong&gt; ，进阶配置参考如下（http 代理地址请根据自己的情况填写）：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;3.jpg&quot; loading=&quot;lazy&quot; width=&quot;2146&quot; height=&quot;1460&quot; src=&quot;/_astro/5057_3185455660_335bac.BZv30kNQ_IXK6k.webp&quot; srcset=&quot;/_astro/5057_3185455660_335bac.BZv30kNQ_Zix4xx.webp 640w, /_astro/5057_3185455660_335bac.BZv30kNQ_1VTJmF.webp 750w, /_astro/5057_3185455660_335bac.BZv30kNQ_Z11E8Op.webp 828w, /_astro/5057_3185455660_335bac.BZv30kNQ_1kVhKM.webp 1080w, /_astro/5057_3185455660_335bac.BZv30kNQ_1eEjU0.webp 1280w, /_astro/5057_3185455660_335bac.BZv30kNQ_1QzG4S.webp 1668w, /_astro/5057_3185455660_335bac.BZv30kNQ_1dPArp.webp 2048w, /_astro/5057_3185455660_335bac.BZv30kNQ_IXK6k.webp 2146w&quot; /&gt;&lt;figcaption&gt;3.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;关于 emby 相关配置&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;7.jpg&quot; loading=&quot;lazy&quot; width=&quot;2656&quot; height=&quot;1632&quot; src=&quot;/_astro/5057_2697092212_ef712e.DPwvkUdI_ZfKmAb.webp&quot; srcset=&quot;/_astro/5057_2697092212_ef712e.DPwvkUdI_ZaCn1Q.webp 640w, /_astro/5057_2697092212_ef712e.DPwvkUdI_1xJYpa.webp 750w, /_astro/5057_2697092212_ef712e.DPwvkUdI_1LoGGR.webp 828w, /_astro/5057_2697092212_ef712e.DPwvkUdI_Z1Gv5wV.webp 1080w, /_astro/5057_2697092212_ef712e.DPwvkUdI_2jOsFg.webp 1280w, /_astro/5057_2697092212_ef712e.DPwvkUdI_Z2u7fpf.webp 1668w, /_astro/5057_2697092212_ef712e.DPwvkUdI_ZAqpAi.webp 2048w, /_astro/5057_2697092212_ef712e.DPwvkUdI_2q31xF.webp 2560w, /_astro/5057_2697092212_ef712e.DPwvkUdI_ZfKmAb.webp 2656w&quot; /&gt;&lt;figcaption&gt;7.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;其他配置默认即可，之后等待 chinesesubfinder 扫描媒体库即可，着急的话，可以配置完后勾选 &lt;strong&gt;程序启动立即开启扫描&lt;/strong&gt; 然后重启容器，这样扫描任务会立刻执行。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;通过使用 watch­tower 的任务计划定期检测更新，以下为每天的北京时间凌晨 2 点开始对名为 chinesesubfinder 的容器进行自动更新，确保能第一时间尝鲜新版本、新特性。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker run -d \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--name watchtower \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--restart unless-stopped \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-e TZ=Asia/Shanghai \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-v /var/run/docker.sock:/var/run/docker.sock \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;containrrr/watchtower \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--cleanup \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;chinesesubfinder \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--schedule &quot;0 0 2 * * *&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;除了 ChineseSubfinder 还可以通过 &lt;a href=&quot;https://github.com/91270/MeiamSubtitles&quot; target=&quot;_blank&quot;&gt;MeiamSubtitles&lt;/a&gt; 插件支持 Hash 精准匹配中文字幕，以满足 Emby、Jellyfin 中文字幕刮削需求，识别小姐姐也没什么难度  ヾ(≧∇≦*)ゝ&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Linux下迅雷远程离线下载配置指南</title><link>https://blog.moewah.com/posts/5028/</link><guid isPermaLink="true">https://blog.moewah.com/posts/5028/</guid><description>如何在非群晖的Linux系统上实现迅雷远程离线下载？本文提供一键脚本和Docker部署方案，支持自定义端口与下载路径，轻松搭建迅雷离线下载服务，解决跨设备远程下载需求。</description><pubDate>Tue, 26 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;相信使用群晖NAS的小伙伴都知道，群晖迅雷套件内测已经有段时间了，目前服务已趋于稳定、功能上也相对丰富，可自定义下载路径，支持绑定迅雷手机端实现远程下载，还内嵌了小插件商店，可自定义卸载安装网心云等实用功能。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;迅雷.jpg&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;616&quot; src=&quot;/_astro/5028_3171733759_22456a.BmEvQGWZ_NLdfB.webp&quot; srcset=&quot;/_astro/5028_3171733759_22456a.BmEvQGWZ_2w6256.webp 640w, /_astro/5028_3171733759_22456a.BmEvQGWZ_25u9xm.webp 750w, /_astro/5028_3171733759_22456a.BmEvQGWZ_Z1gPpdU.webp 828w, /_astro/5028_3171733759_22456a.BmEvQGWZ_2cPFbM.webp 1080w, /_astro/5028_3171733759_22456a.BmEvQGWZ_ZUOQ1o.webp 1280w, /_astro/5028_3171733759_22456a.BmEvQGWZ_vPG2k.webp 1668w, /_astro/5028_3171733759_22456a.BmEvQGWZ_NLdfB.webp 1920w&quot; /&gt;&lt;figcaption&gt;迅雷.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;但不是所有人都有群晖设备也不是所有人都愿意折腾黑群晖，如何在其他 Linux 系统上使用迅雷离线下载服务呢？有小伙伴提取了群晖平台的迅雷下载套件，用在其他Linux机器上的迅雷远程下载服务。&lt;/p&gt;
&lt;section&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;code&gt;https://github.com/cnk3x/xunlei&lt;/code&gt;
本程序 &lt;strong&gt;不要在群晖的机器上运行！&lt;/strong&gt; ** 不要在群晖的机器上运行！** ** 不要在群晖的机器上运行！** 群晖的机器使用迅雷官方提供的套件即可。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;img alt=&quot;迅雷远程下载.jpg&quot; loading=&quot;lazy&quot; width=&quot;3120&quot; height=&quot;1710&quot; src=&quot;/_astro/5028_1373415074_80bfdd.uzue1Iun_Z1RqrbB.webp&quot; srcset=&quot;/_astro/5028_1373415074_80bfdd.uzue1Iun_Z1RvyXx.webp 640w, /_astro/5028_1373415074_80bfdd.uzue1Iun_ZRqjvR.webp 750w, /_astro/5028_1373415074_80bfdd.uzue1Iun_6ru5l.webp 828w, /_astro/5028_1373415074_80bfdd.uzue1Iun_22IPpv.webp 1080w, /_astro/5028_1373415074_80bfdd.uzue1Iun_ZlKkQL.webp 1280w, /_astro/5028_1373415074_80bfdd.uzue1Iun_120z7.webp 1668w, /_astro/5028_1373415074_80bfdd.uzue1Iun_Z2tyG41.webp 2048w, /_astro/5028_1373415074_80bfdd.uzue1Iun_ZdNIRc.webp 2560w, /_astro/5028_1373415074_80bfdd.uzue1Iun_Z1RqrbB.webp 3120w&quot; /&gt;&lt;figcaption&gt;迅雷远程下载.jpg&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img alt=&quot;迅雷小插件商店.jpg&quot; loading=&quot;lazy&quot; width=&quot;3104&quot; height=&quot;1714&quot; src=&quot;/_astro/5028_2357861119_dd6e2c.DUUYC7kW_p8Uhu.webp&quot; srcset=&quot;/_astro/5028_2357861119_dd6e2c.DUUYC7kW_Z4fwSt.webp 640w, /_astro/5028_2357861119_dd6e2c.DUUYC7kW_183n4l.webp 750w, /_astro/5028_2357861119_dd6e2c.DUUYC7kW_26VbFy.webp 828w, /_astro/5028_2357861119_dd6e2c.DUUYC7kW_ZG0VNo.webp 1080w, /_astro/5028_2357861119_dd6e2c.DUUYC7kW_Z1WKG52.webp 1280w, /_astro/5028_2357861119_dd6e2c.DUUYC7kW_Z15ORu7.webp 1668w, /_astro/5028_2357861119_dd6e2c.DUUYC7kW_Z1kVG6X.webp 2048w, /_astro/5028_2357861119_dd6e2c.DUUYC7kW_Z1TSYHN.webp 2560w, /_astro/5028_2357861119_dd6e2c.DUUYC7kW_p8Uhu.webp 3104w&quot; /&gt;&lt;figcaption&gt;迅雷小插件商店.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&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;x86_64&lt;/code&gt; 架构，建议系统：CentOS7+、Debian10+、Ubuntu20.04+，可使用 &lt;code&gt;systemctl&lt;/code&gt; 管理服务。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sh -c &quot;$(curl -fSsL https://raw.githubusercontent.com/cnk3x/xunlei/main/install.sh)&quot; - install --port=2345 --download-dir=/download&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;section&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;上面命令后面的参数 —port=后面接端口号, —download-dir=接下载文件夹，按自己的需求改&lt;/li&gt;
&lt;li&gt;下载文件夹装好后没得改了，要改的话，卸载重装，或者用软链接&lt;/li&gt;
&lt;li&gt;有时候安装失败，可以先运行卸载一次，再安装&lt;/li&gt;
&lt;li&gt;启动后，浏览器访问你的设备地址+端口号绑定迅雷就可以了。 比如： &lt;code&gt;http://192.168.3.11:2345&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;当前版本支持迅雷官方公测前的在线更新(不需要重新安装)&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 卸载&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sh -c &quot;$(curl -fSsL https://raw.githubusercontent.com/cnk3x/xunlei/main/uninstall.sh)&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 启动&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl start xunlei&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 停止&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl stop xunlei&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 状态&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl status xunlei&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 查看日志(ctrl+c退出日志查看)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;journalctl -fu xunlei&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Docker 版本&lt;a href=&quot;#docker-版本&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;支持平台 amd64 / arm64&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker run -d --name=xunlei \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--hostname=xl \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--net=host \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-v &amp;lt;数据目录&amp;gt;:/xunlei/data \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-v &amp;lt;下载目录&amp;gt;:/xunlei/downloads \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--restart=unless-stopped \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--privileged \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cnk3x/xunlei:latest&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;section&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、host网络默认网页管理端口 2345，保持 host 网络变更使用 4321 端口则需要增加变量换量 &lt;code&gt;-e XL_WEB_PORT=4321&lt;/code&gt;
2、若&amp;lt;数据目录&amp;gt;已经绑定安装过的，再次安装会复用，而且下载目录不可更改，如果要更改下载目录，请把这个目录删掉重新绑定。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>OpenWrt设置为交换机/AP模式全攻略</title><link>https://blog.moewah.com/posts/4977/</link><guid isPermaLink="true">https://blog.moewah.com/posts/4977/</guid><description>如何将OpenWrt路由器设置为AP模式？本文详细拆解两种实现方案，解决主路由分配IP、DHCP及NAT性能优化问题，帮助用户轻松实现多设备无线互通与网络扩展。</description><pubDate>Fri, 18 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;AP（接入点）模式下，只需要把一根可以上网的网线插主路由器（上级路由）LAN 口上，无需额外的配置手机、笔记本电脑就可以正常上网，能够实现不同无线路由设备互访。把路由器设置成AP模式，由主路由器（上级路由）提供分配 IP 地址功能、DHCP 功能，可降低网络延迟，有助于改善局域网 NAT 转发性能（少一个 NAT 减少了带宽资源的损耗）。下面提供几种将 OpenWrt 设置为交换机 / AP 模式方法，基本思路是一致的，以供参考。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;OpenWrt.jpg&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; src=&quot;/_astro/4054_2015901808_a49ca0.BwVc8Mwk_1t8nUY.webp&quot; srcset=&quot;/_astro/4054_2015901808_a49ca0.BwVc8Mwk_16qPB6.webp 640w, /_astro/4054_2015901808_a49ca0.BwVc8Mwk_2uXq54.webp 750w, /_astro/4054_2015901808_a49ca0.BwVc8Mwk_Z1o7eBv.webp 828w, /_astro/4054_2015901808_a49ca0.BwVc8Mwk_24WuaL.webp 1080w, /_astro/4054_2015901808_a49ca0.BwVc8Mwk_Z1cGET8.webp 1280w, /_astro/4054_2015901808_a49ca0.BwVc8Mwk_PmbLE.webp 1668w, /_astro/4054_2015901808_a49ca0.BwVc8Mwk_1t8nUY.webp 1920w&quot; /&gt;&lt;figcaption&gt;OpenWrt.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&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;如果你的固件里有 switch （交换机）的设置项，可以很方便的通过以下办法来实现将 OpenWrt 设置为交换机/AP模式，可以充分利用物理 WAN 口充当 LAN 口来用。&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;步骤一：将 LAN IP 要设置为主路由的网段内的 IP，网关、DNS 设置为主路由的 IP。&lt;/li&gt;
&lt;li&gt;步骤二：删除 &lt;strong&gt;交换机&lt;/strong&gt; 中的 &lt;code&gt;VLAN ID 2&lt;/code&gt;，并将 &lt;code&gt;VLAN ID 1&lt;/code&gt; 中的 WAN 口设置为未标记；&lt;/li&gt;
&lt;li&gt;步骤三：删除 &lt;strong&gt;接口&lt;/strong&gt; 中的 WAN 口（包括 WAN6）；&lt;/li&gt;
&lt;li&gt;步骤四：进入&lt;strong&gt;接口&lt;/strong&gt; - &lt;strong&gt;LAN&lt;/strong&gt; - &lt;strong&gt;修改&lt;/strong&gt; - &lt;strong&gt;基本设置&lt;/strong&gt;，勾选「忽略此接口」，关闭DHCP服务让主路由（上级路由）来接管。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;保存并应用，最后重启一下路由器即可。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;如果你的固件里没有 switch （交换机）的设置项，可以通过以下办法来实现，但缺点就是会浪费一个 WAN 口。&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;strong&gt;WAN&lt;/strong&gt; 口 &lt;strong&gt;协议&lt;/strong&gt; 类型切换为 &lt;strong&gt;不配置协议&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;步骤二：将 &lt;strong&gt;网络&lt;/strong&gt; - &lt;strong&gt;接口&lt;/strong&gt; 中的 &lt;strong&gt;LAN&lt;/strong&gt; 口的 IP 设置为主路由（上级路由）所在网段内的 IP 地址，同时网关及DNS填写为主路由（上级路由）的 IP；&lt;/li&gt;
&lt;li&gt;步骤三：进入&lt;strong&gt;接口&lt;/strong&gt; - &lt;strong&gt;LAN&lt;/strong&gt; - &lt;strong&gt;修改&lt;/strong&gt; - &lt;strong&gt;基本设置&lt;/strong&gt;，勾选「忽略此接口」，来关闭DHCP服务让主路由（上级路由）来接管。&lt;/li&gt;
&lt;li&gt;步骤四：将原先插在 WAN 口的网线拔掉，插到 LAN 口。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;保存并应用，最后重启一下路由器即可。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Docker-Compose 自部署 Umami 网站分析工具</title><link>https://blog.moewah.com/posts/4938/</link><guid isPermaLink="true">https://blog.moewah.com/posts/4938/</guid><description>如何快速部署 Umami 网站分析工具？本文详解 Docker Compose 自部署全流程，包含环境检查、YML 文件配置及数据库设置，10 分钟完成零配置部署。适合开发者和运维人员，轻松实现网站流量数据的私有化分析，避免 Google Analytics 隐私问题。</description><pubDate>Sat, 18 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt; Umami 是一款简单易用、自托管的开源网站访问流量统计分析工具，类似 Google An­a­lyt­ics、Cloud­flare Web An­a­lyt­ics、CNZZ、51LA 等，但 Umami 不使用 Cookie，不跟踪用户，且所有收集的数据都会匿名化处理，符合 GDPR 政策，不会像 Google Analytics 一样被很多浏览器插件拦截，数据相对更加准确，分析的数据内容很丰富，基本的来源国家，来源域名，使用的浏览器、系统、设备，访问的网页这些都有，而且还支持多国语言。Umami 在速度和配置要求上有非常明显的优势，在积累大量数据后依旧能保持快速的响应。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;umami&quot; loading=&quot;lazy&quot; width=&quot;1420&quot; height=&quot;708&quot; src=&quot;/_astro/umami.2H8SekB8_Z23GIVH.webp&quot; srcset=&quot;/_astro/umami.2H8SekB8_Z29D83j.webp 640w, /_astro/umami.2H8SekB8_1gCI3f.webp 750w, /_astro/umami.2H8SekB8_1nMkWl.webp 828w, /_astro/umami.2H8SekB8_276fbX.webp 1080w, /_astro/umami.2H8SekB8_Za27f9.webp 1280w, /_astro/umami.2H8SekB8_Z23GIVH.webp 1420w&quot; /&gt;&lt;figcaption&gt;umami&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;通过 Docker Compose 自部署&lt;a href=&quot;#通过-docker-compose-自部署&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Umami 官方提供了 Docker 镜像，但同时需要搭配数据库使用，这样一来，还是使用 docker compose 部署方便一些，我个人也偏好使用 docker compose 部署，完整的部署过程如下：&lt;/p&gt;&lt;section&gt;&lt;h3&gt;&lt;strong&gt;检查环境&lt;/strong&gt;&lt;a href=&quot;#检查环境&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;你的服务器需要安装 Docker 和 Docker Compose。运行命令检查：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker-compose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这两条命令应返回 Docker 和 Docker Compose 版本号。如果没有，请先安装它们。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;安装 Docker 与 Docker-Compose&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装 Docker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-sSL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://get.docker.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;sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;enable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装 Docker Compose&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-L&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;https://github.com/docker/compose/releases/download/v2.9.0/docker-compose-&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt;uname&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-s&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;uname&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-m&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-o&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/usr/local/bin/docker-compose&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 赋予 docker-compose 执行权限&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod&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;/usr/local/bin/docker-compose&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;创建 YML 文件&lt;a href=&quot;#创建-yml-文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;创建一个新目录并进入：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/opt/umami&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/opt/umami&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;复制以下内容，创建 &lt;code&gt;docker-compose.yml&lt;/code&gt; 文件：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;version&lt;/span&gt;&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;&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;umami&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ghcr.io/umami-software/umami:postgresql-latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &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;3000:3000&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;DATABASE_URL&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;postgresql://umami:你的数据库密码@db:5432/umami&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;DATABASE_TYPE&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;postgresql&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;APP_SECRET&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;depends_on&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;condition&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;service_healthy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;restart&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;always&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;postgres:15-alpine&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;POSTGRES_DB&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;umami&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;POSTGRES_USER&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;umami&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;umami-db-data:/var/lib/postgresql/data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;restart&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;always&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;healthcheck&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;test&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&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;CMD-SHELL&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;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;interval&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;5s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;timeout&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;5s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;retries&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;umami-db-data&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;⚠️ 注意事项：&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;将文中两处&lt;code&gt;你的数据库密码&lt;/code&gt;改为同一组高强度密码。&lt;/li&gt;
&lt;li&gt;将&lt;code&gt;随机密钥字符串&lt;/code&gt;替换为一个长随机字符串。你可以在终端运行 &lt;code&gt;openssl rand -base64 32&lt;/code&gt; 来生成它。&lt;/li&gt;
&lt;li&gt;若需要了解更多环境变量的配置细节，请自行查看—&amp;gt;&lt;a href=&quot;https://umami.is/docs/environment-variables&quot; target=&quot;_blank&quot;&gt;官方文档&lt;/a&gt; 进行自定义配置。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker-compose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;up&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;等待拉取镜像并完成容器的启动。&lt;/p&gt;&lt;/section&gt;&lt;section&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;http://你的服务器IP:3000&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;&lt;img loading=&quot;lazy&quot; width=&quot;2326&quot; height=&quot;1220&quot; src=&quot;/_astro/umami-%E5%88%9D%E5%A7%8B%E7%99%BB%E5%BD%95%E9%A1%B5.ZmbHPzS9_Z10Xkix.webp&quot; srcset=&quot;/_astro/umami-%E5%88%9D%E5%A7%8B%E7%99%BB%E5%BD%95%E9%A1%B5.ZmbHPzS9_Z230plg.webp 640w, /_astro/umami-%E5%88%9D%E5%A7%8B%E7%99%BB%E5%BD%95%E9%A1%B5.ZmbHPzS9_ZbuyYD.webp 750w, /_astro/umami-%E5%88%9D%E5%A7%8B%E7%99%BB%E5%BD%95%E9%A1%B5.ZmbHPzS9_6WRmb.webp 828w, /_astro/umami-%E5%88%9D%E5%A7%8B%E7%99%BB%E5%BD%95%E9%A1%B5.ZmbHPzS9_2bTRea.webp 1080w, /_astro/umami-%E5%88%9D%E5%A7%8B%E7%99%BB%E5%BD%95%E9%A1%B5.ZmbHPzS9_TU3dL.webp 1280w, /_astro/umami-%E5%88%9D%E5%A7%8B%E7%99%BB%E5%BD%95%E9%A1%B5.ZmbHPzS9_14Gh20.webp 1668w, /_astro/umami-%E5%88%9D%E5%A7%8B%E7%99%BB%E5%BD%95%E9%A1%B5.ZmbHPzS9_ZJJB2k.webp 2048w, /_astro/umami-%E5%88%9D%E5%A7%8B%E7%99%BB%E5%BD%95%E9%A1%B5.ZmbHPzS9_Z10Xkix.webp 2326w&quot; /&gt;&lt;/p&gt;&lt;p&gt;使用初始账号登录：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;用户名：&lt;code&gt;admin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;密码：&lt;code&gt;umami&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;登录后，建议立即在后台修改这个默认密码。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Nginx 反向代理&lt;a href=&quot;#nginx-反向代理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这里补充一下使用 Nginx 反代来绑定域名的简单示例：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt; &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name &lt;/span&gt;&lt;span&gt;&lt;span&gt;umami.yourdomain.com&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;&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;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_pass &lt;/span&gt;&lt;span&gt;&lt;span&gt;http://localhost:3000&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Real-IP &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;remote_addr&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;Host &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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;   &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header &lt;/span&gt;&lt;span&gt;&lt;span&gt;X-Forwarded-For &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_add_x_forwarded_for&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;若完成配置反向代理绑定域名，可以通过域名重新进入 Umami 后台管理页面，依次点击 &lt;strong&gt;Add website&lt;/strong&gt; 输入你的 &lt;strong&gt;网站名称&lt;/strong&gt; 和 &lt;strong&gt;域名地址&lt;/strong&gt; ，将你的网站添加进去。&lt;/p&gt;&lt;p&gt;&lt;img loading=&quot;lazy&quot; width=&quot;2320&quot; height=&quot;1214&quot; src=&quot;/_astro/umami-%E6%B7%BB%E5%8A%A0%E7%BD%91%E7%AB%99.BQihJVHm_QGFkI.webp&quot; srcset=&quot;/_astro/umami-%E6%B7%BB%E5%8A%A0%E7%BD%91%E7%AB%99.BQihJVHm_Z2dscxb.webp 640w, /_astro/umami-%E6%B7%BB%E5%8A%A0%E7%BD%91%E7%AB%99.BQihJVHm_ZVKum5.webp 750w, /_astro/umami-%E6%B7%BB%E5%8A%A0%E7%BD%91%E7%AB%99.BQihJVHm_DoCdS.webp 828w, /_astro/umami-%E6%B7%BB%E5%8A%A0%E7%BD%91%E7%AB%99.BQihJVHm_ZhAGIS.webp 1080w, /_astro/umami-%E6%B7%BB%E5%8A%A0%E7%BD%91%E7%AB%99.BQihJVHm_ZU9CPU.webp 1280w, /_astro/umami-%E6%B7%BB%E5%8A%A0%E7%BD%91%E7%AB%99.BQihJVHm_Z13MqIX.webp 1668w, /_astro/umami-%E6%B7%BB%E5%8A%A0%E7%BD%91%E7%AB%99.BQihJVHm_Z1bAVKp.webp 2048w, /_astro/umami-%E6%B7%BB%E5%8A%A0%E7%BD%91%E7%AB%99.BQihJVHm_QGFkI.webp 2320w&quot; /&gt;&lt;/p&gt;&lt;p&gt;Save 保存后，列表里会出现你的网站，点击修改图标。&lt;/p&gt;&lt;p&gt;&lt;img loading=&quot;lazy&quot; width=&quot;2312&quot; height=&quot;1162&quot; src=&quot;/_astro/umami-%E8%BF%9B%E5%85%A5%E7%BD%91%E7%AB%99%E8%AE%BE%E7%BD%AE.B5sysgSt_Z2rJyap.webp&quot; srcset=&quot;/_astro/umami-%E8%BF%9B%E5%85%A5%E7%BD%91%E7%AB%99%E8%AE%BE%E7%BD%AE.B5sysgSt_2ER6T.webp 640w, /_astro/umami-%E8%BF%9B%E5%85%A5%E7%BD%91%E7%AB%99%E8%AE%BE%E7%BD%AE.B5sysgSt_lglEO.webp 750w, /_astro/umami-%E8%BF%9B%E5%85%A5%E7%BD%91%E7%AB%99%E8%AE%BE%E7%BD%AE.B5sysgSt_Z291GvJ.webp 828w, /_astro/umami-%E8%BF%9B%E5%85%A5%E7%BD%91%E7%AB%99%E8%AE%BE%E7%BD%AE.B5sysgSt_J9QNL.webp 1080w, /_astro/umami-%E8%BF%9B%E5%85%A5%E7%BD%91%E7%AB%99%E8%AE%BE%E7%BD%AE.B5sysgSt_Z1HEjNt.webp 1280w, /_astro/umami-%E8%BF%9B%E5%85%A5%E7%BD%91%E7%AB%99%E8%AE%BE%E7%BD%AE.B5sysgSt_20wiWj.webp 1668w, /_astro/umami-%E8%BF%9B%E5%85%A5%E7%BD%91%E7%AB%99%E8%AE%BE%E7%BD%AE.B5sysgSt_Z2u2tB5.webp 2048w, /_astro/umami-%E8%BF%9B%E5%85%A5%E7%BD%91%E7%AB%99%E8%AE%BE%E7%BD%AE.B5sysgSt_Z2rJyap.webp 2312w&quot; /&gt;&lt;/p&gt;&lt;p&gt;复制专属的跟踪统计代码。&lt;/p&gt;&lt;p&gt;&lt;img loading=&quot;lazy&quot; width=&quot;2320&quot; height=&quot;1226&quot; src=&quot;/_astro/umami-%E8%8E%B7%E5%8F%96%E8%B7%9F%E8%B8%AA%E4%BB%A3%E7%A0%81.RkhRpBKO_Z1vn4od.webp&quot; srcset=&quot;/_astro/umami-%E8%8E%B7%E5%8F%96%E8%B7%9F%E8%B8%AA%E4%BB%A3%E7%A0%81.RkhRpBKO_ZmULMN.webp 640w, /_astro/umami-%E8%8E%B7%E5%8F%96%E8%B7%9F%E8%B8%AA%E4%BB%A3%E7%A0%81.RkhRpBKO_154Y4Y.webp 750w, /_astro/umami-%E8%8E%B7%E5%8F%96%E8%B7%9F%E8%B8%AA%E4%BB%A3%E7%A0%81.RkhRpBKO_Z1gp9yA.webp 828w, /_astro/umami-%E8%8E%B7%E5%8F%96%E8%B7%9F%E8%B8%AA%E4%BB%A3%E7%A0%81.RkhRpBKO_28lKzC.webp 1080w, /_astro/umami-%E8%8E%B7%E5%8F%96%E8%B7%9F%E8%B8%AA%E4%BB%A3%E7%A0%81.RkhRpBKO_lGpMW.webp 1280w, /_astro/umami-%E8%8E%B7%E5%8F%96%E8%B7%9F%E8%B8%AA%E4%BB%A3%E7%A0%81.RkhRpBKO_1VB2hC.webp 1668w, /_astro/umami-%E8%8E%B7%E5%8F%96%E8%B7%9F%E8%B8%AA%E4%BB%A3%E7%A0%81.RkhRpBKO_ZoPl9M.webp 2048w, /_astro/umami-%E8%8E%B7%E5%8F%96%E8%B7%9F%E8%B8%AA%E4%BB%A3%E7%A0%81.RkhRpBKO_Z1vn4od.webp 2320w&quot; /&gt;&lt;/p&gt;&lt;p&gt;将复制的代码粘贴到网站所有页面的 &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 前（这是官方的建议），我个人建议放在&lt;code&gt;&amp;lt;/footer&amp;gt;&lt;/code&gt;之前。代码添加后，访问你的网站。几分钟内，你就能在Umami仪表板上看到访问数据。&lt;/p&gt;&lt;p&gt;至此，已经完成了基础的 Umami 网站统计服务的自部署。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;Umami还支持对站点统计的一些细节做配置，如排除链接参数、避免页面哈希变化导致访问量统计失真、函数回调、以及数据标签（这个很不错，可以做简单的页面埋点区分）等功能。&lt;/p&gt;&lt;p&gt;这部分内容，大家可以参考 -&amp;gt; &lt;a href=&quot;https://umami.is/docs/tracker-configuration&quot; target=&quot;_blank&quot;&gt;跟踪器配置 --- Tracker configuration&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>ngx_waf 高性能 Nginx 网站防火墙模块全解析</title><link>https://blog.moewah.com/posts/4880/</link><guid isPermaLink="true">https://blog.moewah.com/posts/4880/</guid><description>如何为 Nginx 部署高性能网站防火墙？本文详解 ngx_waf 模块的功能特性与编译安装流程，涵盖 SQL 注入、XSS 攻击防护及 CC 防御等核心功能，助你快速构建安全的 Web 环境。</description><pubDate>Mon, 13 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt; ngx_waf 是最近新出的一款方便且高性能的 Nginx 防火墙模块，功能齐全，「网络应用防火墙」的基本功能都有。安装方便，大多数情况下你可以直接下载使用预构建的模块。使用便捷，配置指令简单易懂。规则灵活，提供高级规则，将动作（如拦截或放行）和多个条件表达式组合起来。Github 项目地址：&lt;a href=&quot;https://github.com/ADD-SP/ngx_waf&quot; target=&quot;_blank&quot;&gt;https://github.com/ADD-SP/ngx_waf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;ngx_waf.jpg&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;480&quot; src=&quot;/_astro/4880_2892063686_3533c1.DSaOCDa8_Z1WhTts.webp&quot; srcset=&quot;/_astro/4880_2892063686_3533c1.DSaOCDa8_1LbFw6.webp 640w, /_astro/4880_2892063686_3533c1.DSaOCDa8_Z3S7Op.webp 750w, /_astro/4880_2892063686_3533c1.DSaOCDa8_Z6twKJ.webp 828w, /_astro/4880_2892063686_3533c1.DSaOCDa8_Z1WhTts.webp 1024w&quot; /&gt;&lt;figcaption&gt;ngx_waf.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1、SQL 注入防护（Powered By libinjection）。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2、XSS 攻击防护（Powered By libinjection）。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3、支持 IPV4 和 IPV6。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4、支持开启验证码（CAPTCHA)，支持 hCaptcha、reCAPTCHAv2 和 reCAPTCHAv3。此功能仅限最新的 Current 版本。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;5、支持识别友好爬虫（如 BaiduSpider）并自动放行（基于 User-Agent 和 IP 的识别）。此功能仅限最新的 Current 版本。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;6、CC 防御，超出限制后自动拉黑对应 IP 一段时间。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;7、IP 黑白名单，同时支持类似 192.168.0.0/16 和 fe80::/10，即支持点分十进制和冒号十六进制表示法和网段划分。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;8、POST 黑名单。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;9、URL 黑白名单&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;10、查询字符串（Query String）黑名单。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;11、UserAgent 黑名单。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;12、Cookie 黑名单。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;13、Referer 黑白名单。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;14、高级规则，将动作（如拦截或放行）和多个条件表达式组合起来。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;编译安装 ngx_waf 模块&lt;a href=&quot;#编译安装-ngx_waf-模块&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;⚠️ 本教程基于军哥的 LNMP 一键包环境！若环境相同，可供参考！&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;当前各程序版本信息如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;LNMP = v1.7&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Nginx version = 1.20.1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;gcc version = 4.8.5&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;编译安装 &lt;code&gt;LTS&lt;/code&gt; 版本的 &lt;code&gt;ngx_waf&lt;/code&gt; 模块：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/usr/local/src&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-b&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lts&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://github.com/ADD-SP/ngx_waf.git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ngx_waf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;make&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/usr/local/src&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://github.com/libinjection/libinjection.git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lib/libinjection&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/usr/local/src/ngx_waf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://github.com/DaveGamble/cJSON.git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;lib/cjson&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/usr/local/src/ngx_waf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://github.com/libinjection/libinjection.git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;inc/libinjection&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/usr/local/src&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://github.com/jedisct1/libsodium.git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--branch&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;libsodium-src&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;libsodium-src&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./configure&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--prefix=/usr/local/src/libsodium&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--with-pic&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;LIB_SODIUM&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;usr&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;local&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;libsodium&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;-j&lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;nproc&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;check&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-j&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;nproc&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/usr/local/src&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://github.com/troydhanson/uthash.git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;LIB_UTHASH&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;usr&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;local&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;uthash&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;进入 &lt;code&gt;lnmp1.7&lt;/code&gt; 所在目录，编辑 &lt;code&gt;~/lnmp1.7/include/upgrade_nginx.sh&lt;/code&gt;这个文件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nano&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/lnmp1.7/include/upgrade_nginx.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;找到&lt;code&gt;else&lt;/code&gt;后面的 &lt;code&gt; ./configure&lt;/code&gt; 这行（大概第62行），在这串编译参数末端追加&lt;code&gt; --add-module=/usr/local/src/ngx_waf --with-cc-opt=&apos;-std=gnu99&apos;&lt;/code&gt;（&lt;strong&gt;注意：有空格！！有空格！！不要换行！！！不要换行！！！&lt;/strong&gt;）&lt;/p&gt;&lt;p&gt;编译模块&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/lnmp1.7&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;./upgrade.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nginx&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;输入版本号，回车，耐心等待编译完成。（Nginx 版本号可在 &lt;a href=&quot;http://nginx.org/en/download.html&quot; target=&quot;_blank&quot;&gt;nginx下载页&lt;/a&gt; 找到预升级的版本号进行输入并按下回车键）&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;配置 waf 防火墙&lt;a href=&quot;#配置-waf-防火墙&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在主机配置文件例如 &lt;code&gt;/usr/local/nginx/conf/vhost/www.moewah.com.conf&lt;/code&gt;文件 &lt;code&gt;server&lt;/code&gt; 块内加入以下代码：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 启用模块&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;waf on;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 指定规则文件所在目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;waf_rule_path /usr/local/src/ngx_waf/assets/rules/;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 指定防火墙的工作模式&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;waf_mode DYNAMIC;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 指定请求频率上限为每分钟1000次，超过请求拉黑60分钟&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;waf_cc_deny rate=1000r/m duration=60m;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 最多缓存 50 个检测目标的检测结果&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;waf_cache capacity=50;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 被攻击时降低带宽占用&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;waf_http_status cc_deny=444;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;修改完成后，重启 &lt;code&gt;nginx&lt;/code&gt; 使配置生效。&lt;/p&gt;&lt;p&gt;以上为喵斯基部落的自用配置，更多使用姿势请自行访问 -&amp;gt; &lt;a href=&quot;https://docs.addesp.com/ngx_waf/zh-cn/&quot; target=&quot;_blank&quot;&gt;官方文档&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Tailscale 无公网IP远程组网实战指南</title><link>https://blog.moewah.com/posts/4796/</link><guid isPermaLink="true">https://blog.moewah.com/posts/4796/</guid><description>没有公网IP如何实现安全远程访问？本文详解Tailscale基于WireGuard的P2P组网方案，解决异地办公、设备互联与隐私保护痛点，提供群晖NAS和OpenWrt部署教程。</description><pubDate>Thu, 19 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt; Tailscale 是一款基于 Wire­Guard® 保护的虚拟局域组网工具，相信使用过 &lt;a href=&quot;https://blog.moewah.com/posts/1474/&quot;&gt;ZeroTier&lt;/a&gt; 对虚拟局域网应该也有所了解，虚拟局域网与本地组网的最大差别在于设备与设备之间允许不在一个机房、国家甚至地区，但通过 P2P 或者中转节点，通过异地组网最终实现局域网的效果。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Tailscale.png&quot; loading=&quot;lazy&quot; width=&quot;1107&quot; height=&quot;524&quot; src=&quot;/_astro/4796_72565116_cc4570.Bmq4d70C_ZF59AH.webp&quot; srcset=&quot;/_astro/4796_72565116_cc4570.Bmq4d70C_Z213ghL.webp 640w, /_astro/4796_72565116_cc4570.Bmq4d70C_Z1f77Sn.webp 750w, /_astro/4796_72565116_cc4570.Bmq4d70C_1EPA0U.webp 828w, /_astro/4796_72565116_cc4570.Bmq4d70C_Z25W7Wi.webp 1080w, /_astro/4796_72565116_cc4570.Bmq4d70C_ZF59AH.webp 1107w&quot; /&gt;&lt;figcaption&gt;Tailscale.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;没有公网IP，又想能满足远程办公需求？担心暴露公网 IP 而被频繁的恶意扫描、攻击？Tailscale 的诞生，成为解决这些痛点的全新选择。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Tailscale2.png&quot; loading=&quot;lazy&quot; width=&quot;913&quot; height=&quot;474&quot; src=&quot;/_astro/4796_2743088671_11ba10.B0Jq6X1Z_Z36yu2.webp&quot; srcset=&quot;/_astro/4796_2743088671_11ba10.B0Jq6X1Z_Zzn5kY.webp 640w, /_astro/4796_2743088671_11ba10.B0Jq6X1Z_Z1xk6o1.webp 750w, /_astro/4796_2743088671_11ba10.B0Jq6X1Z_1C9xLY.webp 828w, /_astro/4796_2743088671_11ba10.B0Jq6X1Z_Z36yu2.webp 913w&quot; /&gt;&lt;figcaption&gt;Tailscale2.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&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;strong&gt;无需注册，授权登录，开箱即用；&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;无需配置防火墙；&lt;/li&gt;
&lt;li&gt;没有额外的配置。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高安全性、私密性；&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;自动密钥轮换&lt;/li&gt;
&lt;li&gt;基于 WireGuard® 保护&lt;/li&gt;
&lt;li&gt;点对点连接&lt;/li&gt;
&lt;li&gt;支持用户审查端到端的访问记录&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;访问/连接，高度可控&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;支持使用节点共享与指定的 Tailscale 用户共享您的设备。&lt;/li&gt;
&lt;li&gt;支持使用ACL限制对设备的访问。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;低延时，不限速。&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;设备间在不跨运营商的前提条件下，设备所在网络环境的上行带宽就是访问下载的最大带宽。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&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;至少两台设备来设置和配置 Tailscale 网络。
Tailscale 官网地址：&lt;a href=&quot;https://tailscale.com/&quot; target=&quot;_blank&quot;&gt;https://tailscale.com/&lt;/a&gt;
Tailscale 下载地址：&lt;a href=&quot;https://tailscale.com/download&quot; target=&quot;_blank&quot;&gt;https://tailscale.com/download&lt;/a&gt;
注：免费用户最多支持 20 个设备，加入更多设备需要花银子。&lt;/p&gt;&lt;/blockquote&gt;&lt;section&gt;&lt;h3&gt;群晖 NAS 安装使用 Tailscale&lt;a href=&quot;#群晖-nas-安装使用-tailscale&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;以群晖为例  —&amp;gt;下载 &lt;a href=&quot;https://github.com/tailscale/tailscale-synology/releases&quot; target=&quot;_blank&quot;&gt;Tailscale&lt;/a&gt; ，然后到 &lt;strong&gt;套件中心&lt;/strong&gt; 手动安装 spk 文件。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;tailscale-dsm.png&quot; loading=&quot;lazy&quot; width=&quot;1013&quot; height=&quot;601&quot; src=&quot;/_astro/4796_3079874042_c9337e.B0ogINvf_Z1zUXWt.webp&quot; srcset=&quot;/_astro/4796_3079874042_c9337e.B0ogINvf_Z1mtdXN.webp 640w, /_astro/4796_3079874042_c9337e.B0ogINvf_ovLet.webp 750w, /_astro/4796_3079874042_c9337e.B0ogINvf_2ozY1.webp 828w, /_astro/4796_3079874042_c9337e.B0ogINvf_Z1zUXWt.webp 1013w&quot; /&gt;&lt;figcaption&gt;tailscale-dsm.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;安装完成后，进入终端 ssh，执行&lt;code&gt;sudo tailscale up&lt;/code&gt;命令，或者直接打开 Tailscale 进入授权登录页面。（国内网络环境推荐使用巨硬）&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;授权登录.png&quot; loading=&quot;lazy&quot; width=&quot;956&quot; height=&quot;598&quot; src=&quot;/_astro/4796_3925748308_87e4ff.BpA2Ub39_ZtBUxP.webp&quot; srcset=&quot;/_astro/4796_3925748308_87e4ff.BpA2Ub39_Z1CcmQt.webp 640w, /_astro/4796_3925748308_87e4ff.BpA2Ub39_yDtID.webp 750w, /_astro/4796_3925748308_87e4ff.BpA2Ub39_Z1bUsCU.webp 828w, /_astro/4796_3925748308_87e4ff.BpA2Ub39_ZtBUxP.webp 956w&quot; /&gt;&lt;figcaption&gt;授权登录.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;授权登录成功后，会自动为该设备分配一个 &lt;strong&gt;Tailscale IP&lt;/strong&gt; （可用于局域网内设备间的访问）&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;分配得到局域网ip.png&quot; loading=&quot;lazy&quot; width=&quot;994&quot; height=&quot;463&quot; src=&quot;/_astro/4796_2158183703_3ba986.Dhy9plVH_Z1CoLCM.webp&quot; srcset=&quot;/_astro/4796_2158183703_3ba986.Dhy9plVH_1yoINe.webp 640w, /_astro/4796_2158183703_3ba986.Dhy9plVH_Z28R17.webp 750w, /_astro/4796_2158183703_3ba986.Dhy9plVH_DpRBo.webp 828w, /_astro/4796_2158183703_3ba986.Dhy9plVH_Z1CoLCM.webp 994w&quot; /&gt;&lt;figcaption&gt;分配得到局域网ip.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;群晖NAS如果作为被访问端，需要访问端（例如电脑）同时下载安装 Tailscale 并授权设备登录成功后才能通过被访问端（群晖NAS） 的 &lt;strong&gt;Tailscale IP&lt;/strong&gt; 或 ** 设备名** 进行远程访问。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;OpenWrt 安装使用 Tailscale&lt;a href=&quot;#openwrt-安装使用-tailscale&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;SSH 终端进入 Open­Wrt ，下载 &lt;code&gt;openwrt-tailscale-enabler&lt;/code&gt; -&amp;gt; &lt;a href=&quot;https://github.com/adyanth/openwrt-tailscale-enabler/releases&quot; target=&quot;_blank&quot;&gt;Releases 发布页面&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 进入 tmp 目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd /tmp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 下载 openwrt-tailscale-enabler&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget https://github.com/adyanth/openwrt-tailscale-enabler/releases/download/v1.12.3-8f0308e-autoupdate/openwrt-tailscale-enabler-v1.12.3-8f0308e-autoupdate.tgz&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;提取文件覆盖到系统根目录：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tar x -zvC / -f openwrt-tailscale-enabler-v1.12.3-8f0308e-autoupdate.tgz&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;安装依赖：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 更新包列表&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;opkg update&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装依赖&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;opkg install libustream-openssl ca-bundle kmod-tun&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;首次运行：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 启动 tailscale 守护进程&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/etc/init.d/tailscale start&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 屏幕打印 tailscale 登录地址，进行授权登录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tailscale up --accept-dns=false&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;运行以上两个命令，会自动在 &lt;code&gt;/tmp&lt;/code&gt; 目录下载 tailscale 包文件包含了 &lt;code&gt;tailscale&lt;/code&gt; 和 &lt;code&gt;tailscaled&lt;/code&gt; 二进制文件，并自动解压、移动到 &lt;code&gt;/usr/bin&lt;/code&gt; 目录。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;可能出现的问题：例如 Open­Wrt x86_64 平台会请求下载 &lt;code&gt;tailscale_1.12.3_x86_64.tgz&lt;/code&gt; 包文件（实际发布页并无此包而导致报错），需要自行在 &lt;a href=&quot;https://pkgs.tailscale.com/stable/&quot; target=&quot;_blank&quot;&gt;版本发布页&lt;/a&gt; 下载 &lt;a href=&quot;https://pkgs.tailscale.com/stable/tailscale_1.12.3_amd64.tgz&quot; target=&quot;_blank&quot;&gt;tailscale_1.12.3_amd64.tgz&lt;/a&gt; 到&lt;code&gt;/tmp&lt;/code&gt;目录解压，并将 &lt;code&gt;tailscale&lt;/code&gt; 和 &lt;code&gt;tailscaled&lt;/code&gt; 二进制文件移动到 &lt;code&gt;/usr/bin&lt;/code&gt; 目录，最后再重新执行上面两行命令即可。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;开机启动：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 加入开机启动&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/etc/init.d/tailscale enable&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 验证是否成功加入开机启动项：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ls /etc/rc.d/S*tailscale*&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;版本更新：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在 &lt;a href=&quot;https://pkgs.tailscale.com/stable/#static&quot; target=&quot;_blank&quot;&gt;这里&lt;/a&gt; 找到适应平台架构的包文件，下载解压替换 Open­Wrt 中的 &lt;code&gt;/usr/bin/tailscale&lt;/code&gt; 和 &lt;code&gt;/usr/bin/tailscaled&lt;/code&gt; 这两个文件。&lt;/p&gt;&lt;p&gt;关于设备的 &lt;strong&gt;Tailscale IP&lt;/strong&gt;，可运行 &lt;code&gt;ip addr show tailscale0&lt;/code&gt; 命令获取。或者访问 &lt;a href=&quot;https://login.tailscale.com/admin/machines&quot; target=&quot;_blank&quot;&gt;管理面板&lt;/a&gt; 在 &lt;strong&gt;Machines&lt;/strong&gt;（设备列表）中查看。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Docker 安装使用 Tailscale&lt;a href=&quot;#docker-安装使用-tailscale&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;官方提供了 Dockerfile  -&amp;gt; &lt;a href=&quot;https://github.com/tailscale/tailscale/blob/main/Dockerfile&quot; target=&quot;_blank&quot;&gt;传送门&lt;/a&gt;，大家可以自行构建 docker 镜像来运行容器，也可以直接使用 &lt;code&gt;fastandfearless/tailscale&lt;/code&gt;这个镜像，安装使用如下：&lt;/p&gt;&lt;p&gt;创建并运行容器：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker run -d --name=tailscaled -v /var/lib:/var/lib -v /dev/net/tun:/dev/net/tun --network=host --privileged fastandfearless/tailscale tailscaled&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;验证机器并将其连接到 Tailscale 网络：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 屏幕打印 tailscale 登录地址，进行授权登录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker exec tailscaled tailscale up&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;获取设备的 Tailscale IP 地址：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ip addr show tailscale0&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;查看设备状态：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker exec tailscaled tailscale status&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;CentOS 7 安装 Tailscale&lt;a href=&quot;#centos-7-安装-tailscale&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;注：该软件包支持 x86 和 ARM CPU 架构，包括 32 位和 64 位系统。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;安装 yum-utils&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum install yum-utils&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;添加 YUM 源，并安装 Tailscale&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum-config-manager --add-repo https://pkgs.tailscale.com/stable/centos/7/tailscale.repo&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum install tailscale&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;添加开机启动，并启动服务&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl enable --now tailscaled&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;验证机器并将其连接到 Tailscale 网络&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tailscale up&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;复制屏幕打印的登录地址，使用浏览器访问进行授权登录。如果使用&lt;code&gt;@gmail.com&lt;/code&gt;地址登录，则会自动获得授权。&lt;/p&gt;&lt;p&gt;获取设备的 Tailscale IP 地址&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ip addr show tailscale0&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;在其他终端设备安装 Tailscale&lt;a href=&quot;#在其他终端设备安装-tailscale&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Tailscale 目前已支持了 Linux 、macOS、iOS、Windows、Android、Synology、Raspberry Pi &amp;amp; ARM 等平台，几乎做到了终端设备的全面覆盖。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;终端全覆盖.png&quot; loading=&quot;lazy&quot; width=&quot;1084&quot; height=&quot;418&quot; src=&quot;/_astro/4796_3838585382_309fb4.DMyPbc7D_22lFaK.webp&quot; srcset=&quot;/_astro/4796_3838585382_309fb4.DMyPbc7D_1jTAso.webp 640w, /_astro/4796_3838585382_309fb4.DMyPbc7D_ZHnRog.webp 750w, /_astro/4796_3838585382_309fb4.DMyPbc7D_Z1LS6v.webp 828w, /_astro/4796_3838585382_309fb4.DMyPbc7D_1CD4nH.webp 1080w, /_astro/4796_3838585382_309fb4.DMyPbc7D_22lFaK.webp 1084w&quot; /&gt;&lt;figcaption&gt;终端全覆盖.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;在 &lt;a href=&quot;https://tailscale.com/&quot; target=&quot;_blank&quot;&gt;Tailscale 下载中心&lt;/a&gt; 选择下载对应平台的应用，并通过登录同一个账号使设备都在同一个虚拟局域网内，只有加入局域网的设备才支持设备间的连接。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;局域网内部分终端设备不支持安装 Tailscale，该怎么办？&lt;/strong&gt; 并非所有设备都需要安装 Tailscale，只需要确保在同一个局域网内至少有一个设备安装通过内网转发也能实现对内网其他设备的访问。以其中一台 Linux 设备作为** 子网路由网关**为例，操作如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 设置IP转发&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat &amp;gt;&amp;gt; /etc/sysctl.conf &amp;lt;&amp;lt;EOF&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;net.ipv4.ip_forward = 1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;net.ipv6.conf.all.forwarding = 1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;EOF&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 使配置生效&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sysctl -p /etc/sysctl.conf&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;将局域网所在内网网段暴露给 Tailscale：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tailscale up --advertise-routes=192.168.2.0/24&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;注：上面命令行中&lt;code&gt;192.168.2.0/24&lt;/code&gt;需要换成自己的局域网网段（免费版仅支持加入一个子网路由网关）。然后进入 tailscale 控制台，找到显示局域网网段地址的机器，点击 -&amp;gt; &lt;strong&gt;Edit route settings&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;111.jpg&quot; loading=&quot;lazy&quot; width=&quot;2360&quot; height=&quot;1086&quot; src=&quot;/_astro/4796_3851647808_cb140f.cV3LdVe5_1ecesO.webp&quot; srcset=&quot;/_astro/4796_3851647808_cb140f.cV3LdVe5_1WdLFB.webp 640w, /_astro/4796_3851647808_cb140f.cV3LdVe5_1OyA7D.webp 750w, /_astro/4796_3851647808_cb140f.cV3LdVe5_1oRK9O.webp 828w, /_astro/4796_3851647808_cb140f.cV3LdVe5_Z2wfb0K.webp 1080w, /_astro/4796_3851647808_cb140f.cV3LdVe5_2leMoX.webp 1280w, /_astro/4796_3851647808_cb140f.cV3LdVe5_1jGF26.webp 1668w, /_astro/4796_3851647808_cb140f.cV3LdVe5_1sn5AP.webp 2048w, /_astro/4796_3851647808_cb140f.cV3LdVe5_1ecesO.webp 2360w&quot; /&gt;&lt;figcaption&gt;111.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;开启 &lt;strong&gt;Subnet routes&lt;/strong&gt; 按钮，如下：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;2.jpg&quot; loading=&quot;lazy&quot; width=&quot;2312&quot; height=&quot;726&quot; src=&quot;/_astro/4796_3638215058_ded02a.BmLLw3xB_BN5s0.webp&quot; srcset=&quot;/_astro/4796_3638215058_ded02a.BmLLw3xB_Xyh1I.webp 640w, /_astro/4796_3638215058_ded02a.BmLLw3xB_Z23NE0x.webp 750w, /_astro/4796_3638215058_ded02a.BmLLw3xB_15Y7GX.webp 828w, /_astro/4796_3638215058_ded02a.BmLLw3xB_A6SK.webp 1080w, /_astro/4796_3638215058_ded02a.BmLLw3xB_1JS3Ym.webp 1280w, /_astro/4796_3638215058_ded02a.BmLLw3xB_Z2h4QM9.webp 1668w, /_astro/4796_3638215058_ded02a.BmLLw3xB_Z6L26i.webp 2048w, /_astro/4796_3638215058_ded02a.BmLLw3xB_BN5s0.webp 2312w&quot; /&gt;&lt;figcaption&gt;2.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;通过以上步骤 Windows、macOS、iOS、Android 客户端会自动更新子网路由。而对于 Linux 客户端，默认情况下仅使用Tailscale 的 100.x 地址，不能主动发现新的子网路由，需要运行下面命令行，启用新的子网路由：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tailscale up --accept-routes&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;实际效果：身处天涯海角只要有网络，将设备连接 Tailscale 便能访问 &lt;code&gt;192.168.2.0/24&lt;/code&gt; （你的局域网段）内的所有设备，实际测试晚间时段电信-&amp;gt;联通的网络延迟 600ms 左右延迟会有些高，不要有太高的预期。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;Tailscale 一般每隔 6 个月会要求重新进行身份验证，以确保网络安全。为避免发生这种情况时访问中断，请访问 &lt;a href=&quot;https://login.tailscale.com/admin/machines&quot; target=&quot;_blank&quot;&gt;管理面板&lt;/a&gt; 在 &lt;strong&gt;Machines&lt;/strong&gt; （设备列表）中找到需要禁用的设备，并选择 &lt;strong&gt;Disable Key Expiry&lt;/strong&gt; （禁用密钥过期），让设备免受中断的长期使用下去。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;disable-key-expiry.png&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;393&quot; src=&quot;/_astro/4796_1482516214_a7f3d1.Bc3ZvMZA_1VDRI1.webp&quot; srcset=&quot;/_astro/4796_1482516214_a7f3d1.Bc3ZvMZA_Z1Bbyto.webp 640w, /_astro/4796_1482516214_a7f3d1.Bc3ZvMZA_Z27qPrv.webp 750w, /_astro/4796_1482516214_a7f3d1.Bc3ZvMZA_1y6n5h.webp 828w, /_astro/4796_1482516214_a7f3d1.Bc3ZvMZA_Z222mjn.webp 1080w, /_astro/4796_1482516214_a7f3d1.Bc3ZvMZA_1VDRI1.webp 1280w&quot; /&gt;&lt;figcaption&gt;disable-key-expiry.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&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;体验了一个下午发现 Tailscale 的最大优点是打洞的成功率比 ZeroTier 高太多，缺点CPU占用非常高（非常高），更多骚操作请查看 -&amp;gt; &lt;a href=&quot;https://tailscale.com/kb/guides/&quot; target=&quot;_blank&quot;&gt;官方文档&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>OpenWrt 存储扩容的两种实战方案</title><link>https://blog.moewah.com/posts/4719/</link><guid isPermaLink="true">https://blog.moewah.com/posts/4719/</guid><description>如何为OpenWrt虚拟机扩容存储空间？本文详解在群晖VMM环境下，利用剩余磁盘空间和新增硬盘的两种扩容方法，提供从分区到挂载的完整操作指南，解决软路由存储不足问题。</description><pubDate>Sun, 15 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt; 当我们通过群晖 VMM 虚拟机安装 Open­Wrt 时，默认会分配一个 10GB 的存储空间，而实际情况中 Open­Wrt 存在大量的剩余空间是未被使用的，典型的铺张浪费有木有？Open­Wrt 实际使用容量完全取决于 Open­Wrt 编译时所设置的固件大小。若我们想要充分折腾软路由，则需要对 Open­Wrt 进行扩容。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;OpenWRT.jpg&quot; loading=&quot;lazy&quot; width=&quot;1400&quot; height=&quot;600&quot; src=&quot;/_astro/4719_891509117_3c3552.DhJpZzsR_nEFJC.webp&quot; srcset=&quot;/_astro/4719_891509117_3c3552.DhJpZzsR_1Wz3Mc.webp 640w, /_astro/4719_891509117_3c3552.DhJpZzsR_hrGka.webp 750w, /_astro/4719_891509117_3c3552.DhJpZzsR_vAQ9x.webp 828w, /_astro/4719_891509117_3c3552.DhJpZzsR_ZiXX6e.webp 1080w, /_astro/4719_891509117_3c3552.DhJpZzsR_TNBPx.webp 1280w, /_astro/4719_891509117_3c3552.DhJpZzsR_nEFJC.webp 1400w&quot; /&gt;&lt;figcaption&gt;OpenWRT.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;对于存储空间扩容的思路主要有两种：利用剩余的存储空间或是添加一块新的磁盘进行扩容。本文将以两个小示例分别介绍这两种扩容方案具体的实现步骤，以供大家举一反三。如果你也有扩容的需求，可部分参考本文，其实逻辑上相通。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;OpenWrt 扩容方案&lt;a href=&quot;#openwrt-扩容方案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;注意⚠️：&lt;/strong&gt; 本文教程基于运行的群晖VMM虚拟机，&lt;code&gt;x86_64&lt;/code&gt; 平台 + &lt;code&gt;EXT4&lt;/code&gt; 文件系统的 Open­Wrt；对于&lt;code&gt;squashfs&lt;/code&gt; 文件系统及硬路由的扩容方案可能并不适用。&lt;/p&gt;&lt;/blockquote&gt;&lt;section&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;1.1 如果你怕操作出错，可进入 &lt;strong&gt;虚拟机&lt;/strong&gt; 找到正在运行的 Open­Wrt 虚拟机，点击 &lt;strong&gt;操作&lt;/strong&gt; - &lt;strong&gt;拍快照&lt;/strong&gt; 方便出错时可以快速恢复。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;拍快照.png&quot; loading=&quot;lazy&quot; width=&quot;1034&quot; height=&quot;631&quot; src=&quot;/_astro/4719_2533349917_1781f0.BrBe3d5j_2wqm7j.webp&quot; srcset=&quot;/_astro/4719_2533349917_1781f0.BrBe3d5j_28zQA0.webp 640w, /_astro/4719_2533349917_1781f0.BrBe3d5j_ZLqaY.webp 750w, /_astro/4719_2533349917_1781f0.BrBe3d5j_1R7FMw.webp 828w, /_astro/4719_2533349917_1781f0.BrBe3d5j_2wqm7j.webp 1034w&quot; /&gt;&lt;figcaption&gt;拍快照.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;1.2 通过 Xshell、Putty 等 SSH 终端工具登录 Open­Wrt ，安装磁盘分区工具：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;opkg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;opkg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cfdisk&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fdisk&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;e2fsprogs&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;命令行中 &lt;code&gt;cfdisk&lt;/code&gt; 、&lt;code&gt;fdisk&lt;/code&gt; 均为磁盘分区工具，&lt;code&gt;e2fsprogs&lt;/code&gt;包含了 &lt;code&gt;mkfs&lt;/code&gt; 命令，用于格式化分区。&lt;/p&gt;&lt;/section&gt;&lt;section&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;section&gt;&lt;h4&gt;2.1 创建新分区&lt;a href=&quot;#21-创建新分区&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;SSH 终端运行 &lt;code&gt;cfdisk&lt;/code&gt; 命令进入磁盘分区界面，通过键盘上下键切换到 &lt;strong&gt;Free space&lt;/strong&gt; （剩余空间），左右键切换至 &lt;strong&gt;NEW&lt;/strong&gt; （新增分区），然后按下回车键。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;新增分区.png&quot; loading=&quot;lazy&quot; width=&quot;1015&quot; height=&quot;708&quot; src=&quot;/_astro/4719_4157109727_1d2881.DU2upH49_ZBnvub.webp&quot; srcset=&quot;/_astro/4719_4157109727_1d2881.DU2upH49_Z1XPCDY.webp 640w, /_astro/4719_4157109727_1d2881.DU2upH49_Csr4P.webp 750w, /_astro/4719_4157109727_1d2881.DU2upH49_Z28c8a0.webp 828w, /_astro/4719_4157109727_1d2881.DU2upH49_ZBnvub.webp 1015w&quot; /&gt;&lt;figcaption&gt;新增分区.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;分区类型设置为 &lt;strong&gt;Primary&lt;/strong&gt; （主分区），按下回车键。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;设置为主分区.png&quot; loading=&quot;lazy&quot; width=&quot;1015&quot; height=&quot;708&quot; src=&quot;/_astro/4719_1628992874_40021d.5tEOAK76_Z22GHN1.webp&quot; srcset=&quot;/_astro/4719_1628992874_40021d.5tEOAK76_Z1cCtKj.webp 640w, /_astro/4719_1628992874_40021d.5tEOAK76_1oFzXv.webp 750w, /_astro/4719_1628992874_40021d.5tEOAK76_Z1lXYgk.webp 828w, /_astro/4719_1628992874_40021d.5tEOAK76_Z22GHN1.webp 1015w&quot; /&gt;&lt;figcaption&gt;设置为主分区.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;左右键切换 &lt;strong&gt;Write&lt;/strong&gt; 按下回车键，写入新分区。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;写入分区.png&quot; loading=&quot;lazy&quot; width=&quot;1015&quot; height=&quot;708&quot; src=&quot;/_astro/4719_2780436490_0e1d30.CtTbymq7_Z1YG7dy.webp&quot; srcset=&quot;/_astro/4719_2780436490_0e1d30.CtTbymq7_Z2vzGEl.webp 640w, /_astro/4719_2780436490_0e1d30.CtTbymq7_5In4t.webp 750w, /_astro/4719_2780436490_0e1d30.CtTbymq7_2pfVDz.webp 828w, /_astro/4719_2780436490_0e1d30.CtTbymq7_Z1YG7dy.webp 1015w&quot; /&gt;&lt;figcaption&gt;写入分区.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;输入 &lt;strong&gt;yes&lt;/strong&gt; 按下回车键，确认写入新分区。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;确认写入分区.png&quot; loading=&quot;lazy&quot; width=&quot;1015&quot; height=&quot;708&quot; src=&quot;/_astro/4719_2728827579_ca4376.Bfirb2ZX_Bz0og.webp&quot; srcset=&quot;/_astro/4719_2728827579_ca4376.Bfirb2ZX_2jJ3du.webp 640w, /_astro/4719_2728827579_ca4376.Bfirb2ZX_Z990QC.webp 750w, /_astro/4719_2728827579_ca4376.Bfirb2ZX_2anxHt.webp 828w, /_astro/4719_2728827579_ca4376.Bfirb2ZX_Bz0og.webp 1015w&quot; /&gt;&lt;figcaption&gt;确认写入分区.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;切换 &lt;strong&gt;Quit&lt;/strong&gt; ，按下回车键退出。运行 &lt;code&gt;fdisk -l&lt;/code&gt; 命令，查看是否成功创建新分区。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;查看新分区.png&quot; loading=&quot;lazy&quot; width=&quot;989&quot; height=&quot;373&quot; src=&quot;/_astro/4719_2184849874_0399b1.skJ9GyAi_1S3K73.webp&quot; srcset=&quot;/_astro/4719_2184849874_0399b1.skJ9GyAi_ZPKIWz.webp 640w, /_astro/4719_2184849874_0399b1.skJ9GyAi_Z2tPCHN.webp 750w, /_astro/4719_2184849874_0399b1.skJ9GyAi_Zk3i66.webp 828w, /_astro/4719_2184849874_0399b1.skJ9GyAi_1S3K73.webp 989w&quot; /&gt;&lt;figcaption&gt;查看新分区.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;2.2 格式化新分区&lt;a href=&quot;#22-格式化新分区&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;SSH 终端运行下面的命令，将新分区的文件系统格式化为 &lt;code&gt;ext4&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkfs.ext4 /dev/sda3&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;2.3 挂载新分区&lt;a href=&quot;#23-挂载新分区&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;进入 Open­Wrt 管理后台，依次点击 &lt;strong&gt;系统&lt;/strong&gt; - &lt;strong&gt;挂载点&lt;/strong&gt; 找到并点击全局设置中的 &lt;strong&gt;生成配置&lt;/strong&gt; 。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;生成配置.png&quot; loading=&quot;lazy&quot; width=&quot;1492&quot; height=&quot;767&quot; src=&quot;/_astro/4719_379444779_4facc7.BaAadXdE_2dKnHt.webp&quot; srcset=&quot;/_astro/4719_379444779_4facc7.BaAadXdE_Z1na3o1.webp 640w, /_astro/4719_379444779_4facc7.BaAadXdE_zXvi2.webp 750w, /_astro/4719_379444779_4facc7.BaAadXdE_Z1IRaOG.webp 828w, /_astro/4719_379444779_4facc7.BaAadXdE_ZxbgI6.webp 1080w, /_astro/4719_379444779_4facc7.BaAadXdE_1RTqTq.webp 1280w, /_astro/4719_379444779_4facc7.BaAadXdE_2dKnHt.webp 1492w&quot; /&gt;&lt;figcaption&gt;生成配置.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&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;figure&gt;&lt;img alt=&quot;新分区挂载点.png&quot; loading=&quot;lazy&quot; width=&quot;1486&quot; height=&quot;630&quot; src=&quot;/_astro/4719_2121882048_dca94f.CqTvwfKA_1jn0a7.webp&quot; srcset=&quot;/_astro/4719_2121882048_dca94f.CqTvwfKA_Z2biXfv.webp 640w, /_astro/4719_2121882048_dca94f.CqTvwfKA_l4xL9.webp 750w, /_astro/4719_2121882048_dca94f.CqTvwfKA_zzuF0.webp 828w, /_astro/4719_2121882048_dca94f.CqTvwfKA_2hsdmc.webp 1080w, /_astro/4719_2121882048_dca94f.CqTvwfKA_1AueFr.webp 1280w, /_astro/4719_2121882048_dca94f.CqTvwfKA_1jn0a7.webp 1486w&quot; /&gt;&lt;figcaption&gt;新分区挂载点.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&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;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;调整挂载设置.png&quot; loading=&quot;lazy&quot; width=&quot;1288&quot; height=&quot;757&quot; src=&quot;/_astro/4719_3100466232_da79a9.CWH1ScHq_1RhlAi.webp&quot; srcset=&quot;/_astro/4719_3100466232_da79a9.CWH1ScHq_24Qh9e.webp 640w, /_astro/4719_3100466232_da79a9.CWH1ScHq_Z1K5igH.webp 750w, /_astro/4719_3100466232_da79a9.CWH1ScHq_Z1As2GS.webp 828w, /_astro/4719_3100466232_da79a9.CWH1ScHq_Z2e5bQp.webp 1080w, /_astro/4719_3100466232_da79a9.CWH1ScHq_QCtv3.webp 1280w, /_astro/4719_3100466232_da79a9.CWH1ScHq_1RhlAi.webp 1288w&quot; /&gt;&lt;figcaption&gt;调整挂载设置.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;⚠️ &lt;strong&gt;上面复制得到的命令行不要直接运行！！！不要直接运行！！！否则报错。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;需要手动修改命令行中 &lt;code&gt;mount /dev/sda1 /tmp/extroot&lt;/code&gt; 为 &lt;code&gt;cfdisk&lt;/code&gt; 创建的新分区盘符，例如这里应修改为 &lt;code&gt;mount /dev/sda3 /tmp/extroot&lt;/code&gt;，然后进入 SSH 终端，运行修改后的完整命令行，如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir&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;/tmp/introot&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir&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;/tmp/extroot&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mount&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--bind&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/introot&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mount&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/dev/sda3&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/extroot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;# 修改后&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tar&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;/tmp/introot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-cvf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tar&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;/tmp/extroot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-xf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;umount&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/introot&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;umount&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/extroot&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;回车键到底，直到跑完所有命令行。然后运行 &lt;code&gt;reboot&lt;/code&gt; 重启 Open­Wrt ～&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;扩容成功.png&quot; loading=&quot;lazy&quot; width=&quot;993&quot; height=&quot;445&quot; src=&quot;/_astro/4719_1154790218_c60739.HdbJbY1Z_Z7hTHm.webp&quot; srcset=&quot;/_astro/4719_1154790218_c60739.HdbJbY1Z_Z1tC7rL.webp 640w, /_astro/4719_1154790218_c60739.HdbJbY1Z_1WJ2dt.webp 750w, /_astro/4719_1154790218_c60739.HdbJbY1Z_Z2taJhi.webp 828w, /_astro/4719_1154790218_c60739.HdbJbY1Z_Z7hTHm.webp 993w&quot; /&gt;&lt;figcaption&gt;扩容成功.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;重新进入 SSH 终端运行 &lt;code&gt;df -h&lt;/code&gt; ，如上图表示扩容成功～&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;存储空间扩容成功.png&quot; loading=&quot;lazy&quot; width=&quot;1398&quot; height=&quot;509&quot; src=&quot;/_astro/4719_2239209646_e8d8ac.BFJARi7x_Nb0vC.webp&quot; srcset=&quot;/_astro/4719_2239209646_e8d8ac.BFJARi7x_Z17xKDi.webp 640w, /_astro/4719_2239209646_e8d8ac.BFJARi7x_Kv3tj.webp 750w, /_astro/4719_2239209646_e8d8ac.BFJARi7x_hhbVo.webp 828w, /_astro/4719_2239209646_e8d8ac.BFJARi7x_Z2i9uaN.webp 1080w, /_astro/4719_2239209646_e8d8ac.BFJARi7x_1rn61h.webp 1280w, /_astro/4719_2239209646_e8d8ac.BFJARi7x_Nb0vC.webp 1398w&quot; /&gt;&lt;figcaption&gt;存储空间扩容成功.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&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;section&gt;&lt;h4&gt;3.1 添加新磁盘&lt;a href=&quot;#31-添加新磁盘&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;打开群晖 VMM 找到正在运行的 OpenWrt 虚拟机，选择 &lt;strong&gt;关机&lt;/strong&gt; - &lt;strong&gt;强制停止&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;虚拟机强制关机.png&quot; loading=&quot;lazy&quot; width=&quot;1036&quot; height=&quot;631&quot; src=&quot;/_astro/4719_3923812765_4bb353.L5gCw1qP_ZaBXVw.webp&quot; srcset=&quot;/_astro/4719_3923812765_4bb353.L5gCw1qP_22QKoh.webp 640w, /_astro/4719_3923812765_4bb353.L5gCw1qP_Z6uwmH.webp 750w, /_astro/4719_3923812765_4bb353.L5gCw1qP_1LozAN.webp 828w, /_astro/4719_3923812765_4bb353.L5gCw1qP_ZaBXVw.webp 1036w&quot; /&gt;&lt;figcaption&gt;虚拟机强制关机.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;在 &lt;strong&gt;虚拟机&lt;/strong&gt; 中找到已经停止运行的 OpenWrt 虚拟机，依次选择 &lt;strong&gt;操作&lt;/strong&gt; - &lt;strong&gt;编辑&lt;/strong&gt;，找到 &lt;strong&gt;存储&lt;/strong&gt; 设置项，自定义磁盘空间大小（例如10GB)，点击 &lt;strong&gt;+&lt;/strong&gt; 号，新增一块磁盘，例如 &lt;strong&gt;虚拟盘 2&lt;/strong&gt;（建议勾选空间回收），点击 &lt;strong&gt;确定&lt;/strong&gt; 保存设置。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;虚拟机新增磁盘.png&quot; loading=&quot;lazy&quot; width=&quot;1212&quot; height=&quot;661&quot; src=&quot;/_astro/4719_1136658212_5717b2.CdEGdpaW_Z2k7fe8.webp&quot; srcset=&quot;/_astro/4719_1136658212_5717b2.CdEGdpaW_ZhCY3J.webp 640w, /_astro/4719_1136658212_5717b2.CdEGdpaW_17mWYk.webp 750w, /_astro/4719_1136658212_5717b2.CdEGdpaW_1y6zok.webp 828w, /_astro/4719_1136658212_5717b2.CdEGdpaW_jAVbJ.webp 1080w, /_astro/4719_1136658212_5717b2.CdEGdpaW_Z2k7fe8.webp 1212w&quot; /&gt;&lt;figcaption&gt;虚拟机新增磁盘.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;回到 &lt;strong&gt;虚拟机&lt;/strong&gt; ，点击已停止运行的 OpenWrt 虚拟机，执行 &lt;strong&gt;开机&lt;/strong&gt; 操作。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;重新开机.png&quot; loading=&quot;lazy&quot; width=&quot;1035&quot; height=&quot;629&quot; src=&quot;/_astro/4719_4177350100_1d5eb8.kyLkMmVd_2hKCyp.webp&quot; srcset=&quot;/_astro/4719_4177350100_1d5eb8.kyLkMmVd_Z1j1lQq.webp 640w, /_astro/4719_4177350100_1d5eb8.kyLkMmVd_1643mf.webp 750w, /_astro/4719_4177350100_1d5eb8.kyLkMmVd_Z26dXtb.webp 828w, /_astro/4719_4177350100_1d5eb8.kyLkMmVd_2hKCyp.webp 1035w&quot; /&gt;&lt;figcaption&gt;重新开机.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;3.2 磁盘分区&lt;a href=&quot;#32-磁盘分区&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;SSH 终端连接 OpenWrt，运行下面命令查看磁盘信息&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fdisk -l&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;此时，会显示一个未被使用的磁盘 &lt;code&gt;sdb&lt;/code&gt; 即新磁盘,，屏幕打印信息如下：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;root@OpenWrt:~# fdisk -l&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Disk /dev/sda: 10 GiB, 10737418240 bytes, 20971520 sectors&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Disk model: QEMU HARDDISK&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Units: sectors of 1 * 512 = 512 bytes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Sector size (logical/physical): 512 bytes / 512 bytes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Disklabel type: dos&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Disk identifier: 0x711b2af7&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Device     Boot Start     End Sectors  Size Id Type&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/dev/sda1  *      512   66047   65536   32M 83 Linux&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/dev/sda2       66560 1704959 1638400  800M 83 Linux&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Disk /dev/sdb: 10 GiB, 10737418240 bytes, 20971520 sectors&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Disk model: QEMU HARDDISK&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Units: sectors of 1 * 512 = 512 bytes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Sector size (logical/physical): 512 bytes / 512 bytes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;若要使用这块新磁盘，就需要对新磁盘进行分区，运行以下命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fdisk /dev/sdb&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;创建一个主分区，分区操作步骤如下：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;root@OpenWrt:~# fdisk /dev/sdb&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Welcome to fdisk (util-linux 2.37).&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Changes will remain in memory only, until you decide to write them.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Be careful before using the write command.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Device does not contain a recognized partition table.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Created a new DOS disklabel with disk identifier 0x1d291a31.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Command (m for help): n （输入 n 创建分区）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Partition type&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;p   primary (0 primary, 0 extended, 4 free)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;e   extended (container for logical partitions)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Select (default p): p （输入 p 创建主分区）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Partition number (1-4, default 1): （回车键，默认创建一个分区）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;First sector (2048-20971519, default 2048): （回车键）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-20971519, default 20971519):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Created a new partition 1 of type &apos;Linux&apos; and of size 10 GiB.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Command (m for help): w （输入 w 写入分区表）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;The partition table has been altered.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Calling ioctl() to re-read partition table.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Syncing disks.&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;查看磁盘信息：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fdisk -l&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;屏幕打印信息如下：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;root@OpenWrt:~# fdisk -l&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Disk /dev/sda: 10 GiB, 10737418240 bytes, 20971520 sectors&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Disk model: QEMU HARDDISK&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Units: sectors of 1 * 512 = 512 bytes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Sector size (logical/physical): 512 bytes / 512 bytes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Disklabel type: dos&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Disk identifier: 0x711b2af7&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Device     Boot Start     End Sectors  Size Id Type&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/dev/sda1  *      512   66047   65536   32M 83 Linux&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/dev/sda2       66560 1704959 1638400  800M 83 Linux&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Disk /dev/sdb: 10 GiB, 10737418240 bytes, 20971520 sectors&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Disk model: QEMU HARDDISK&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Units: sectors of 1 * 512 = 512 bytes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Sector size (logical/physical): 512 bytes / 512 bytes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Disklabel type: dos&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Disk identifier: 0x1d291a31&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Device     Boot Start      End  Sectors Size Id Type&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/dev/sdb1        2048 20971519 20969472  10G 83 Linux&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;其中 &lt;code&gt;/dev/sdb1&lt;/code&gt; 即新创建的新分区分配的盘符&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;3.3 格式化&lt;a href=&quot;#33-格式化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;将分区格式化 ext4 文件系统：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkfs.ext4&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/dev/sdb1&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;3.4 挂载分区&lt;a href=&quot;#34-挂载分区&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;进入 Open­Wrt 管理后台，依次点击 &lt;strong&gt;系统&lt;/strong&gt; - &lt;strong&gt;挂载点&lt;/strong&gt; 找到并点击全局设置中的 &lt;strong&gt;生成配置&lt;/strong&gt; 。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;生成配置识别分区.png&quot; loading=&quot;lazy&quot; width=&quot;1626&quot; height=&quot;719&quot; src=&quot;/_astro/4719_3510311898_72b54e.COHhpXSi_ZhGJFj.webp&quot; srcset=&quot;/_astro/4719_3510311898_72b54e.COHhpXSi_Z2d14iH.webp 640w, /_astro/4719_3510311898_72b54e.COHhpXSi_WrQIl.webp 750w, /_astro/4719_3510311898_72b54e.COHhpXSi_ZeXo2E.webp 828w, /_astro/4719_3510311898_72b54e.COHhpXSi_28QfIr.webp 1080w, /_astro/4719_3510311898_72b54e.COHhpXSi_23ygz8.webp 1280w, /_astro/4719_3510311898_72b54e.COHhpXSi_ZhGJFj.webp 1626w&quot; /&gt;&lt;figcaption&gt;生成配置识别分区.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&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;figure&gt;&lt;img alt=&quot;挂载点.png&quot; loading=&quot;lazy&quot; width=&quot;1623&quot; height=&quot;589&quot; src=&quot;/_astro/4719_41925287_7afdc7.C6hIbBmH_Z2dwzcV.webp&quot; srcset=&quot;/_astro/4719_41925287_7afdc7.C6hIbBmH_Z5vHgX.webp 640w, /_astro/4719_41925287_7afdc7.C6hIbBmH_14ddqJ.webp 750w, /_astro/4719_41925287_7afdc7.C6hIbBmH_kTpa2.webp 828w, /_astro/4719_41925287_7afdc7.C6hIbBmH_1SrkpJ.webp 1080w, /_astro/4719_41925287_7afdc7.C6hIbBmH_2v2QVJ.webp 1280w, /_astro/4719_41925287_7afdc7.C6hIbBmH_Z2dwzcV.webp 1623w&quot; /&gt;&lt;figcaption&gt;挂载点.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&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;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;修改挂载点.png&quot; loading=&quot;lazy&quot; width=&quot;1622&quot; height=&quot;753&quot; src=&quot;/_astro/4719_120691664_317770.C46IhRD0_Zg4gGe.webp&quot; srcset=&quot;/_astro/4719_120691664_317770.C46IhRD0_ZDt66w.webp 640w, /_astro/4719_120691664_317770.C46IhRD0_Z2f1GUR.webp 750w, /_astro/4719_120691664_317770.C46IhRD0_WupVV.webp 828w, /_astro/4719_120691664_317770.C46IhRD0_ZBqB3o.webp 1080w, /_astro/4719_120691664_317770.C46IhRD0_2tUD9O.webp 1280w, /_astro/4719_120691664_317770.C46IhRD0_Zg4gGe.webp 1622w&quot; /&gt;&lt;figcaption&gt;修改挂载点.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;⚠️ &lt;strong&gt;上面复制得到的命令行不要直接运行！！！不要直接运行！！！否则报错。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;需要手动修改命令行中 &lt;code&gt;mount /dev/sda1 /tmp/extroot&lt;/code&gt; 为 &lt;code&gt;fdisk&lt;/code&gt; 创建的新分区盘符，例如这里应修改为 &lt;code&gt;mount /dev/sdb1 /tmp/extroot&lt;/code&gt;，然后进入 SSH 终端，运行修改后的完整命令行，如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir&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;/tmp/introot&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir&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;/tmp/extroot&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mount&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--bind&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/introot&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mount&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/dev/sdb1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/extroot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;# 修改后&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tar&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;/tmp/introot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-cvf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tar&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;/tmp/extroot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-xf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;umount&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/introot&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;umount&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/extroot&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;回车键到底，直到跑完所有命令行。然后运行 &lt;code&gt;reboot&lt;/code&gt; 重启 Open­Wrt ～&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;扩容成功显示.png&quot; loading=&quot;lazy&quot; width=&quot;1617&quot; height=&quot;491&quot; src=&quot;/_astro/4719_238591573_458a86.Tj0fItKk_1uzzDs.webp&quot; srcset=&quot;/_astro/4719_238591573_458a86.Tj0fItKk_1NQsps.webp 640w, /_astro/4719_238591573_458a86.Tj0fItKk_1E09Dq.webp 750w, /_astro/4719_238591573_458a86.Tj0fItKk_ZQvlFy.webp 828w, /_astro/4719_238591573_458a86.Tj0fItKk_ZuieIP.webp 1080w, /_astro/4719_238591573_458a86.Tj0fItKk_Pya7g.webp 1280w, /_astro/4719_238591573_458a86.Tj0fItKk_1uzzDs.webp 1617w&quot; /&gt;&lt;figcaption&gt;扩容成功显示.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&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;以上就是喵斯基部落提供的关于 OpenWrt 存储空间扩容的两个简单的示例，如果你使用的 OpenWrt 是 &lt;code&gt;EXT4&lt;/code&gt; 文件系统可参考本文示例，但需要留意盘符可能有所不同，切勿完全照搬。如果使用的是 &lt;code&gt;squashfs&lt;/code&gt; 文件系统那么挂载点需要设置为&lt;code&gt;/overlay&lt;/code&gt;作为 overlay 分区使用。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>OpenWrt 远程访问：DDNS+ZeroTier 一键打通内外网</title><link>https://blog.moewah.com/posts/4106/</link><guid isPermaLink="true">https://blog.moewah.com/posts/4106/</guid><description>如何实现家中的 Emby、Jellyfin 或 Nextcloud 从外网访问？本文详解通过 OpenWrt 配置 DDNS 动态解析与 ZeroTier 虚拟局域网的完整方案，解决无公网IP设备远程访问难题。</description><pubDate>Sun, 25 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt; 当我们在家中的设备中部署安装了 Emby、Jellyfin 等影音平台又或者是搭建了 nextcloud 个人云盘等程序，以往这些只能通过局域网才能进行内部访问，而现在你可以通过给路由器或设备配置DDNS动态解析（有公网IP）以及ZeroTier（无公网IP）就能达到远程访问的目的。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;openwrt.png&quot; loading=&quot;lazy&quot; width=&quot;860&quot; height=&quot;400&quot; src=&quot;/_astro/4106_30968971_69d812.CMrA-1Zh_Z1SJlKv.webp&quot; srcset=&quot;/_astro/4106_30968971_69d812.CMrA-1Zh_Z85y5R.webp 640w, /_astro/4106_30968971_69d812.CMrA-1Zh_15KBR.webp 750w, /_astro/4106_30968971_69d812.CMrA-1Zh_Z26Pkgb.webp 828w, /_astro/4106_30968971_69d812.CMrA-1Zh_Z1SJlKv.webp 860w&quot; /&gt;&lt;figcaption&gt;openwrt.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;一、DDNS 动态解析&lt;a href=&quot;#一ddns-动态解析&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;通常 OpenWrt 自带 ddns 插件（动态DNS）默认支持较多的DDNS 服务提供商其中也包括我一直使用的 HE.NET，考虑到如果要以 HE.NET 为例进行介绍篇幅太长，就算介绍完如何更换DNS解析平台、创建域名、生成 Key这些内容还只是个开头，想了想就此作罢，退而求其次就简单介绍一下两款国内常用的DSNS插件吧。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;配置阿里云 AliDDNS&lt;a href=&quot;#配置阿里云-aliddns&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;登录&lt;a href=&quot;https://www.aliyun.com/&quot; target=&quot;_blank&quot;&gt;阿里云&lt;/a&gt;，注册域名（具体步骤不赘述了）需要通过实名认证才可以进行域名解析等操作&lt;/p&gt;&lt;section&gt;&lt;h4&gt;创建Access Key&lt;a href=&quot;#创建access-key&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;进入「控制台」，鼠标移动到个人头像，点击「AccessKey管理」；&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;aliddns-1.png&quot; loading=&quot;lazy&quot; width=&quot;1094&quot; height=&quot;533&quot; src=&quot;/_astro/4106_2888858015_6418b5.Cfm_sALS_1wId9w.webp&quot; srcset=&quot;/_astro/4106_2888858015_6418b5.Cfm_sALS_Z29lVnw.webp 640w, /_astro/4106_2888858015_6418b5.Cfm_sALS_ZQUfpe.webp 750w, /_astro/4106_2888858015_6418b5.Cfm_sALS_Z18Urr0.webp 828w, /_astro/4106_2888858015_6418b5.Cfm_sALS_XjlXe.webp 1080w, /_astro/4106_2888858015_6418b5.Cfm_sALS_1wId9w.webp 1094w&quot; /&gt;&lt;figcaption&gt;aliddns-1.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;点击「使用子用户AccessKey」&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;aliddns-2.png&quot; loading=&quot;lazy&quot; width=&quot;1091&quot; height=&quot;544&quot; src=&quot;/_astro/4106_3371932747_586d4b.CDh36Zvf_Z2bfBf9.webp&quot; srcset=&quot;/_astro/4106_3371932747_586d4b.CDh36Zvf_Z26vJrn.webp 640w, /_astro/4106_3371932747_586d4b.CDh36Zvf_ZaYDsG.webp 750w, /_astro/4106_3371932747_586d4b.CDh36Zvf_Z2pFtYA.webp 828w, /_astro/4106_3371932747_586d4b.CDh36Zvf_Z2l0UP5.webp 1080w, /_astro/4106_3371932747_586d4b.CDh36Zvf_Z2bfBf9.webp 1091w&quot; /&gt;&lt;figcaption&gt;aliddns-2.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;创建用户，填入登录名称和显示名称（随意填写），点击「确定」&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;aliddns-3.png&quot; loading=&quot;lazy&quot; width=&quot;845&quot; height=&quot;344&quot; src=&quot;/_astro/4106_81699584_c3b3c8.BxmPuvtE_1lfGS0.webp&quot; srcset=&quot;/_astro/4106_81699584_c3b3c8.BxmPuvtE_Z1BEPn8.webp 640w, /_astro/4106_81699584_c3b3c8.BxmPuvtE_Z26flJc.webp 750w, /_astro/4106_81699584_c3b3c8.BxmPuvtE_DxNuz.webp 828w, /_astro/4106_81699584_c3b3c8.BxmPuvtE_1lfGS0.webp 845w&quot; /&gt;&lt;figcaption&gt;aliddns-3.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;img alt=&quot;aliddns-4.png&quot; loading=&quot;lazy&quot; width=&quot;1137&quot; height=&quot;342&quot; src=&quot;/_astro/4106_1599656616_bcf94e.DnY-OVsu_ZzQq7O.webp&quot; srcset=&quot;/_astro/4106_1599656616_bcf94e.DnY-OVsu_27fKLH.webp 640w, /_astro/4106_1599656616_bcf94e.DnY-OVsu_27JUCR.webp 750w, /_astro/4106_1599656616_bcf94e.DnY-OVsu_Z2optX5.webp 828w, /_astro/4106_1599656616_bcf94e.DnY-OVsu_1WhWpv.webp 1080w, /_astro/4106_1599656616_bcf94e.DnY-OVsu_ZzQq7O.webp 1137w&quot; /&gt;&lt;figcaption&gt;aliddns-4.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;在「系统策略」中输入&lt;code&gt;AliyunDNSFullAccess&lt;/code&gt; ，点选&lt;code&gt;AliyunDNSFullAccess&lt;/code&gt;添加，并点击「确定」。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;aliddns-5.png&quot; loading=&quot;lazy&quot; width=&quot;836&quot; height=&quot;561&quot; src=&quot;/_astro/4106_4177766968_921456._m5OMhlP_gqiGX.webp&quot; srcset=&quot;/_astro/4106_4177766968_921456._m5OMhlP_Tlg7E.webp 640w, /_astro/4106_4177766968_921456._m5OMhlP_U35V7.webp 750w, /_astro/4106_4177766968_921456._m5OMhlP_ZfcDXt.webp 828w, /_astro/4106_4177766968_921456._m5OMhlP_gqiGX.webp 836w&quot; /&gt;&lt;figcaption&gt;aliddns-5.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;为子用户创建 AccessKey&lt;a href=&quot;#为子用户创建-accesskey&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;aliddns-6.png&quot; loading=&quot;lazy&quot; width=&quot;1272&quot; height=&quot;760&quot; src=&quot;/_astro/4106_97099884_f6f9b0.Dq4_FvCK_1ekywq.webp&quot; srcset=&quot;/_astro/4106_97099884_f6f9b0.Dq4_FvCK_Vb7v3.webp 640w, /_astro/4106_97099884_f6f9b0.Dq4_FvCK_1imurg.webp 750w, /_astro/4106_97099884_f6f9b0.Dq4_FvCK_1GmP6g.webp 828w, /_astro/4106_97099884_f6f9b0.Dq4_FvCK_qOuEy.webp 1080w, /_astro/4106_97099884_f6f9b0.Dq4_FvCK_1ekywq.webp 1272w&quot; /&gt;&lt;figcaption&gt;aliddns-6.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;保存好个人的&lt;code&gt;AccessKey ID&lt;/code&gt;、&lt;code&gt;AccessKey Secret&lt;/code&gt;，OpenWrt 插件配置会用到。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;aliddns-7.png&quot; loading=&quot;lazy&quot; width=&quot;1070&quot; height=&quot;652&quot; src=&quot;/_astro/4106_3228207752_5db99f.DRqfSHF7_20r0pA.webp&quot; srcset=&quot;/_astro/4106_3228207752_5db99f.DRqfSHF7_Z2e5F1q.webp 640w, /_astro/4106_3228207752_5db99f.DRqfSHF7_GJb1w.webp 750w, /_astro/4106_3228207752_5db99f.DRqfSHF7_BWDuT.webp 828w, /_astro/4106_3228207752_5db99f.DRqfSHF7_20r0pA.webp 1070w&quot; /&gt;&lt;figcaption&gt;aliddns-7.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;添加 A 记录&lt;a href=&quot;#添加-a-记录&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;找到域名解析设置，添加一条A记录&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;aliddns-8.png&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1303&quot; src=&quot;/_astro/4106_3376317528_f1c460.gK8NH9j8_ZleWCt.webp&quot; srcset=&quot;/_astro/4106_3376317528_f1c460.gK8NH9j8_1ge4.webp 640w, /_astro/4106_3376317528_f1c460.gK8NH9j8_1Wyhvo.webp 750w, /_astro/4106_3376317528_f1c460.gK8NH9j8_nc1cL.webp 828w, /_astro/4106_3376317528_f1c460.gK8NH9j8_2avAXd.webp 1080w, /_astro/4106_3376317528_f1c460.gK8NH9j8_1iv9ah.webp 1280w, /_astro/4106_3376317528_f1c460.gK8NH9j8_Z1wL0a4.webp 1668w, /_astro/4106_3376317528_f1c460.gK8NH9j8_19AEbc.webp 2048w, /_astro/4106_3376317528_f1c460.gK8NH9j8_ZleWCt.webp 2560w&quot; /&gt;&lt;figcaption&gt;aliddns-8.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;OpenWrt 插件设置&lt;a href=&quot;#openwrt-插件设置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;blockquote&gt;&lt;p&gt;OpenWrt AliDDNS 插件下载 ｜ &lt;a href=&quot;https://github.com/honwen/luci-app-aliddns/releases/download/v20210117/luci-app-aliddns_0.4.0-1_all.ipk&quot; target=&quot;_blank&quot;&gt;点击下载&lt;/a&gt; ，安装过程不做赘述，请自行下载安装。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;进入 OpenWrt 管理后台，在左侧导航中找到「AliDDNS」进行插件设置，参考如下：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;aliddns-9.png&quot; loading=&quot;lazy&quot; width=&quot;1215&quot; height=&quot;831&quot; src=&quot;/_astro/4106_229451118_7b5085.DN8xWPrh_ZCaNdP.webp&quot; srcset=&quot;/_astro/4106_229451118_7b5085.DN8xWPrh_Z1FPcXH.webp 640w, /_astro/4106_229451118_7b5085.DN8xWPrh_S6noo.webp 750w, /_astro/4106_229451118_7b5085.DN8xWPrh_Zh9mvc.webp 828w, /_astro/4106_229451118_7b5085.DN8xWPrh_11lDpP.webp 1080w, /_astro/4106_229451118_7b5085.DN8xWPrh_ZCaNdP.webp 1215w&quot; /&gt;&lt;figcaption&gt;aliddns-9.png&lt;/figcaption&gt;&lt;/figure&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;将此前获得的ID和Secret填入相应的区域。&lt;/li&gt;
&lt;li&gt;设置「WAN-IP来源」（wan/internet，建议设置wan）；&lt;/li&gt;
&lt;li&gt;设置「主域名」（例如: test.github.com 则填: github.com）&lt;/li&gt;
&lt;li&gt;设置「子域名」（例如: test.github.com, 则填: test）；&lt;/li&gt;
&lt;li&gt;「检查时间」（若WAN-IP来源选择internet则建议检查时间填写5分钟，否则建议填写1分钟）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;最后，「保存并应用」，查看更新域名记录。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;配置腾讯云 DDNS（推荐）&lt;a href=&quot;#配置腾讯云-ddns推荐&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;登录-&amp;gt;&lt;a href=&quot;https://cloud.tencent.com/&quot; target=&quot;_blank&quot;&gt;腾讯云&lt;/a&gt;，注册域名（具体步骤不赘述了）需要通过实名认证后才可以进行域名解析等操作。&lt;/p&gt;&lt;section&gt;&lt;h4&gt;添加 A 记录&lt;a href=&quot;#添加-a-记录-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;使用腾讯云的账号登录 &lt;a href=&quot;https://www.dnspod.cn/&quot; target=&quot;_blank&quot;&gt;DNSPOD 域名解析平台&lt;/a&gt;，在「我的域名」找到自己的域名，点击「解析」，&lt;strong&gt;添加记录&lt;/strong&gt; ：主机记录（随意填写）、记录类型（A记录）、线路类型（默认）、记录值（IP随意填写）、TTL（最低允许600），如下：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;dnspod-1.png&quot; loading=&quot;lazy&quot; width=&quot;1238&quot; height=&quot;323&quot; src=&quot;/_astro/4106_3392074564_fb2f60.BoRwVZnB_28Qc0x.webp&quot; srcset=&quot;/_astro/4106_3392074564_fb2f60.BoRwVZnB_ls8mK.webp 640w, /_astro/4106_3392074564_fb2f60.BoRwVZnB_Z15dckA.webp 750w, /_astro/4106_3392074564_fb2f60.BoRwVZnB_ZAORxY.webp 828w, /_astro/4106_3392074564_fb2f60.BoRwVZnB_2kNm1S.webp 1080w, /_astro/4106_3392074564_fb2f60.BoRwVZnB_28Qc0x.webp 1238w&quot; /&gt;&lt;figcaption&gt;dnspod-1.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;填写完成后，点击确认。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;创建 DNSPod Token&lt;a href=&quot;#创建-dnspod-token&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;腾讯云 API 密钥 -&amp;gt;&lt;a href=&quot;https://console.dnspod.cn/account/token&quot; target=&quot;_blank&quot;&gt;传送门&lt;/a&gt;，点击「DNSPod Token」，然后「创建密钥」。随意填写一下密钥名称，这时会自动生成密钥相关信息包含ID、Token，切记一定要保存好你的ID、Token信息，OpenWrt 插件配置会用到。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;dnspod-2.png&quot; loading=&quot;lazy&quot; width=&quot;973&quot; height=&quot;536&quot; src=&quot;/_astro/4106_2433488876_150750.DA8oX0Hd_ZuvXvU.webp&quot; srcset=&quot;/_astro/4106_2433488876_150750.DA8oX0Hd_Zva9AH.webp 640w, /_astro/4106_2433488876_150750.DA8oX0Hd_Z1xr1ES.webp 750w, /_astro/4106_2433488876_150750.DA8oX0Hd_ZK185l.webp 828w, /_astro/4106_2433488876_150750.DA8oX0Hd_ZuvXvU.webp 973w&quot; /&gt;&lt;figcaption&gt;dnspod-2.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;OpenWrt 插件设置&lt;a href=&quot;#openwrt-插件设置-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;blockquote&gt;&lt;p&gt;OpenWrt 腾讯云 DDNS插件下载地址 —&amp;gt; &lt;a href=&quot;http://openwrt-tencentddns-1301800460.cos.ap-guangzhou.myqcloud.com/luci-app-tencentddns_0.1.0-1_all.ipk&quot; target=&quot;_blank&quot;&gt;点击下载&lt;/a&gt; ，安装过程不做赘述，请自行下载安装。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;进入 OpenWrt 管理后台，在左侧导航中找到「腾讯云 DDNS」进行插件设置，参考如下（插件版本变化可能导致面板设置有所不同，但区别并不大）：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;dnspod-3.png&quot; loading=&quot;lazy&quot; width=&quot;1164&quot; height=&quot;863&quot; src=&quot;/_astro/4106_817639027_ec201d.DZAIRRCs_RNJ0T.webp&quot; srcset=&quot;/_astro/4106_817639027_ec201d.DZAIRRCs_1kEyEy.webp 640w, /_astro/4106_817639027_ec201d.DZAIRRCs_Z13IOOf.webp 750w, /_astro/4106_817639027_ec201d.DZAIRRCs_Z2g23qD.webp 828w, /_astro/4106_817639027_ec201d.DZAIRRCs_Z2sA8To.webp 1080w, /_astro/4106_817639027_ec201d.DZAIRRCs_RNJ0T.webp 1164w&quot; /&gt;&lt;figcaption&gt;dnspod-3.png&lt;/figcaption&gt;&lt;/figure&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;将此前创建好的ID和Token填入相应的区域。&lt;/li&gt;
&lt;li&gt;设置「WAN-IP来源」（wan/internet，建议设置wan）；&lt;/li&gt;
&lt;li&gt;设置「主域名」（例如: test.github.com 则填: github.com）&lt;/li&gt;
&lt;li&gt;设置「子域名」（例如: test.github.com, 则填: test）；&lt;/li&gt;
&lt;li&gt;「检查时间」（若WAN-IP来源选择internet则建议检查时间填写5分钟，否则建议填写1分钟）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;最后，「保存并应用」，查看更新域名记录。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&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;协议&lt;/th&gt;&lt;th&gt;外部区域&lt;/th&gt;&lt;th&gt;外部端口&lt;/th&gt;&lt;th&gt;内部区域&lt;/th&gt;&lt;th&gt;内部IP地址&lt;/th&gt;&lt;th&gt;内部端口&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;LUCI&lt;/td&gt;&lt;td&gt;TCP&lt;/td&gt;&lt;td&gt;WAN&lt;/td&gt;&lt;td&gt;9080&lt;/td&gt;&lt;td&gt;LAN&lt;/td&gt;&lt;td&gt;192.168.0.1&lt;/td&gt;&lt;td&gt;80&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SSH&lt;/td&gt;&lt;td&gt;TCP+UDP&lt;/td&gt;&lt;td&gt;WAN&lt;/td&gt;&lt;td&gt;9022&lt;/td&gt;&lt;td&gt;LAN&lt;/td&gt;&lt;td&gt;192.168.0.1&lt;/td&gt;&lt;td&gt;22&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;blockquote&gt;&lt;p&gt;注：OpenWrt 默认使用的Web端口为&lt;code&gt;80&lt;/code&gt;端口被封禁，这里通过外部使用&lt;code&gt;9080&lt;/code&gt;端口转发；SSH默认为&lt;code&gt;22&lt;/code&gt;端口，这里使用外部&lt;code&gt;9022&lt;/code&gt;端口进行转发。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;例如，端口转发 emby 默认端口 &lt;code&gt;8096&lt;/code&gt; ，这里建议外部端口和内部端口保持一致：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;端口转发-emby.png&quot; loading=&quot;lazy&quot; width=&quot;1278&quot; height=&quot;139&quot; src=&quot;/_astro/4106_3762673381_aad7af.DM1mErJn_Z27jlyV.webp&quot; srcset=&quot;/_astro/4106_3762673381_aad7af.DM1mErJn_Z1r1bYQ.webp 640w, /_astro/4106_3762673381_aad7af.DM1mErJn_10ctpY.webp 750w, /_astro/4106_3762673381_aad7af.DM1mErJn_101tWB.webp 828w, /_astro/4106_3762673381_aad7af.DM1mErJn_Z1KHTF5.webp 1080w, /_astro/4106_3762673381_aad7af.DM1mErJn_Z27jlyV.webp 1278w&quot; /&gt;&lt;figcaption&gt;端口转发-emby.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&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;/p&gt;&lt;figure&gt;&lt;img alt=&quot;防火墙1.png&quot; loading=&quot;lazy&quot; width=&quot;797&quot; height=&quot;476&quot; src=&quot;/_astro/4106_1216359930_865398.BxJwJHc__2flOLo.webp&quot; srcset=&quot;/_astro/4106_1216359930_865398.BxJwJHc__Z1d1p2M.webp 640w, /_astro/4106_1216359930_865398.BxJwJHc__Z28r89V.webp 750w, /_astro/4106_1216359930_865398.BxJwJHc__2flOLo.webp 797w&quot; /&gt;&lt;figcaption&gt;防火墙1.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;「网络」-「防火墙」-「常规设置」，在「区域」中将WAN口的「入站数据」和「转发」设置由「拒绝」修改为「接受」。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;防火墙2.png&quot; loading=&quot;lazy&quot; width=&quot;1099&quot; height=&quot;312&quot; src=&quot;/_astro/4106_4073904740_65366b.D--sSKBm_ZcWHi5.webp&quot; srcset=&quot;/_astro/4106_4073904740_65366b.D--sSKBm_1IFAci.webp 640w, /_astro/4106_4073904740_65366b.D--sSKBm_zkTdM.webp 750w, /_astro/4106_4073904740_65366b.D--sSKBm_Z1Y8QS2.webp 828w, /_astro/4106_4073904740_65366b.D--sSKBm_Znfzpw.webp 1080w, /_astro/4106_4073904740_65366b.D--sSKBm_ZcWHi5.webp 1099w&quot; /&gt;&lt;figcaption&gt;防火墙2.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;此刻 DDNS 配置完成！若不出意外，通过使用指定域名（包含主机记录的完整地址）+端口号（端口转发对应的外部端口号）的形式应该就能访问。例如 &lt;code&gt;http://subdomain.com:9080/&lt;/code&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;常见问题&lt;a href=&quot;#常见问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;问题一：外网无法通过域名/公网IP访问？&lt;a href=&quot;#问题一外网无法通过域名公网ip访问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;解决方案：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;进入 OpenWrt 后台，找到 uHTTPd 取消勾选「忽略公共接口上的私有 IP」&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;忽略公共接口上的私有 IP.png&quot; loading=&quot;lazy&quot; width=&quot;1625&quot; height=&quot;788&quot; src=&quot;/_astro/4106_2302099890_49c10e.By64d8_B_Z2gIktH.webp&quot; srcset=&quot;/_astro/4106_2302099890_49c10e.By64d8_B_Z2k282r.webp 640w, /_astro/4106_2302099890_49c10e.By64d8_B_24U3fE.webp 750w, /_astro/4106_2302099890_49c10e.By64d8_B_1MTQdS.webp 828w, /_astro/4106_2302099890_49c10e.By64d8_B_CzzuH.webp 1080w, /_astro/4106_2302099890_49c10e.By64d8_B_1sNmPS.webp 1280w, /_astro/4106_2302099890_49c10e.By64d8_B_Z2gIktH.webp 1625w&quot; /&gt;&lt;figcaption&gt;忽略公共接口上的私有 IP.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;如果面板上找不到 uHTTPd ，请通过 SSH 终端进入 OpenWrt 修改 uHTTPd 配置文件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 修改uhttpd配置文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vim /etc/config/uhttpd&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 找到下面这行&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;option rfc1918_filter &apos;1&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 修改为&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;option rfc1918_filter &apos;0&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;修改完成后保存并退出，重启 uhttpd 使配置失效：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/etc/init.d/uhttpd restart&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;问题二：通过域名和公网IP访问速度奇慢？&lt;a href=&quot;#问题二通过域名和公网ip访问速度奇慢&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;解决方案：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1、关闭Turbo ACC，至少要关闭/禁用 「SFE （FLOW）Fast Path」，否则会严重影响端口转发效率。&lt;/p&gt;&lt;p&gt;2、对速度要求较高的应用，配置端口转发时，确保外部端口号和内部端口号是一致的。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;二、ZeroTier 虚拟局域网&lt;a href=&quot;#二zerotier-虚拟局域网&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;访问 ZeroTier -&amp;gt; &lt;a href=&quot;https://accounts.zerotier.com/auth/realms/zerotier/protocol/openid-connect/registrations?client_id=zt-central&amp;amp;redirect_uri=https%3A%2F%2Fmy.zerotier.com%2Fapi%2F_auth%2Foidc%2Fcallback&amp;amp;response_type=code&amp;amp;scope=openid+profile+email+offline_access&amp;amp;state=state&quot; target=&quot;_blank&quot;&gt;注册一个帐号&lt;/a&gt; （账号注册过程不做赘述）&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;zerotier-1.png&quot; loading=&quot;lazy&quot; width=&quot;998&quot; height=&quot;641&quot; src=&quot;/_astro/4106_2537980661_e216db.CEuGQ2v7_Z7qAwQ.webp&quot; srcset=&quot;/_astro/4106_2537980661_e216db.CEuGQ2v7_21YHg0.webp 640w, /_astro/4106_2537980661_e216db.CEuGQ2v7_271o5B.webp 750w, /_astro/4106_2537980661_e216db.CEuGQ2v7_Z2auVwf.webp 828w, /_astro/4106_2537980661_e216db.CEuGQ2v7_Z7qAwQ.webp 998w&quot; /&gt;&lt;figcaption&gt;zerotier-1.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&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;code&gt;https://my.zerotier.com/&lt;/code&gt;，创建一个虚拟局域网。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;zerotier-2.png&quot; loading=&quot;lazy&quot; width=&quot;1529&quot; height=&quot;391&quot; src=&quot;/_astro/4106_4186830955_2d5c20.DANqLOYt_cGykJ.webp&quot; srcset=&quot;/_astro/4106_4186830955_2d5c20.DANqLOYt_23Fj4t.webp 640w, /_astro/4106_4186830955_2d5c20.DANqLOYt_Z2uvvWF.webp 750w, /_astro/4106_4186830955_2d5c20.DANqLOYt_Z218cb4.webp 828w, /_astro/4106_4186830955_2d5c20.DANqLOYt_ZlQzGD.webp 1080w, /_astro/4106_4186830955_2d5c20.DANqLOYt_IIMrR.webp 1280w, /_astro/4106_4186830955_2d5c20.DANqLOYt_cGykJ.webp 1529w&quot; /&gt;&lt;figcaption&gt;zerotier-2.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;此时系统会自动为你生成一个 &lt;code&gt;NETWORK ID&lt;/code&gt;，保存好此 ID，OpenWrt 加入到虚拟局域网络会用到 &lt;code&gt;NETWORK ID&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;zerotier-3.png&quot; loading=&quot;lazy&quot; width=&quot;1112&quot; height=&quot;324&quot; src=&quot;/_astro/4106_2687421030_8e4320.oBBXDRiX_Z22idga.webp&quot; srcset=&quot;/_astro/4106_2687421030_8e4320.oBBXDRiX_ZYWzvE.webp 640w, /_astro/4106_2687421030_8e4320.oBBXDRiX_ZYspEu.webp 750w, /_astro/4106_2687421030_8e4320.oBBXDRiX_10uvdl.webp 828w, /_astro/4106_2687421030_8e4320.oBBXDRiX_1iBS6D.webp 1080w, /_astro/4106_2687421030_8e4320.oBBXDRiX_Z22idga.webp 1112w&quot; /&gt;&lt;figcaption&gt;zerotier-3.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;选择「Access Control」访问类型，推荐设置为「PRIVATE」，因为「PRIVATE」更具私密性，安全性更高。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;zerotier-4.png&quot; loading=&quot;lazy&quot; width=&quot;1158&quot; height=&quot;527&quot; src=&quot;/_astro/4106_3143717144_6ae27f.CcbAlJPB_2nBF0W.webp&quot; srcset=&quot;/_astro/4106_3143717144_6ae27f.CcbAlJPB_LSwYB.webp 640w, /_astro/4106_3143717144_6ae27f.CcbAlJPB_1YFOww.webp 750w, /_astro/4106_3143717144_6ae27f.CcbAlJPB_1W5pAc.webp 828w, /_astro/4106_3143717144_6ae27f.CcbAlJPB_Z1bNJxB.webp 1080w, /_astro/4106_3143717144_6ae27f.CcbAlJPB_2nBF0W.webp 1158w&quot; /&gt;&lt;figcaption&gt;zerotier-4.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3、OpenWrt 插件设置&lt;a href=&quot;#3openwrt-插件设置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;OpenWrt 插件 ZeroTier 下载地址 —&amp;gt; &lt;a href=&quot;https://www.moewah.com/go/aHR0cHM6Ly9naXRodWIuY29tL3J1ZmVuZ3N1aXhpbmcvbHVjaS1hcHAtemVyb3RpZXIvcmVsZWFzZXMvZG93bmxvYWQvMS4wLTE2L2x1Y2ktYXBwLXplcm90aWVyXzEuMC0xNl9hbGwuaXBr&quot; target=&quot;_blank&quot;&gt;插件下载&lt;/a&gt; ，安装过程不做赘述，请自行下载安装。&lt;/p&gt;&lt;p&gt;插件安装完成后，进入 OpenWrt 管理后台，在左侧导航中找到「ZeroTier」配置如下：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;zerotier-5.png&quot; loading=&quot;lazy&quot; width=&quot;1507&quot; height=&quot;652&quot; src=&quot;/_astro/4106_3264642494_76072f.CCxh-2YX_2f7IsG.webp&quot; srcset=&quot;/_astro/4106_3264642494_76072f.CCxh-2YX_1RhrpL.webp 640w, /_astro/4106_3264642494_76072f.CCxh-2YX_Z1cgBbM.webp 750w, /_astro/4106_3264642494_76072f.CCxh-2YX_Z2oGQWM.webp 828w, /_astro/4106_3264642494_76072f.CCxh-2YX_Harj5.webp 1080w, /_astro/4106_3264642494_76072f.CCxh-2YX_pDMDC.webp 1280w, /_astro/4106_3264642494_76072f.CCxh-2YX_2f7IsG.webp 1507w&quot; /&gt;&lt;figcaption&gt;zerotier-5.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;设置内容包含：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;勾选「启用」&lt;/li&gt;
&lt;li&gt;将获得的&lt;code&gt;NETWORK ID&lt;/code&gt;填入到对应的区域&lt;/li&gt;
&lt;li&gt;保存并应用&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&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;此时 ZeroTier NetWork 会收到一条授权请求，在列表中找到设备，勾选以授权此设备加入到你的网络。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;zerotier-6.png&quot; loading=&quot;lazy&quot; width=&quot;1481&quot; height=&quot;318&quot; src=&quot;/_astro/4106_1311079327_66f7e0.DN-6eMu2_Z1IFMAY.webp&quot; srcset=&quot;/_astro/4106_1311079327_66f7e0.DN-6eMu2_Z1q5kCD.webp 640w, /_astro/4106_1311079327_66f7e0.DN-6eMu2_1QrpiJ.webp 750w, /_astro/4106_1311079327_66f7e0.DN-6eMu2_ZxgX91.webp 828w, /_astro/4106_1311079327_66f7e0.DN-6eMu2_QujNG.webp 1080w, /_astro/4106_1311079327_66f7e0.DN-6eMu2_Z2637WP.webp 1280w, /_astro/4106_1311079327_66f7e0.DN-6eMu2_Z1IFMAY.webp 1481w&quot; /&gt;&lt;figcaption&gt;zerotier-6.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;等待一会儿，刷新一下页面，此时会显示 ZeroTier 为该设备分配的虚拟局域网IP&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;zerotier-7.png&quot; loading=&quot;lazy&quot; width=&quot;2962&quot; height=&quot;428&quot; src=&quot;/_astro/4106_3126554547_a409b0.CRRGNxlp_Z14GR5D.webp&quot; srcset=&quot;/_astro/4106_3126554547_a409b0.CRRGNxlp_25rISY.webp 640w, /_astro/4106_3126554547_a409b0.CRRGNxlp_17YJv4.webp 750w, /_astro/4106_3126554547_a409b0.CRRGNxlp_Z29s7Vb.webp 828w, /_astro/4106_3126554547_a409b0.CRRGNxlp_Z2tzhjS.webp 1080w, /_astro/4106_3126554547_a409b0.CRRGNxlp_Z2hyGkH.webp 1280w, /_astro/4106_3126554547_a409b0.CRRGNxlp_XfacR.webp 1668w, /_astro/4106_3126554547_a409b0.CRRGNxlp_Z1LWGeC.webp 2048w, /_astro/4106_3126554547_a409b0.CRRGNxlp_ZzYWEX.webp 2560w, /_astro/4106_3126554547_a409b0.CRRGNxlp_Z14GR5D.webp 2962w&quot; /&gt;&lt;figcaption&gt;zerotier-7.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5、远程访问&lt;a href=&quot;#5远程访问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;作为用来访问 OpenWrt 的一端，请根据设备所属平台，&lt;a href=&quot;https://www.zerotier.com/download/&quot; target=&quot;_blank&quot;&gt;下载 ZeroTier One&lt;/a&gt; 并完成安装。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;zerotier-8.png&quot; loading=&quot;lazy&quot; width=&quot;1250&quot; height=&quot;390&quot; src=&quot;/_astro/4106_2195047464_8233a3.VtFwCHEf_1bWjyc.webp&quot; srcset=&quot;/_astro/4106_2195047464_8233a3.VtFwCHEf_16Oc3p.webp 640w, /_astro/4106_2195047464_8233a3.VtFwCHEf_27Tvh.webp 750w, /_astro/4106_2195047464_8233a3.VtFwCHEf_Z1mw0KR.webp 828w, /_astro/4106_2195047464_8233a3.VtFwCHEf_Z14JdyY.webp 1080w, /_astro/4106_2195047464_8233a3.VtFwCHEf_1bWjyc.webp 1250w&quot; /&gt;&lt;figcaption&gt;zerotier-8.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;打开 ZeroTier One 点击 Join Network 填写之前获取到的 &lt;code&gt;Network ID&lt;/code&gt; 然后点击 「Join」&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;zerotier-9.png&quot; loading=&quot;lazy&quot; width=&quot;731&quot; height=&quot;217&quot; src=&quot;/_astro/4106_3764935960_c753cd.CIG4NWOp_aSj6b.webp&quot; srcset=&quot;/_astro/4106_3764935960_c753cd.CIG4NWOp_UNa02.webp 640w, /_astro/4106_3764935960_c753cd.CIG4NWOp_aSj6b.webp 731w&quot; /&gt;&lt;figcaption&gt;zerotier-9.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;等待片刻 ZeroTier NetWork 会收到新的一条授权请求，在列表中找到该设备，勾选以授权此设备加入到你的网络。&lt;/p&gt;&lt;p&gt;此时，当前设备可被允许访问虚拟局域网内的任一设备，通过 OpenWrt 的虚拟局域网IP &lt;code&gt;http://172.24.62.179/&lt;/code&gt;访问 OpenWrt 管理后台，而无需额外配置（无需配置端口转发、防火墙设置），就能轻松访问当前设备开放的所有端口。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三、两者差异比较&lt;a href=&quot;#三两者差异比较&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;名称/类型&lt;/th&gt;&lt;th&gt;速度与稳定性&lt;/th&gt;&lt;th&gt;公网IP&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;DDNS 动态解析&lt;/td&gt;&lt;td&gt;稳定，可跑满带宽&lt;/td&gt;&lt;td&gt;需要&lt;/td&gt;&lt;td&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;ZeroTier&lt;/td&gt;&lt;td&gt;一般，速度勉强&lt;/td&gt;&lt;td&gt;无需&lt;/td&gt;&lt;td&gt;无需配置&lt;/td&gt;&lt;td&gt;局域网络&lt;/td&gt;&lt;td&gt;简单&lt;/td&gt;&lt;td&gt;较高&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;</content:encoded></item><item><title>独角数卡PHP发卡系统LNMP部署教程</title><link>https://blog.moewah.com/posts/3826/</link><guid isPermaLink="true">https://blog.moewah.com/posts/3826/</guid><description>如何快速搭建独角数卡发卡平台？本文手把手教你基于LNMP环境部署独角数卡PHP系统，涵盖环境配置、依赖安装与实战操作，助你轻松实现支付接口集成和私有化部署。</description><pubDate>Fri, 18 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt;  独角数卡是一个功能较为完善且强大的开源发卡系统，框架来自 laravel/framework 后端采用 laravel-admin 前端UI使用的是 layui。支付接口已集成：支付宝当面付、支付宝 PC 支付、支付宝手机支付、 payjs 微信扫码、 Paysapi (支付宝/微信)、码支付 (QQ /支付宝/微信)、微信企业扫码支付、 Paypal 支付 (默认美元)和全网易支付支持 (针对彩虹版)，我们可以使用 独角数卡搭建我们自己的发卡平台！查看 -&amp;gt; &lt;a href=&quot;https://github.com/assimon/dujiaoka&quot; target=&quot;_blank&quot;&gt;github项目地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;独角数卡.jpg&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;350&quot; src=&quot;/_astro/3826_3445585771_1c66a3.Dq4EOKyG_1ye79o.webp&quot; srcset=&quot;/_astro/3826_3445585771_1c66a3.Dq4EOKyG_1rfoqy.webp 640w, /_astro/3826_3445585771_1c66a3.Dq4EOKyG_1ye79o.webp 700w&quot; /&gt;&lt;figcaption&gt;独角数卡.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&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;figure&gt;&lt;img alt=&quot;独角数卡截图-1.jpg&quot; loading=&quot;lazy&quot; width=&quot;1118&quot; height=&quot;616&quot; src=&quot;/_astro/3826_3907497032_a38867.C3VqbPca_10fxte.webp&quot; srcset=&quot;/_astro/3826_3907497032_a38867.C3VqbPca_Z1969mA.webp 640w, /_astro/3826_3907497032_a38867.C3VqbPca_fTMFt.webp 750w, /_astro/3826_3907497032_a38867.C3VqbPca_1dnPTK.webp 828w, /_astro/3826_3907497032_a38867.C3VqbPca_ZvgfgI.webp 1080w, /_astro/3826_3907497032_a38867.C3VqbPca_10fxte.webp 1118w&quot; /&gt;&lt;figcaption&gt;独角数卡截图-1.jpg&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img alt=&quot;独角数卡截图-2.jpg&quot; loading=&quot;lazy&quot; width=&quot;1277&quot; height=&quot;928&quot; src=&quot;/_astro/3826_3844109144_b5be00.BNlHxxF1_ZXzMmz.webp&quot; srcset=&quot;/_astro/3826_3844109144_b5be00.BNlHxxF1_Z1cQJNp.webp 640w, /_astro/3826_3844109144_b5be00.BNlHxxF1_AAwfW.webp 750w, /_astro/3826_3844109144_b5be00.BNlHxxF1_Z2osP4k.webp 828w, /_astro/3826_3844109144_b5be00.BNlHxxF1_ZDY7wu.webp 1080w, /_astro/3826_3844109144_b5be00.BNlHxxF1_ZXzMmz.webp 1277w&quot; /&gt;&lt;figcaption&gt;独角数卡截图-2.jpg&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img alt=&quot;独角数卡截图-3.jpg&quot; loading=&quot;lazy&quot; width=&quot;1326&quot; height=&quot;628&quot; src=&quot;/_astro/3826_1864353158_775b09.DopR-1yR_1iLYsW.webp&quot; srcset=&quot;/_astro/3826_1864353158_775b09.DopR-1yR_1FjVNt.webp 640w, /_astro/3826_1864353158_775b09.DopR-1yR_Z9JQx2.webp 750w, /_astro/3826_1864353158_775b09.DopR-1yR_2opM1a.webp 828w, /_astro/3826_1864353158_775b09.DopR-1yR_1yFAaQ.webp 1080w, /_astro/3826_1864353158_775b09.DopR-1yR_Z2ceSdm.webp 1280w, /_astro/3826_1864353158_775b09.DopR-1yR_1iLYsW.webp 1326w&quot; /&gt;&lt;figcaption&gt;独角数卡截图-3.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&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;a href=&quot;https://lnmp.org/&quot; target=&quot;_blank&quot;&gt;军哥LNMP一键包&lt;/a&gt;进行安装部署，默认终端支持&lt;code&gt;php-cli&lt;/code&gt; 且默认已安装&lt;code&gt;fileinfo&lt;/code&gt;扩展，&lt;code&gt;redis&lt;/code&gt;可以使用LNMP包内自带的&lt;code&gt;addons.sh&lt;/code&gt; 进行一键安装。而关于开启相关函数需要查找&lt;code&gt;php.ini&lt;/code&gt; 文件中找到&lt;code&gt;disable_functions&lt;/code&gt;移除禁用函数列表中的 &lt;code&gt;putenv&lt;/code&gt;、&lt;code&gt;proc_open&lt;/code&gt;、&lt;code&gt;pcntl_signal&lt;/code&gt;、&lt;code&gt;pcntl_alarm&lt;/code&gt;、&lt;code&gt;procgetstatus&lt;/code&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 基本环境要求&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- (PHP + PHPCLI) version &amp;gt;= 7.2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- Nginx version &amp;gt;= 1.16&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- MYSQL version &amp;gt;= 5.6&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- Redis (高性能缓存服务)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- Supervisor (一个python编写的进程管理服务)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- Composer (PHP包管理器)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- Linux/Win (Win下未测试，建议直接Linux)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## PHP环境要求&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. 必须安装fileinfo扩展、redis扩展&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. 终端需要支持php-cli，测试php -v(版本必须一致)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. 需要开启的函数：putenv，proc_open，pcntl_signal，pcntl_alarm&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4. 建议安装opcache扩展（非必需）&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;安装 composer&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl -sS https://getcomposer.org/installer | php&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mv composer.phar /usr/local/bin/composer&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;code&gt;dujiaoka v2&lt;/code&gt;，本文内容基于 &lt;code&gt;v1.8.2&lt;/code&gt;版本&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;建议直接在项目的 &lt;a href=&quot;https://github.com/assimon/dujiaoka/releases&quot; target=&quot;_blank&quot;&gt;release&lt;/a&gt; 页面下载包含依赖的 build 版本尽可能减少产生错误的可能性。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 定位到网站根目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd /home/wwwroot/www.example.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 下载作者提供的版本为v1.8.2的build包文件，注意本教程不适用 dujiaoka v2.0.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget --no-check-certificate https://github.com/assimon/dujiaoka/releases/download/v1.8.2/v1.8.2_build.tar.gz&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 解压&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tar -xzf v1.8.2_build.tar.gz&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 移动包含隐藏的所有文件到网站根目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mv dujiaoka_build/{,.}* ./&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 更改文件夹所属用户和用户组&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chown -R www:www ./*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 赋予文件夹读写权限&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod -R 755 public bootstrap storage&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;创建数据库&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 输入密码进入mysql&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mysql -u root -p&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 创建一个数据库,例如dujiaoka&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;create database dujiaoka;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;修改项目配置文件&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 编辑配置文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vi .env.example&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;必须确保 MySQL 数据库配置、Redis 配置、发件人邮件服务配置等正确无误（正式上线后一定要将&lt;code&gt;.env&lt;/code&gt;配置里面的&lt;code&gt;APP_DEBUG&lt;/code&gt;设置为&lt;code&gt;false&lt;/code&gt;）&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 网站url&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;APP_URL=https://www.example.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 数据库配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;DB_CONNECTION=mysql&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;DB_HOST=127.0.0.1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;DB_PORT=3306&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;DB_DATABASE=数据库名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;DB_USERNAME=数据库用户&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;DB_PASSWORD=数据库密码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# redis缓存配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;REDIS_HOST=127.0.0.1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;REDIS_PASSWORD=无密码填null&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;REDIS_PORT=6379&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 邮件服务配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;MAIL_DRIVER=smtp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;MAIL_HOST=smtp服务器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;MAIL_PORT=587&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;MAIL_USERNAME=邮箱账号&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;MAIL_PASSWORD=邮箱密码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;MAIL_FROM_ADDRESS=发件人邮箱地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;MAIL_FROM_NAME=发件人名称&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;MAIL_ENCRYPTION=ssl&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;修改完成后，重命名配置文件&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mv .env.example .env&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;导入数据库&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 网站www.example.com根目录下运行，数据导入成功会有提示&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;php artisan dujiao install&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;配置 Nginx&lt;a href=&quot;#配置-nginx&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;很多小伙伴安装完成启动时常常遇到 500 错误 ，除了没有正确赋予文件或文件夹权限，绝大部分因为Nginx配置问题导致。&lt;/p&gt;&lt;p&gt;修改网站对应的nginx配置文件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vi /usr/local/nginx/conf/vhost/www.example.com.conf&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;请参考下面的配置：&lt;/p&gt;&lt;p&gt;关于免费SSL域名证书申请 -&amp;gt; &lt;a href=&quot;https://blog.moewah.com/posts/164/&quot;&gt;点此查看&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen 80;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name www.example.com;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;root  /home/wwwroot/www.example.com/public;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;index  index.php index.html index.htm;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;rewrite ^/(.*)$  https://www.example.com/$1 permanent;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 监听 HTTP 协议默认的 [443] 端口。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen 443;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 绑定主机名 [www.example.com]。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name www.example.com;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 服务器站点根目录 [/www.example.com/public]。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;root  /home/wwwroot/www.example.com/public;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;index index.html index.htm index.php;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_certificate /usr/local/nginx/ssl/fullchain.cer;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_certificate_key  /usr/local/nginx/ssl/example.com.key;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_stapling on;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_stapling_verify on;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_trusted_certificate /usr/local/nginx/ssl/fullchain.cer;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;resolver 8.8.8.8 8.8.4.4 223.5.5.5 valid=3600s;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;resolver_timeout 2s;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_session_cache shared:SSL:10m;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_session_timeout 10m;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_protocols TLSv1.2 TLSv1.3;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_ciphers &apos;ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_prefer_server_ciphers on;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;add_header Strict-Transport-Security &quot;max-age=31536000&quot;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 添加几条有关安全的响应头；与 Google+ 的配置类似，详情参见文末。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;add_header X-Frame-Options &quot;SAMEORIGIN&quot;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;add_header X-XSS-Protection &quot;1; mode=block&quot;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;add_header X-Content-Type-Options &quot;nosniff&quot;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 指定字符集为 UTF-8&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;charset utf-8;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# Laravel 默认重写规则；删除将导致 Laravel 路由失效且 Nginx 响应 404。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;location / {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;try_files $uri $uri/ /index.php?$query_string;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 将 [404] 错误交给 [/index.php] 处理，表示由 Laravel 渲染美观的错误页面。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;error_page 404 /index.php;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# URI 符合正则表达式 [\.php$] 的请求将进入此段配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;location ~ \.php$ {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;51&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 配置 FastCGI 服务地址，可以为 IP:端口，也可以为 Unix socket。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;52&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fastcgi_pass  unix:/tmp/php-cgi.sock;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;53&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 配置 FastCGI 的主页为 index.php。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;54&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fastcgi_index index.php;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;55&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 配置 FastCGI 参数 SCRIPT_FILENAME&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;56&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;57&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;#配置 FastCGI 参数 PHP_ADMIN_VALUE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;58&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fastcgi_param PHP_ADMIN_VALUE &quot;open_basedir=NULL&quot;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;59&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 引用更多默认的 FastCGI 参数。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;60&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;include fastcgi_params;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;61&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;62&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 通俗地说，以上配置将所有 URI 以 .php 结尾的请求，全部交给 PHP-FPM 处理。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;63&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;64&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 除符合正则表达式 [/\.(?!well-known).*] 之外的 URI，全部拒绝访问&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;65&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 也就是说，拒绝公开以 [.] 开头的目录，[.well-known] 除外&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;66&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;location ~ /\.(?!well-known).* {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;67&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;deny all;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;68&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;69&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;配置完成后，重启nginx&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl restart nginx.service&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;若没有其他报错，此时打开浏览器输入 &lt;code&gt;https://www.example.com&lt;/code&gt; 可以正常访问前台；后台地址&lt;code&gt;https://www.example.com/admin&lt;/code&gt;默认管理账号/密码&lt;code&gt;admin/admin&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;使用 Supervisor 守护进程&lt;a href=&quot;#使用-supervisor-守护进程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;安装 Supervisor：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# CentOS系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum install supervisor -y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Debian/Ubuntu系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt-get install supervisor -y&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;使用&lt;code&gt;nano&lt;/code&gt;或&lt;code&gt;vim&lt;/code&gt;编辑工具修改配置文件&lt;code&gt;supervisord.conf&lt;/code&gt;，路径默认为 &lt;code&gt;/etc/supervisord.conf&lt;/code&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nano /etc/supervisord.conf&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;在配置文件末尾追加以下内容：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[program:laravel-worker]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;process_name=%(program_name)s_%(process_num)02d&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;command=php /home/wwwroot/www.example.com/artisan queue:work --sleep=3 --tries=3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;autostart=true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;autorestart=true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;user=www&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;numprocs=4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;redirect_stderr=true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;stdout_logfile=/home/wwwlogs/worker.log&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;注：&lt;/strong&gt; &lt;code&gt;user&lt;/code&gt; 需要与 &lt;code&gt;nginx.conf&lt;/code&gt; 文件中的 &lt;code&gt;user&lt;/code&gt; 保持一致；注意 &lt;code&gt;command&lt;/code&gt; 使用自己网站根目录（绝对路径），如果 &lt;code&gt;php&lt;/code&gt;有版本之分可用 &lt;code&gt;whereis&lt;/code&gt; 命令查找并使用对应版本的完整路径；&lt;code&gt;numprocs&lt;/code&gt;指令让 Supervisor 运行4个 &lt;code&gt;queue:work&lt;/code&gt;进程并监视它们，如果失败的话会自动重启，进程数量请根据CPU负载情况设定。&lt;/p&gt;&lt;p&gt;配置文件创建好了之后，可以使用如下命令更新Supervisor配置并开启进程：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;supervisorctl reread&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;supervisorctl update&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;supervisorctl start laravel-worker:*&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;注：&lt;/strong&gt; 通过改动&lt;code&gt;.env&lt;/code&gt;文件配置邮箱发信信息，则需要执行 &lt;code&gt;supervisorctl reload&lt;/code&gt; 命令重启Supervisor进程才能使服务生效。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;商户id&lt;/th&gt;&lt;th&gt;商户key&lt;/th&gt;&lt;th&gt;商户密钥&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;支付宝官方(当面付、PC、wap)&lt;/td&gt;&lt;td&gt;支付宝开放平台应用appid&lt;/td&gt;&lt;td&gt;支付宝公钥&lt;/td&gt;&lt;td&gt;商户私钥&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;payjs&lt;/td&gt;&lt;td&gt;payjs商户号(mchid)&lt;/td&gt;&lt;td&gt;空&lt;/td&gt;&lt;td&gt;payjs密钥&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&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;/td&gt;&lt;td&gt;公众号或小程序appid&lt;/td&gt;&lt;td&gt;商户号&lt;/td&gt;&lt;td&gt;商户api密钥&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&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;paysapi&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;/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;V免签&lt;/td&gt;&lt;td&gt;V免签通讯密钥&lt;/td&gt;&lt;td&gt;空&lt;/td&gt;&lt;td&gt;V免签地址&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;/section&gt;</content:encoded></item><item><title>哪吒监控：轻量级服务器运维面板实战指南</title><link>https://blog.moewah.com/posts/3794/</link><guid isPermaLink="true">https://blog.moewah.com/posts/3794/</guid><description>如何用哪吒监控实现高效服务器状态、HTTP/SSL/TCP/Ping多维度监控？本文详细拆解哪吒监控的安装配置与OAuth2授权流程，提供轻量运维系统搭建方案，助你快速部署可视化监控面板。</description><pubDate>Tue, 15 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近喵斯基部落用信用卡撸到了四台免费的服务器，打算挂个探针监控一下这几台免费服务器看看能撑多久。有幸在Github找到一个开源的监控面板——哪吒监控 一站式轻监控轻运维系统。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;哪吒监控.jpg&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;350&quot; src=&quot;/_astro/3794_704779736_d33587.BMwuvb-J_1L5Tbp.webp&quot; srcset=&quot;/_astro/3794_704779736_d33587.BMwuvb-J_ZHNYLn.webp 640w, /_astro/3794_704779736_d33587.BMwuvb-J_1JezLt.webp 750w, /_astro/3794_704779736_d33587.BMwuvb-J_1L5Tbp.webp 800w&quot; /&gt;&lt;figcaption&gt;哪吒监控.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;哪吒监控支持系统状态、HTTP(SSL 证书变更、即将到期、到期)、TCP、Ping 监控报警，命令批量执行和计划任务。面板自带三套主题都非常不错，可以说既做到了满足监控运维的需求又得到赏心悦目的审美体验。-&amp;gt; &lt;a href=&quot;https://github.com/naiba/nezha&quot; target=&quot;_blank&quot;&gt;项目地址&lt;/a&gt;&lt;/p&gt;
&lt;section&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;figure&gt;&lt;img alt=&quot;截图.jpg&quot; loading=&quot;lazy&quot; width=&quot;2566&quot; height=&quot;1908&quot; src=&quot;/_astro/3794_4111411059_6d4086.B1TahAaE_Z16TIhv.webp&quot; srcset=&quot;/_astro/3794_4111411059_6d4086.B1TahAaE_Qk7qr.webp 640w, /_astro/3794_4111411059_6d4086.B1TahAaE_ZyPxSf.webp 750w, /_astro/3794_4111411059_6d4086.B1TahAaE_Z5VAFJ.webp 828w, /_astro/3794_4111411059_6d4086.B1TahAaE_Z2dfmLG.webp 1080w, /_astro/3794_4111411059_6d4086.B1TahAaE_ooGYI.webp 1280w, /_astro/3794_4111411059_6d4086.B1TahAaE_2rlPvt.webp 1668w, /_astro/3794_4111411059_6d4086.B1TahAaE_2pPGft.webp 2048w, /_astro/3794_4111411059_6d4086.B1TahAaE_Zx5KEg.webp 2560w, /_astro/3794_4111411059_6d4086.B1TahAaE_Z16TIhv.webp 2566w&quot; /&gt;&lt;figcaption&gt;截图.jpg&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img alt=&quot;截图3.jpg&quot; loading=&quot;lazy&quot; width=&quot;2566&quot; height=&quot;1908&quot; src=&quot;/_astro/3794_1493727415_0141e8.C54hybJs_2tYuu9.webp&quot; srcset=&quot;/_astro/3794_1493727415_0141e8.C54hybJs_1CroKe.webp 640w, /_astro/3794_1493727415_0141e8.C54hybJs_cgIqx.webp 750w, /_astro/3794_1493727415_0141e8.C54hybJs_FaFD3.webp 828w, /_astro/3794_1493727415_0141e8.C54hybJs_1nDPYX.webp 1080w, /_astro/3794_1493727415_0141e8.C54hybJs_Z14Sd2y.webp 1280w, /_astro/3794_1493727415_0141e8.C54hybJs_X3Utc.webp 1668w, /_astro/3794_1493727415_0141e8.C54hybJs_VxLdc.webp 2048w, /_astro/3794_1493727415_0141e8.C54hybJs_Z21nFGx.webp 2560w, /_astro/3794_1493727415_0141e8.C54hybJs_2tYuu9.webp 2566w&quot; /&gt;&lt;figcaption&gt;截图3.jpg&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img alt=&quot;截图4.jpg&quot; loading=&quot;lazy&quot; width=&quot;2440&quot; height=&quot;1822&quot; src=&quot;/_astro/3794_37101639_de7d57.COCHCbE8_Z1Yof9.webp&quot; srcset=&quot;/_astro/3794_37101639_de7d57.COCHCbE8_2uTaFj.webp 640w, /_astro/3794_37101639_de7d57.COCHCbE8_vCXFi.webp 750w, /_astro/3794_37101639_de7d57.COCHCbE8_1srj8K.webp 828w, /_astro/3794_37101639_de7d57.COCHCbE8_ZGIupS.webp 1080w, /_astro/3794_37101639_de7d57.COCHCbE8_Z1xQNo6.webp 1280w, /_astro/3794_37101639_de7d57.COCHCbE8_17PLnT.webp 1668w, /_astro/3794_37101639_de7d57.COCHCbE8_Z104guq.webp 2048w, /_astro/3794_37101639_de7d57.COCHCbE8_Z1Yof9.webp 2440w&quot; /&gt;&lt;figcaption&gt;截图4.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1、服务器数量不少于两台。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2、准备两个域名可以是子域名，例如 a.moewah.com（用于面板访问） 与 b.moewah.com（用于Agent对接Dashboard）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3、防护墙放行端口：8008、5555；&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;创建 &lt;strong&gt;OAuth2 授权服务&lt;/strong&gt;&lt;a href=&quot;#创建-oauth2-授权服务&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;打开 &lt;code&gt;https://github.com/settings/developers&lt;/code&gt; 注册一个 OAuth application，所填信息及要求如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Application name : （随意取名）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Homepage URL ：http://ip:8008 （默认端口8008）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Application description：（可选项可不填）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Authorization callback URL：http://ip:8008/oauth2/callback （默认端口8008）&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;记录 &lt;code&gt;Client ID&lt;/code&gt; 及对应的 &lt;code&gt;Client Secret&lt;/code&gt; 安装面板的时候会用到。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;ID.jpg&quot; loading=&quot;lazy&quot; width=&quot;874&quot; height=&quot;302&quot; src=&quot;/_astro/3794_482693546_7663e3.BbYkh4XE_h1l5I.webp&quot; srcset=&quot;/_astro/3794_482693546_7663e3.BbYkh4XE_ZYK9qq.webp 640w, /_astro/3794_482693546_7663e3.BbYkh4XE_13adCD.webp 750w, /_astro/3794_482693546_7663e3.BbYkh4XE_1oSaXi.webp 828w, /_astro/3794_482693546_7663e3.BbYkh4XE_h1l5I.webp 874w&quot; /&gt;&lt;figcaption&gt;ID.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;如果看不到&lt;code&gt;Client Secret&lt;/code&gt; 可以点击&lt;code&gt;Generate a new client secret&lt;/code&gt; 再生成一个。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl -L https://raw.githubusercontent.com/naiba/nezha/master/script/install.sh  -o nezha.sh &amp;amp;&amp;amp; chmod +x nezha.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo ./nezha.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;输入&lt;code&gt;1&lt;/code&gt; 回车，安装面板端&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;安装面板.jpg&quot; loading=&quot;lazy&quot; width=&quot;851&quot; height=&quot;516&quot; src=&quot;/_astro/3794_668483791_3697da.BXwPTW-I_1AQaLw.webp&quot; srcset=&quot;/_astro/3794_668483791_3697da.BXwPTW-I_Z1XfzON.webp 640w, /_astro/3794_668483791_3697da.BXwPTW-I_1vQG6u.webp 750w, /_astro/3794_668483791_3697da.BXwPTW-I_Zeewjm.webp 828w, /_astro/3794_668483791_3697da.BXwPTW-I_1AQaLw.webp 851w&quot; /&gt;&lt;figcaption&gt;安装面板.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;按要求正确输入&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1.请输入 OAuth2 提供商(gitee/github，默认 github)：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;（默认，回车）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2.请输入 Oauth2 应用的 Client ID ：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;（输入之前创建的Client ID）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3.请输入 Oauth2 应用的 Client Secret:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;（输入之前创建的Client Secret）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4.请输入 GitHub/Gitee 登录名作为管理员，多个以逗号隔开:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;（填写github的用户名）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;5.请输入站点标题:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;（填写后，回车）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;6.请输入站点访问端口: (8008)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;（回车）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;7.请输入用于 Agent 接入的 RPC 端口: (5555)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;（回车）&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;以上，完成面板安装。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;http://ip:8008/login&lt;/code&gt;，点击登录会自动跳转到Github，若Github是已登录的状态则会成功跳转回来。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;登录面板.jpg&quot; loading=&quot;lazy&quot; width=&quot;1047&quot; height=&quot;510&quot; src=&quot;/_astro/3794_2692146132_f36c82.Dp2tHkfP_1o0iF1.webp&quot; srcset=&quot;/_astro/3794_2692146132_f36c82.Dp2tHkfP_SpB5Q.webp 640w, /_astro/3794_2692146132_f36c82.Dp2tHkfP_2aQi49.webp 750w, /_astro/3794_2692146132_f36c82.Dp2tHkfP_1SQ62n.webp 828w, /_astro/3794_2692146132_f36c82.Dp2tHkfP_1o0iF1.webp 1047w&quot; /&gt;&lt;figcaption&gt;登录面板.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;点击管理后台 - 添加服务器 - 输入名称确定，添加一个监控机器，并记录下对应的密钥。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;监控服务器密钥.jpg&quot; loading=&quot;lazy&quot; width=&quot;1192&quot; height=&quot;381&quot; src=&quot;/_astro/3794_3350779643_b0b406.BGMwb1OQ_2ukRTV.webp&quot; srcset=&quot;/_astro/3794_3350779643_b0b406.BGMwb1OQ_1yYgCU.webp 640w, /_astro/3794_3350779643_b0b406.BGMwb1OQ_Z1Y86dC.webp 750w, /_astro/3794_3350779643_b0b406.BGMwb1OQ_ZggwaX.webp 828w, /_astro/3794_3350779643_b0b406.BGMwb1OQ_Z2i2wxq.webp 1080w, /_astro/3794_3350779643_b0b406.BGMwb1OQ_2ukRTV.webp 1192w&quot; /&gt;&lt;figcaption&gt;监控服务器密钥.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;若监控主机使用系统为 Linux (Ubuntu、Debian、CentOS)，可以进入 SSH 终端运行安装脚本：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl -L https://raw.githubusercontent.com/naiba/nezha/master/script/install.sh  -o nezha.sh &amp;amp;&amp;amp; chmod +x nezha.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo ./nezha.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;输入 &lt;code&gt;8&lt;/code&gt; 回车，安装监控Agent。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;安装监控.jpg&quot; loading=&quot;lazy&quot; width=&quot;1710&quot; height=&quot;864&quot; src=&quot;/_astro/3794_2662303443_9076da.Dcu3aRwc_Z9Mvfv.webp&quot; srcset=&quot;/_astro/3794_2662303443_9076da.Dcu3aRwc_Z186Yog.webp 640w, /_astro/3794_2662303443_9076da.Dcu3aRwc_ZDw65q.webp 750w, /_astro/3794_2662303443_9076da.Dcu3aRwc_2bYccB.webp 828w, /_astro/3794_2662303443_9076da.Dcu3aRwc_Z23WoCG.webp 1080w, /_astro/3794_2662303443_9076da.Dcu3aRwc_ZpOWeU.webp 1280w, /_astro/3794_2662303443_9076da.Dcu3aRwc_1Asf7y.webp 1668w, /_astro/3794_2662303443_9076da.Dcu3aRwc_Z9Mvfv.webp 1710w&quot; /&gt;&lt;figcaption&gt;安装监控.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;按要求填写下列信息（这里的 b.moewah.com用于Agent对接Dashboard所准备的域名，请替换为自己的）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1.请输入一个解析到面板所在IP的域名（不可套CDN）:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;（b.moewah.com，回车）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2.请输入面板RPC端口: (5555)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;（回车）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3.请输入Agent 密钥:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;（填写后台新增监控服务器对应的密钥）&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;以上，完成监控端部署，部分设备例如 MT7621 系列路由器暂时需要手动安装 nezha-agent。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;http://ip:8008&lt;/code&gt;访问控制面板太麻烦，可以使用Nginx反向代理来绑定域名以及使用https。-&amp;gt; &lt;a href=&quot;https://blog.moewah.com/posts/164/&quot;&gt;免费申请SSL证书&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen 80;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name  a.moewah.com;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;rewrite ^/(.*)$  https://a.moewah.com/$1 permanent;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen 443 ssl http2;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name  a.moewah.com;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_certificate /etc/nginx/ssl/fullchain.cer;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_certificate_key  /etc/nginx/ssl/moewah.com.key;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_protocols TLSv1.2 TLSv1.3;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_ciphers &apos;ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 反代配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;location / {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_pass http://127.0.0.1:8008;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header Host $http_host;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header      Upgrade $http_upgrade;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;location ~ ^/(ws|terminal/.+)$  {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_pass http://127.0.0.1:8008;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_http_version 1.1;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header Upgrade $http_upgrade;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header Connection &quot;Upgrade&quot;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header Host $http_host;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;然后打开 &lt;code&gt;https://github.com/settings/developers&lt;/code&gt; 修改之前创建的 OAuth application 信息：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Homepage URL ：https://a.moewah.com （替换为面板准备的域名）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Authorization callback URL：https://a.moewah.com/oauth2/callback （替换为面板准备的域名）&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;此时可以使用域名直接访问，若后台登录返回github的404页面，请重启一下面板即可。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>RAID1转SHR单盘：群晖DS220+扩容实战指南</title><link>https://blog.moewah.com/posts/5254/</link><guid isPermaLink="true">https://blog.moewah.com/posts/5254/</guid><description>在私有云环境下，RAID1如何安全降级为SHR单盘位？本实战复盘详解抽盘、SSH启用及mdadm命令操作，提供数据安全建议，帮助你高效扩容并降低成本。</description><pubDate>Sat, 01 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我朋友身边有一台 Synology DS220+ 双盘位 2Tx2 做了一组 RAID1 阵列，目前磁盘容量不足，毕竟更换硬盘实现扩容成本太大，便考虑将 RAID1 阵列转为 SHR 单盘模式，这样可以腾出其中一块硬盘用来存储其它数据。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Synology.jpg&quot; loading=&quot;lazy&quot; width=&quot;1078&quot; height=&quot;516&quot; src=&quot;/_astro/5254_185559573_dc76db.C1H1Ds-__isgXa.webp&quot; srcset=&quot;/_astro/5254_185559573_dc76db.C1H1Ds-__dOQ6L.webp 640w, /_astro/5254_185559573_dc76db.C1H1Ds-__ZNFUyW.webp 750w, /_astro/5254_185559573_dc76db.C1H1Ds-__Z87aVr.webp 828w, /_astro/5254_185559573_dc76db.C1H1Ds-__isgXa.webp 1078w&quot; /&gt;&lt;figcaption&gt;Synology.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;需要知道的是 SHR 单盘、Basic，其优势是空间利用最大化，缺点是无任何数据保护。&lt;/strong&gt; 因此我们在规划磁盘使用时，要做好数据丢失的心理准备，建议存储一些不是特别重要的文件（例如，一些电影、音乐等）。&lt;/p&gt;&lt;/blockquote&gt;
&lt;section&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;理论上可以不抽出任何一块硬盘，但考虑到转换 SHR 单盘时，无法预期存储池保留的是硬盘 1 还是硬盘2，加上个人多少有点强迫症。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;1、在待机情况下，从群晖硬盘托架抽出第 2 块硬盘，然后重启群晖系统。&lt;/p&gt;&lt;p&gt;2、进入系统后，因缺失一块硬盘系统会发出报警声，并出现 &lt;strong&gt;“存储空间1：堪用”&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;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;停止哔声.jpg&quot; loading=&quot;lazy&quot; width=&quot;2332&quot; height=&quot;1498&quot; src=&quot;/_astro/5254_426650659_840c21.C9QOLDit_ZPF7lD.webp&quot; srcset=&quot;/_astro/5254_426650659_840c21.C9QOLDit_Z2qgsGp.webp 640w, /_astro/5254_426650659_840c21.C9QOLDit_Z1Tdiwu.webp 750w, /_astro/5254_426650659_840c21.C9QOLDit_ZO9Ydr.webp 828w, /_astro/5254_426650659_840c21.C9QOLDit_45mV7.webp 1080w, /_astro/5254_426650659_840c21.C9QOLDit_Z2lLoQO.webp 1280w, /_astro/5254_426650659_840c21.C9QOLDit_ZEuOq7.webp 1668w, /_astro/5254_426650659_840c21.C9QOLDit_2wYa3V.webp 2048w, /_astro/5254_426650659_840c21.C9QOLDit_ZPF7lD.webp 2332w&quot; /&gt;&lt;figcaption&gt;停止哔声.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;3、进入 DSM &lt;strong&gt;控制面板&lt;/strong&gt; &amp;gt; &lt;strong&gt;终端机和 SNMP&lt;/strong&gt; &amp;gt; &lt;strong&gt;终端机&lt;/strong&gt;，勾选启用 SSH 服务。指定 SSH 连接的端口号并保存设置。为了确保系统安全性，建议将默认端口 &lt;code&gt;22&lt;/code&gt;​ 更换为其它端口号。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;启用SSH.jpg&quot; loading=&quot;lazy&quot; width=&quot;2032&quot; height=&quot;1028&quot; src=&quot;/_astro/5254_2768597008_932f71.CixfJhIB_Nrkaw.webp&quot; srcset=&quot;/_astro/5254_2768597008_932f71.CixfJhIB_ZaTS7z.webp 640w, /_astro/5254_2768597008_932f71.CixfJhIB_2rSEJr.webp 750w, /_astro/5254_2768597008_932f71.CixfJhIB_14K3VX.webp 828w, /_astro/5254_2768597008_932f71.CixfJhIB_1cwwDi.webp 1080w, /_astro/5254_2768597008_932f71.CixfJhIB_kw4Pm.webp 1280w, /_astro/5254_2768597008_932f71.CixfJhIB_ZiDMxV.webp 1668w, /_astro/5254_2768597008_932f71.CixfJhIB_Nrkaw.webp 2032w&quot; /&gt;&lt;figcaption&gt;启用SSH.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;4、通过 SSH 登录群晖，&lt;code&gt;sudo -i&lt;/code&gt;​ 输入管理员密码，切换到 &lt;code&gt;root&lt;/code&gt;​ 用户。&lt;/p&gt;&lt;p&gt;5、 &lt;strong&gt;查看当前阵列的详细信息&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;root@MIAO:~# cat /proc/mdstat&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Personalities : [raid1]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;md2 : active raid1 sata2p5[0] sata1p5[1]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;1948683456 blocks super 1.2 [2/2] [UU]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;md1 : active raid1 sata1p2[0] sata2p2[1]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;2097088 blocks [2/2] [UU]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;md0 : active raid1 sata1p1[0] sata2p1[1]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;2490176 blocks [2/2] [UU]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;unused devices: &amp;lt;none&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;屏幕已列出 md0、md1、md2 三个分区，其中 md0 为群晖系统分区，md1 为群晖交换分区，md2 （容量最大）即为存储分区。&lt;/p&gt;&lt;p&gt;6、 &lt;strong&gt;查看分区信息&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;root@MIAO:~# mdadm --query /dev/md2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/dev/md2: 1858.41GiB raid1 2 devices, 0 spares. Use mdadm --detail for more detail.&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;根据屏幕打印的信息，已确认 md2 为存储分区。如果是多盘位 NAS 请分别查看各分区信息仔细确认（尤其是 blocks 最大的那几个分区）。&lt;/p&gt;&lt;p&gt;7、 &lt;strong&gt;将 RAID 1 转成 SHR 单盘位（SHR 无数据保护）&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;root@MIAO:~# mdadm --grow --raid-devices=1 --force /dev/md2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;raid_disks for /dev/md2 set to 1&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;根据上面的打印信息，RAID 1 阵列已由 2 个设备成功降级为 1 个设备，即时生效。&lt;/p&gt;&lt;p&gt;8、 &lt;strong&gt;将闲置硬盘创建新的存储池&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;将之前抽出的那块硬盘需要重新插上，最好给这块硬盘做一次 &lt;strong&gt;secure erase&lt;/strong&gt; （安全擦除），然后重启系统。当群晖系统重新识别到这块硬盘时，会提示 &lt;strong&gt;“硬盘未初始化”&lt;/strong&gt;，根据提示完成初始化操作，新的存储空间被成功创建。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Basic.jpg&quot; loading=&quot;lazy&quot; width=&quot;2488&quot; height=&quot;1440&quot; src=&quot;/_astro/5254_3341360455_5ea8d5.BPAh3vG7_ZsagCX.webp&quot; srcset=&quot;/_astro/5254_3341360455_5ea8d5.BPAh3vG7_Z5WNy0.webp 640w, /_astro/5254_3341360455_5ea8d5.BPAh3vG7_1H15Vg.webp 750w, /_astro/5254_3341360455_5ea8d5.BPAh3vG7_Z1YPTfa.webp 828w, /_astro/5254_3341360455_5ea8d5.BPAh3vG7_1ptC9y.webp 1080w, /_astro/5254_3341360455_5ea8d5.BPAh3vG7_Z2rnTGI.webp 1280w, /_astro/5254_3341360455_5ea8d5.BPAh3vG7_ZtoWDh.webp 1668w, /_astro/5254_3341360455_5ea8d5.BPAh3vG7_Z1nO3EQ.webp 2048w, /_astro/5254_3341360455_5ea8d5.BPAh3vG7_ZsagCX.webp 2488w&quot; /&gt;&lt;figcaption&gt;Basic.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;最后，找到 &lt;strong&gt;存储管理器&lt;/strong&gt; - &lt;strong&gt;​ 添加存储池&lt;/strong&gt; ，将存储空间加入到存储池，期间不要忘记把 RAID 类别设置成 SHR 或 Basic（推荐 Basic）。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>群晖VMM安装OpenWrt配置旁路由全流程</title><link>https://blog.moewah.com/posts/4697/</link><guid isPermaLink="true">https://blog.moewah.com/posts/4697/</guid><description>如何在群晖NAS上通过VMM虚拟机安装OpenWrt并配置旁路由？本文详细拆解从镜像下载、VMM部署到网络设置的完整流程，助你实现软路由功能，提升家庭网络管理效率。</description><pubDate>Wed, 07 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt; 当我们花了很多米买了群晖NAS或者 DIY 硬件虚拟了黑群晖，就希望将日常的服务统统 ALL IN 梭哈，总想着去榨干硬件的性能。对于群晖 DS920+ 来说，跑一个 OpenWrt 是一件轻松的小事！那么&lt;a href=&quot;https://blog.moewah.com/posts/4697/&quot;&gt;《群晖 VMM 虚拟机安装 OpenWrt 配置旁路由》&lt;/a&gt; 这篇文章也就此产生，希望本文记录的过程能给到你一些有用的指引。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;openwrt.png&quot; loading=&quot;lazy&quot; width=&quot;860&quot; height=&quot;400&quot; src=&quot;/_astro/4106_30968971_69d812.CMrA-1Zh_Z1SJlKv.webp&quot; srcset=&quot;/_astro/4106_30968971_69d812.CMrA-1Zh_Z85y5R.webp 640w, /_astro/4106_30968971_69d812.CMrA-1Zh_15KBR.webp 750w, /_astro/4106_30968971_69d812.CMrA-1Zh_Z26Pkgb.webp 828w, /_astro/4106_30968971_69d812.CMrA-1Zh_Z1SJlKv.webp 860w&quot; /&gt;&lt;figcaption&gt;openwrt.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;一、前期准备&lt;a href=&quot;#一前期准备&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1.1 OpenWrt 镜像下载&lt;a href=&quot;#11-openwrt-镜像下载&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;自编译 x86_64 平台的 OpenWrt 镜像 -&amp;gt; &lt;a href=&quot;https://blog.moewah.com/posts/4003/&quot;&gt;《OpenWrt 编译教程》&lt;/a&gt;，或者你也可以直接下载这里推荐的镜像（下载文件到桌面）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# OPENWRT 镜像下载地址：https://imgs.mpdn.fun:8443/lede/x86_64/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Plus 版本为功能较多的版本，推荐下载&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 默认账号 root 密码 password&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# OPENWRT默认ip 192.168.1.1&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;1.2 安装 Virtual Machine Manager&lt;a href=&quot;#12-安装-virtual-machine-manager&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;大部分群晖设备都可以在 &lt;strong&gt;套件中心&lt;/strong&gt; 搜索&lt;code&gt;Virtual Machine Manager&lt;/code&gt;安装。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;安装 Virtual Machine Manager.png&quot; loading=&quot;lazy&quot; width=&quot;1009&quot; height=&quot;593&quot; src=&quot;/_astro/4697_2408522753_559160.ChgpOs7l_Z1RGCFr.webp&quot; srcset=&quot;/_astro/4697_2408522753_559160.ChgpOs7l_Z1oRUFC.webp 640w, /_astro/4697_2408522753_559160.ChgpOs7l_Z9CmhC.webp 750w, /_astro/4697_2408522753_559160.ChgpOs7l_Z6HN.webp 828w, /_astro/4697_2408522753_559160.ChgpOs7l_Z1RGCFr.webp 1009w&quot; /&gt;&lt;figcaption&gt;安装 Virtual Machine Manager.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;部分较老旧的设备可下载SPK安装包安装 -&amp;gt; &lt;a href=&quot;https://archive.synology.com/download/Package/Virtualization&quot; target=&quot;_blank&quot;&gt;传送门&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;1.3 开启 Open vSwitch&lt;a href=&quot;#13-开启-open-vswitch&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;进入DSM系统，依次点击 &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;strong&gt;Open vSwitch 设置&lt;/strong&gt;，勾选 &lt;strong&gt;启用 Open vSwitch&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;启用 Open vSwitch.png&quot; loading=&quot;lazy&quot; width=&quot;989&quot; height=&quot;564&quot; src=&quot;/_astro/4697_1757376518_011a53.C6_4VSwf_Z27sR00.webp&quot; srcset=&quot;/_astro/4697_1757376518_011a53.C6_4VSwf_1OlsrG.webp 640w, /_astro/4697_1757376518_011a53.C6_4VSwf_Z1GAoxr.webp 750w, /_astro/4697_1757376518_011a53.C6_4VSwf_Zu2it7.webp 828w, /_astro/4697_1757376518_011a53.C6_4VSwf_Z27sR00.webp 989w&quot; /&gt;&lt;figcaption&gt;启用 Open vSwitch.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;二、VMM 虚拟机安装 OpenWrt&lt;a href=&quot;#二vmm-虚拟机安装-openwrt&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;2.1 上传硬盘镜像&lt;a href=&quot;#21-上传硬盘镜像&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;打开 VMM 依次点击 &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;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;上传 OpenWrt 镜像.png&quot; loading=&quot;lazy&quot; width=&quot;1033&quot; height=&quot;630&quot; src=&quot;/_astro/4697_2983459244_5aae5d.DZB2dQzC_21wds8.webp&quot; srcset=&quot;/_astro/4697_2983459244_5aae5d.DZB2dQzC_Z2izo6r.webp 640w, /_astro/4697_2983459244_5aae5d.DZB2dQzC_CfrVv.webp 750w, /_astro/4697_2983459244_5aae5d.DZB2dQzC_xsUpS.webp 828w, /_astro/4697_2983459244_5aae5d.DZB2dQzC_21wds8.webp 1033w&quot; /&gt;&lt;figcaption&gt;上传 OpenWrt 镜像.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;选择准备好的 OpenWrt 镜像文件&lt;code&gt;openwrt-x86-64-generic-squashfs-combined.img&lt;/code&gt;进行上传。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;如果下载的是&lt;code&gt;.gz&lt;/code&gt;压缩文件需要提前解压。Win 系统可以双击压缩包解压，而 Linux / macOS 需要在终端运行 &lt;code&gt;gunzip openwrt-x86-64-generic-squashfs-combined.img.gz&lt;/code&gt; 命令解压。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2 创建虚拟机&lt;a href=&quot;#22-创建虚拟机&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&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;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;导入硬盘映像创建虚拟机.png&quot; loading=&quot;lazy&quot; width=&quot;1032&quot; height=&quot;629&quot; src=&quot;/_astro/4697_1587260362_3feccb.DfzreARC_Z1ytkKi.webp&quot; srcset=&quot;/_astro/4697_1587260362_3feccb.DfzreARC_Z1BVsCW.webp 640w, /_astro/4697_1587260362_3feccb.DfzreARC_1iSnp0.webp 750w, /_astro/4697_1587260362_3feccb.DfzreARC_1e6PSn.webp 828w, /_astro/4697_1587260362_3feccb.DfzreARC_Z1ytkKi.webp 1032w&quot; /&gt;&lt;figcaption&gt;导入硬盘映像创建虚拟机.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;点击 &lt;strong&gt;下一步&lt;/strong&gt; ，配置常用规格，自定义虚拟机名称、CPUx1 、内存x1GB。CPU配置首选推荐： &lt;strong&gt;启用 CPU 兼容模式&lt;/strong&gt; ，部分黑群晖选择 &lt;strong&gt;启用 CPU 兼容模式&lt;/strong&gt; 可能会导致虚拟机启动失败，遇到这种情况可以改成 Hyper-V 模式。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;规格配置.png&quot; loading=&quot;lazy&quot; width=&quot;1313&quot; height=&quot;702&quot; src=&quot;/_astro/4697_2130366360_5c7c5a.D1zdK1ba_Zjtq1o.webp&quot; srcset=&quot;/_astro/4697_2130366360_5c7c5a.D1zdK1ba_ZeiNO6.webp 640w, /_astro/4697_2130366360_5c7c5a.D1zdK1ba_Z1VNm5P.webp 750w, /_astro/4697_2130366360_5c7c5a.D1zdK1ba_XlkCz.webp 828w, /_astro/4697_2130366360_5c7c5a.D1zdK1ba_1Se1aE.webp 1080w, /_astro/4697_2130366360_5c7c5a.D1zdK1ba_Z1dYShs.webp 1280w, /_astro/4697_2130366360_5c7c5a.D1zdK1ba_Zjtq1o.webp 1313w&quot; /&gt;&lt;figcaption&gt;规格配置.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;继续 &lt;strong&gt;下一步&lt;/strong&gt; 配置 &lt;strong&gt;存储空间&lt;/strong&gt;，选择之前导入硬盘镜像&lt;code&gt;openwrt-x86-64-generic-squashfs-combined.img&lt;/code&gt;，为了维护方便 &lt;strong&gt;虚拟硬盘控制器&lt;/strong&gt; 建议勾选 &lt;strong&gt;空间回收&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;存储硬盘.png&quot; loading=&quot;lazy&quot; width=&quot;1247&quot; height=&quot;659&quot; src=&quot;/_astro/4697_3114160031_981c92.BIuh85cw_Z2tQHHt.webp&quot; srcset=&quot;/_astro/4697_3114160031_981c92.BIuh85cw_1rlMXw.webp 640w, /_astro/4697_3114160031_981c92.BIuh85cw_Z2va2wb.webp 750w, /_astro/4697_3114160031_981c92.BIuh85cw_ZsuwSB.webp 828w, /_astro/4697_3114160031_981c92.BIuh85cw_1UVfzu.webp 1080w, /_astro/4697_3114160031_981c92.BIuh85cw_Z2tQHHt.webp 1247w&quot; /&gt;&lt;figcaption&gt;存储硬盘.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;继续 &lt;strong&gt;下一步&lt;/strong&gt; ，开始 &lt;strong&gt;配置网络&lt;/strong&gt;，选择正在使用的网络接口 Default VM Network，并建议将型号设置为 &lt;code&gt;e1000&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;配置网络接口.png&quot; loading=&quot;lazy&quot; width=&quot;1277&quot; height=&quot;712&quot; src=&quot;/_astro/4697_2296464319_05f0ee.DaJaUOUz_ZEYGw5.webp&quot; srcset=&quot;/_astro/4697_2296464319_05f0ee.DaJaUOUz_Z1EqcX7.webp 640w, /_astro/4697_2296464319_05f0ee.DaJaUOUz_Z2d5Tpb.webp 750w, /_astro/4697_2296464319_05f0ee.DaJaUOUz_1l9cjC.webp 828w, /_astro/4697_2296464319_05f0ee.DaJaUOUz_1R9R07.webp 1080w, /_astro/4697_2296464319_05f0ee.DaJaUOUz_ZEYGw5.webp 1277w&quot; /&gt;&lt;figcaption&gt;配置网络接口.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;其它设置：1、建议开启 &lt;strong&gt;自动启动&lt;/strong&gt; ；2、&lt;strong&gt;指定权限&lt;/strong&gt; -&amp;gt; 允许本地用户建议勾选群晖的管理用户。3、勾选 &lt;strong&gt;创建后开启虚拟机&lt;/strong&gt;。最后点击 &lt;strong&gt;应用&lt;/strong&gt;，创建虚拟机。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三、配置旁路由&lt;a href=&quot;#三配置旁路由&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;3.1 修改网络配置&lt;a href=&quot;#31-修改网络配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;选择正在运行的 OpenWrt 虚拟机，点击 &lt;strong&gt;连接&lt;/strong&gt; 进入OpenWrt 终端&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;ssh终端.png&quot; loading=&quot;lazy&quot; width=&quot;1163&quot; height=&quot;686&quot; src=&quot;/_astro/4697_84793591_90661c.Bd9y3DCs_23Hyro.webp&quot; srcset=&quot;/_astro/4697_84793591_90661c.Bd9y3DCs_Z2fdkGw.webp 640w, /_astro/4697_84793591_90661c.Bd9y3DCs_Z1Wkr9H.webp 750w, /_astro/4697_84793591_90661c.Bd9y3DCs_nV8j9.webp 828w, /_astro/4697_84793591_90661c.Bd9y3DCs_Z1NnPNa.webp 1080w, /_astro/4697_84793591_90661c.Bd9y3DCs_23Hyro.webp 1163w&quot; /&gt;&lt;figcaption&gt;ssh终端.png&lt;/figcaption&gt;&lt;/figure&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;figure&gt;&lt;img alt=&quot;ssh终端信息.png&quot; loading=&quot;lazy&quot; width=&quot;690&quot; height=&quot;114&quot; src=&quot;/_astro/3643_560498413_2e8596.CPLwxW4t_ZdG7NI.webp&quot; srcset=&quot;/_astro/3643_560498413_2e8596.CPLwxW4t_ZO6W96.webp 640w, /_astro/3643_560498413_2e8596.CPLwxW4t_ZdG7NI.webp 690w&quot; /&gt;&lt;figcaption&gt;ssh终端信息.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;运行命令修改网络配置：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vi /etc/config/network&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;默认配置如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;config interface &apos;lan&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option type &apos;bridge&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option ifname &apos;eth0&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option proto &apos;static&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option ipaddr &apos;192.168.1.1&apos; #默认openwrt ip地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option netmask &apos;255.255.255.0&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option ip6assign &apos;60&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;修改为：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;config interface &apos;lan&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option type &apos;bridge&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option ifname &apos;eth0&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option proto &apos;static&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option ipaddr &apos;192.168.0.2&apos; #主路由192.168.0.1,旁路由我设置192.168.0.2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option netmask &apos;255.255.255.0&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option ip6assign &apos;60&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option gateway &apos;192.168.0.1&apos; # 填写为主路由地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option dns &apos;114.114.114.114 223.5.5.5&apos; # 正常可用的DNS地址&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;按 &lt;code&gt;ESC&lt;/code&gt; 输入&lt;code&gt;:wq&lt;/code&gt; 保存并退出。运行下面命令，重启网络使配置生效，当然你也可以 &lt;code&gt;reboot&lt;/code&gt; 重启 &lt;a href=&quot;https://www.moewah.com/tag/openwrt/&quot; target=&quot;_blank&quot;&gt;openwrt&lt;/a&gt; 都行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/etc/init.d/network restart&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.2 配置修改 OPENWRT 旁路由 DHCP&lt;a href=&quot;#32-配置修改-openwrt-旁路由-dhcp&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;完成网络配置，这时候浏览器输入旁路由 ip 地址 &lt;code&gt;192.168.0.2&lt;/code&gt;，输入账号密码可以成功进入。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;OpenWrt登录界面.png&quot; loading=&quot;lazy&quot; width=&quot;1310&quot; height=&quot;635&quot; src=&quot;/_astro/3643_1784531347_f02701.Bqly5qkY_itzJD.webp&quot; srcset=&quot;/_astro/3643_1784531347_f02701.Bqly5qkY_Oodms.webp 640w, /_astro/3643_1784531347_f02701.Bqly5qkY_99fPC.webp 750w, /_astro/3643_1784531347_f02701.Bqly5qkY_1OOHiY.webp 828w, /_astro/3643_1784531347_f02701.Bqly5qkY_1NbHAT.webp 1080w, /_astro/3643_1784531347_f02701.Bqly5qkY_2rbPqV.webp 1280w, /_astro/3643_1784531347_f02701.Bqly5qkY_itzJD.webp 1310w&quot; /&gt;&lt;figcaption&gt;OpenWrt登录界面.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;依次点击 &lt;strong&gt;网络&lt;/strong&gt; - &lt;strong&gt;接口&lt;/strong&gt;，修改 &lt;strong&gt;LAN&lt;/strong&gt; 接口设置&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;修改lan接口.png&quot; loading=&quot;lazy&quot; width=&quot;1269&quot; height=&quot;329&quot; src=&quot;/_astro/3643_60465722_ba2815.D7rR6WfU_Z5gzih.webp&quot; srcset=&quot;/_astro/3643_60465722_ba2815.D7rR6WfU_Z1qyLkc.webp 640w, /_astro/3643_60465722_ba2815.D7rR6WfU_6WVGO.webp 750w, /_astro/3643_60465722_ba2815.D7rR6WfU_1DKfW.webp 828w, /_astro/3643_60465722_ba2815.D7rR6WfU_Z1y2phh.webp 1080w, /_astro/3643_60465722_ba2815.D7rR6WfU_Z5gzih.webp 1269w&quot; /&gt;&lt;figcaption&gt;修改lan接口.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;进入高级设置，勾选 &lt;strong&gt;动态 DHCP&lt;/strong&gt;、&lt;strong&gt;强制&lt;/strong&gt;，填写子网掩码 &lt;code&gt;255.255.255.0&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;修改DHCP.png&quot; loading=&quot;lazy&quot; width=&quot;1118&quot; height=&quot;552&quot; src=&quot;/_astro/4697_834985994_084566.DAUrF5ah_10APtO.webp&quot; srcset=&quot;/_astro/4697_834985994_084566.DAUrF5ah_qW1gx.webp 640w, /_astro/4697_834985994_084566.DAUrF5ah_ZbqxUo.webp 750w, /_astro/4697_834985994_084566.DAUrF5ah_29LGh2.webp 828w, /_astro/4697_834985994_084566.DAUrF5ah_Z2aFN7n.webp 1080w, /_astro/4697_834985994_084566.DAUrF5ah_10APtO.webp 1118w&quot; /&gt;&lt;figcaption&gt;修改DHCP.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;其中 &lt;strong&gt;DHCP 选项&lt;/strong&gt; 填写格式如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3,192.168.0.2 #3,表示设置网关地址选项，192.168.0.2 为旁路由ip&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;6,192.168.0.2 #6,表示设置DNS服务器地址选项，192.168.0.2 为旁路由ip&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.3 关闭/修改主路由 DHCP&lt;a href=&quot;#33-关闭修改主路由-dhcp&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;要么将主路由 DHCP 关闭，一定要开启 DHCP 则需要将网关地址和 DNS 地址填写为旁路由 ip 地址，然后重启主路由器。&lt;/strong&gt; （考虑到不同路由器的差异，不一一举例。我用的是梅林固件，我这里选择关闭 DHCP）&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;主路由配置.jpg&quot; loading=&quot;lazy&quot; width=&quot;2118&quot; height=&quot;1532&quot; src=&quot;/_astro/3643_3961834097_c24b5f.CQhZH3rz_1T2oMi.webp&quot; srcset=&quot;/_astro/3643_3961834097_c24b5f.CQhZH3rz_Z2qi5d.webp 640w, /_astro/3643_3961834097_c24b5f.CQhZH3rz_Z24gWVl.webp 750w, /_astro/3643_3961834097_c24b5f.CQhZH3rz_PeVI6.webp 828w, /_astro/3643_3961834097_c24b5f.CQhZH3rz_R5Nvi.webp 1080w, /_astro/3643_3961834097_c24b5f.CQhZH3rz_27pY43.webp 1280w, /_astro/3643_3961834097_c24b5f.CQhZH3rz_Z1WtxBq.webp 1668w, /_astro/3643_3961834097_c24b5f.CQhZH3rz_1JAiwX.webp 2048w, /_astro/3643_3961834097_c24b5f.CQhZH3rz_1T2oMi.webp 2118w&quot; /&gt;&lt;figcaption&gt;主路由配置.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;此时，可以通过 OPEN­WRT 旁路由进行留学、去广告等相关设置。 为所欲为的事情不予细说，各位请自行发挥。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;四、常见问题 FAQ&lt;a href=&quot;#四常见问题-faq&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q1：OpenWrt 镜像应该下载哪个版本？&lt;a href=&quot;#q1openwrt-镜像应该下载哪个版本&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;推荐下载 &lt;strong&gt;x86_64 平台的 Plus 版本&lt;/strong&gt;，功能较全面，适合大多数使用场景。下载链接参考上文 1.1 节。&lt;/p&gt;&lt;p&gt;下载完成后注意：如果文件是 &lt;code&gt;.gz&lt;/code&gt; 压缩包，&lt;strong&gt;需要先解压再导入&lt;/strong&gt;。Windows 双击解压即可，macOS / Linux 终端运行 &lt;code&gt;gunzip 文件名.img.gz&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;默认账号 &lt;code&gt;root&lt;/code&gt;，密码 &lt;code&gt;password&lt;/code&gt;，默认 IP 地址 &lt;code&gt;192.168.1.1&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q2：虚拟机启动失败怎么办？&lt;a href=&quot;#q2虚拟机启动失败怎么办&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;部分黑群晖选择 &lt;strong&gt;启用 CPU 兼容模式&lt;/strong&gt; 可能导致虚拟机启动失败。遇到这种情况，可以改成 &lt;strong&gt;Hyper-V 模式&lt;/strong&gt; 再试。&lt;/p&gt;&lt;p&gt;另外确认：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;OpenWrt 镜像文件是否正确解压&lt;/li&gt;
&lt;li&gt;内存分配至少 512MB（推荐 1GB）&lt;/li&gt;
&lt;li&gt;存储空间是否充足&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q3：配置完网络后无法访问 OpenWrt 管理界面？&lt;a href=&quot;#q3配置完网络后无法访问-openwrt-管理界面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;先检查 IP 是否冲突，确保旁路由 IP 地址（如 &lt;code&gt;192.168.0.2&lt;/code&gt;）与局域网其他设备不冲突。&lt;/p&gt;&lt;p&gt;再确认：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;网络配置文件 &lt;code&gt;/etc/config/network&lt;/code&gt; 中 &lt;code&gt;gateway&lt;/code&gt; 和 &lt;code&gt;dns&lt;/code&gt; 填写正确&lt;/li&gt;
&lt;li&gt;已运行 &lt;code&gt;/etc/init.d/network restart&lt;/code&gt; 或重启虚拟机&lt;/li&gt;
&lt;li&gt;主路由 DHCP 已关闭或网关/DNS 已指向旁路由&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q4：旁路由配置后设备无法上网？&lt;a href=&quot;#q4旁路由配置后设备无法上网&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;ol&gt;
&lt;li&gt;&lt;strong&gt;主路由 DHCP 设置&lt;/strong&gt;：要么完全关闭主路由 DHCP，要么将主路由 DHCP 的网关和 DNS 都指向旁路由 IP&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;旁路由 DHCP 配置&lt;/strong&gt;：确保 DHCP 选项填写正确，格式为：
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3,192.168.0.2  # 设置网关为旁路由&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;6,192.168.0.2  # 设置 DNS 为旁路由&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;终端设备&lt;/strong&gt;：重启终端设备的网络连接或直接重启设备，让 DHCP 重新分配&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q5：如何验证旁路由配置成功？&lt;a href=&quot;#q5如何验证旁路由配置成功&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;简单几步验证：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;查看终端设备的网络信息，&lt;strong&gt;网关和 DNS 是否指向旁路由 IP&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;访问旁路由管理界面（如 &lt;code&gt;192.168.0.2&lt;/code&gt;），能正常打开即说明网络连通&lt;/li&gt;
&lt;li&gt;在 OpenWrt 后台查看连接设备列表，确认设备已接入&lt;/li&gt;
&lt;li&gt;尝试访问国内外网站，验证是否按预期分流&lt;/li&gt;
&lt;/ol&gt;&lt;blockquote&gt;&lt;p&gt;配置成功后，后续可根据需要在 OpenWrt 后台安装各类插件，实现去广告、留学等功能。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>群晖NAS存储池排序与名称修改指南</title><link>https://blog.moewah.com/posts/3688/</link><guid isPermaLink="true">https://blog.moewah.com/posts/3688/</guid><description>如何调整群晖NAS中存储池的顺序和存储空间名称？本文详细讲解通过SSH命令行修改存储池ID与存储空间命名的方法，解决因硬盘更换导致的乱序问题，适用于NAS私有云用户进行系统优化。</description><pubDate>Mon, 22 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;博主之前使用的是 DS216+ii 老同志，因盘位较紧张（双盘位）当时磁盘设置的是 &lt;code&gt;basic&lt;/code&gt; 模式，前不久在某鱼购得国行全新群晖DS920+ 顺带又新买了两块8T硬盘，打算四盘分配两组 RAID1 开启数据保护。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;v2-ec27c70d4b955410c32b4d24d0ccf293_1440w.jpg&quot; loading=&quot;lazy&quot; width=&quot;1286&quot; height=&quot;604&quot; src=&quot;/_astro/3688_3875452296_8a424e.C0YLeo3V_Z2a4Ltg.webp&quot; srcset=&quot;/_astro/3688_3875452296_8a424e.C0YLeo3V_ZrGEUS.webp 640w, /_astro/3688_3875452296_8a424e.C0YLeo3V_Zk5OMg.webp 750w, /_astro/3688_3875452296_8a424e.C0YLeo3V_Z2kmSdI.webp 828w, /_astro/3688_3875452296_8a424e.C0YLeo3V_24u9Pm.webp 1080w, /_astro/3688_3875452296_8a424e.C0YLeo3V_2j2WE6.webp 1280w, /_astro/3688_3875452296_8a424e.C0YLeo3V_Z2a4Ltg.webp 1286w&quot; /&gt;&lt;figcaption&gt;v2-ec27c70d4b955410c32b4d24d0ccf293_1440w.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;旧的磁盘，磁盘1、磁盘2，对应存储池1、存储池2。新买两个8T硬盘插上做RAID1，对应则为存储池3。在完成旧磁盘对新磁盘的数据迁移后，删除磁盘1、磁盘2 新增磁盘将其组成 RAID1，这时存储管理器可以查看到：存储池1、存储池3 ，对应存储空间1、存储空间3。如果有和我一样的强迫症患者需要更改调整这种乱序的情况，请参考本文示例举一反三。&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;免责声明：&lt;/strong&gt;
1、若通过此文操作造成的数据丢失，本站概不负责。数据无价，操作前务必备份重要的数据。
2、文章示例非本机实操内容，请举一反三。
3、先看懂文章，再动手不迟。&lt;/p&gt;&lt;/blockquote&gt;
&lt;section&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;code&gt;SSH&lt;/code&gt;且需要切换至 &lt;code&gt;root&lt;/code&gt;账号，请进入群晖DSM在开启 &lt;strong&gt;控制面板&lt;/strong&gt; - &lt;strong&gt;终端机和 SNMP&lt;/strong&gt; 中的&lt;code&gt;ssh&lt;/code&gt;功能。&lt;/p&gt;&lt;p&gt;2、ssh 登录，通过命令 &lt;code&gt;sudo -i &lt;/code&gt;切换 &lt;code&gt;root&lt;/code&gt; 用户运行。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;synospace --meta -e&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;打印信息如下：（打印的信息每个人都不同，请根据实际情况举一反三）&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt; [/dev/md3]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt; ---------------------&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt;    Descriptions=[希捷 酷狼6T Basic]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt;    Reuse Space ID=[reuse_2]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt; [/dev/md2]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt; ---------------------&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt;    Descriptions=[希捷 酷狼4T Basic]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt;    Reuse Space ID=[reuse_1]&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;2、修改存储池顺序&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;命令格式：&lt;code&gt;synospace --meta -s -d &quot;{存储池描述}&quot; -i reuse_{存储池ID} {设备路径}&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;例如将上述 &lt;strong&gt;存储池 2&lt;/strong&gt; 重新编号至 ** 存储池 3**，则输入以下命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;synospace&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;-s&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;&quot;&lt;/span&gt;&lt;span&gt;希捷 酷狼6T Basic&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;reuse_3&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/dev/md3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; success to set meta (&lt;/span&gt;&lt;/span&gt;&lt;span&gt;希捷&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;酷狼6T&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Basic,reuse_3&lt;/span&gt;&lt;span&gt;&lt;span&gt;) into space &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;/dev/md3&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;**注意：**可以不添加 &lt;code&gt;-d&lt;/code&gt; 参数指定存储池描述，如此存储池描述会被清空，后期可通过 &lt;strong&gt;存储空间管理员&lt;/strong&gt; -&amp;gt; &lt;strong&gt;存储池&lt;/strong&gt; -&amp;gt; &lt;strong&gt;动作&lt;/strong&gt; -&amp;gt; &lt;strong&gt;更改设置&lt;/strong&gt;，来修改存储池描述。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;PS：这里的调整存储空间名称指的是，将 &lt;code&gt;volume1&lt;/code&gt; 更改为 &lt;code&gt;volume2&lt;/code&gt;  让 &lt;strong&gt;存储空间 1&lt;/strong&gt; 更新为 &lt;strong&gt;存储空间2&lt;/strong&gt;。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;1、先停止所有群晖服务&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# DSM 6.x 系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;syno_poweroff_task&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# DSM 7.x 系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;umount&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/volume1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-f&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-k&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;2、通过依次打开 &lt;strong&gt;存储空间管理员&lt;/strong&gt; -&amp;gt; &lt;strong&gt;存储池&lt;/strong&gt; -&amp;gt; &lt;strong&gt;展开&lt;/strong&gt;，查看各个存储池&lt;code&gt;是否支持多个存储空间&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2.1 若存储池支持多个存储空间&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;对于&lt;code&gt;支持多个存储空间&lt;/code&gt;的存储池，群晖将磁盘分区设置为一个 LVM PV (Physical Volume)，并在此 PV 上单独创建一个 VG (Volume Group)，因此在这个 VG 上可以创建多个 LV (Logical Volume)，亦可以自由调整这些 LV 的大小，LV 即为存储空间，因此修改 LV 的名称即可达到修改存储空间顺序的目的。&lt;/p&gt;&lt;p&gt;1）查看现有存储空间列表&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lvm lvscan&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt;  ACTIVE            &apos;/dev/vg1/syno_vg_reserved_area&apos; [12.00 MiB] inherit&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt;  ACTIVE            &apos;/dev/vg1/volume_2&apos; [256.00 GiB] inherit&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt;  ACTIVE            &apos;/dev/vg1/volume_3&apos; [1.00 TiB] inherit&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;2）修改存储空间顺序&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;命令格式：&lt;code&gt;lvm lvrename {VG名称} {旧LV名称} {新LV名称}&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;例如将上述 &lt;strong&gt;存储空间 2&lt;/strong&gt; 修改为 ** 存储空间 3**，** 存储空间 3** 修改为 ** 存储空间 4**，则输入以下命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lvm lvrename vg1 volume_3 volume_4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt;  Renamed &quot;volume_3&quot; to &quot;volume_4&quot; in volume group &quot;vg1&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lvm lvrename vg1 volume_2 volume_3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;gt;  Renamed &quot;volume_2&quot; to &quot;volume_3&quot; in volume group &quot;vg1&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;3）重启使配置生效&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;reboot&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;共享文件夹&lt;/strong&gt; 以及 &lt;strong&gt;iSCSI 服务&lt;/strong&gt; 已自动修改，检查各服务是否正常。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2.2 若存储池不支持多个存储空间&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;对于&lt;code&gt;不支持多个存储空间&lt;/code&gt;的存储池，群晖直接将存储空间应用于整个磁盘分区上，因此无法调整大小，或增加多个空间，为此我们直接修改群晖内部的编号。&lt;/p&gt;&lt;p&gt;1）查看现有存储空间列表&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;spacetool&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--synoblock-enum&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&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; Syno-Block of /dev/sda &lt;/span&gt;&lt;span&gt;******&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;   Version: 5&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;   Space Type: Volume&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;   Space Path: /volume1&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;gt;******&lt;/span&gt;&lt;span&gt; Syno-Block of /dev/sdb &lt;/span&gt;&lt;span&gt;******&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;   Version: 5&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;   Space Type: Volume&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;   Space Path: /volume2&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;2）修改存储空间顺序&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;命令格式：&lt;code&gt;synospace --synoblock -s {设备路径} -v volume_{存储空间编号}&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;例如将上述 &lt;strong&gt;存储空间 1&lt;/strong&gt; 与 ** 存储空间 2** 编号互换，则输入以下命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;synospace&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--synoblock&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-s&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/dev/sda&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;volume_2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; success to set syno-block on disk &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;/dev/sda&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;synospace&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--synoblock&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-s&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/dev/sdb&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;volume_1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; success to set syno-block on disk &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;/dev/sdb&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;3）重启使配置生效&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;reboot&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;共享文件夹&lt;/strong&gt; 以及 &lt;strong&gt;iSCSI 服务&lt;/strong&gt; 已自动修改，检查各服务是否正常。&lt;/p&gt;&lt;/section&gt;
&lt;section&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://forum.synology.com/enu/viewtopic.php?t=103417&quot; target=&quot;_blank&quot;&gt;Diskstation rename volume - rename volume group&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[&lt;a href=&quot;https://forum.synology.com/enu/viewtopic.php?t=41586&quot; target=&quot;_blank&quot;&gt;SOLVED] Manually modifying the volumes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>群晖NAS套件无法安装问题终极解决方案</title><link>https://blog.moewah.com/posts/3695/</link><guid isPermaLink="true">https://blog.moewah.com/posts/3695/</guid><description>群晖NAS提示&apos;无法正确安装此套件&apos;怎么办？本文详细解析因pgsql数据库异常导致的套件安装失败问题，提供SSH命令行修复方案，助你快速恢复Video Station、Audio Station等核心套件的正常运行。</description><pubDate>Mon, 22 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt; 接上篇&lt;a href=&quot;https://blog.moewah.com/posts/3688/&quot;&gt;《修改群晖NAS存储池排序与存储空间名称》&lt;/a&gt;最近新购群晖DS920+完成数据迁移、组RAID1磁盘阵列等操作，出于一些原因需要重装系统，但在系统安装完后莫名其妙的一幕出现了，部分群晖套件无法安装例如 Video Station、Audio Station 以及依赖 Synology Application Service 相关套件均无法安装。群晖报错** 无法正确安装此套件** / ** 无法启动”某某套件”** 。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;无法正确安装此套件.jpg&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;567&quot; src=&quot;/_astro/3695_3061723102_065978.BuSck-IM_O4Hjh.webp&quot; srcset=&quot;/_astro/3695_3061723102_065978.BuSck-IM_5aXE4.webp 640w, /_astro/3695_3061723102_065978.BuSck-IM_1cQgXi.webp 750w, /_astro/3695_3061723102_065978.BuSck-IM_80hh4.webp 828w, /_astro/3695_3061723102_065978.BuSck-IM_O4Hjh.webp 1080w&quot; /&gt;&lt;figcaption&gt;无法正确安装此套件.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&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;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;iShot2021-03-21 14.59.20.jpg&quot; loading=&quot;lazy&quot; width=&quot;1852&quot; height=&quot;556&quot; src=&quot;/_astro/3695_3409445555_ecdb59.BIv94BZC_2f6bpU.webp&quot; srcset=&quot;/_astro/3695_3409445555_ecdb59.BIv94BZC_Z1asEK6.webp 640w, /_astro/3695_3409445555_ecdb59.BIv94BZC_Z19XuSV.webp 750w, /_astro/3695_3409445555_ecdb59.BIv94BZC_2vyHCQ.webp 828w, /_astro/3695_3409445555_ecdb59.BIv94BZC_1DGm7i.webp 1080w, /_astro/3695_3409445555_ecdb59.BIv94BZC_kWMOB.webp 1280w, /_astro/3695_3409445555_ecdb59.BIv94BZC_Z1mgIxW.webp 1668w, /_astro/3695_3409445555_ecdb59.BIv94BZC_2f6bpU.webp 1852w&quot; /&gt;&lt;figcaption&gt;iShot2021-03-21 14.59.20.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;查看&lt;code&gt;/var/log/messages&lt;/code&gt;日志文件：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;进入ssh查看日志文件 &lt;code&gt;/var/log/messages&lt;/code&gt; 发现一些有用的信息，看来问题在于&lt;code&gt;pgsql&lt;/code&gt; 数据库。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;error.jpg&quot; loading=&quot;lazy&quot; width=&quot;734&quot; height=&quot;200&quot; src=&quot;/_astro/3695_1229444514_a05d6f.CdAMyRWt_Z1nlKGe.webp&quot; srcset=&quot;/_astro/3695_1229444514_a05d6f.CdAMyRWt_Z10tVwS.webp 640w, /_astro/3695_1229444514_a05d6f.CdAMyRWt_Z1nlKGe.webp 734w&quot; /&gt;&lt;figcaption&gt;error.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&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;1、 ssh 登录，通过命令 &lt;code&gt;sudo -i &lt;/code&gt;切换 &lt;code&gt;root&lt;/code&gt; 用户。&lt;/p&gt;&lt;p&gt;2、运行脚本，重建 &lt;code&gt;pgsql&lt;/code&gt;数据库：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 官方服务器（若不稳定，请用备用脚本）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl -s https://ftp.synology.com/support_web/Tools/script/pgsql_analyzer.sh | sh -s -- -r&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 若官方下载服务器不稳定，作为备用，请执行下面命令&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget https://blog.moewah.com/source/pgsql_analyzer.sh &amp;amp;&amp;amp; chmod +x pgsql_analyzer.sh &amp;amp;&amp;amp; ./pgsql_analyzer.sh -r&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如图所示，等待数据重建完成。如下图&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;iShot2021-03-21 14.15.11.jpg&quot; loading=&quot;lazy&quot; width=&quot;1758&quot; height=&quot;120&quot; src=&quot;/_astro/3695_2689899423_998186.BGStT-hO_ZP9tdv.webp&quot; srcset=&quot;/_astro/3695_2689899423_998186.BGStT-hO_ZSYbqA.webp 640w, /_astro/3695_2689899423_998186.BGStT-hO_1bfqO2.webp 750w, /_astro/3695_2689899423_998186.BGStT-hO_wY2lg.webp 828w, /_astro/3695_2689899423_998186.BGStT-hO_1RtlDQ.webp 1080w, /_astro/3695_2689899423_998186.BGStT-hO_BSHEl.webp 1280w, /_astro/3695_2689899423_998186.BGStT-hO_Z2b2anS.webp 1668w, /_astro/3695_2689899423_998186.BGStT-hO_ZP9tdv.webp 1758w&quot; /&gt;&lt;figcaption&gt;iShot2021-03-21 14.15.11.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;3、重启系统&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;reboot&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;不出意外的话，群晖套件此时应该可以正常安装了。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>PVE中安装OpenWrt配置旁路由教程</title><link>https://blog.moewah.com/posts/3643/</link><guid isPermaLink="true">https://blog.moewah.com/posts/3643/</guid><description>如何在Proxmox VE环境下搭建OpenWrt软路由？本文详细讲解从虚拟机创建到旁路网关配置的全流程，解决小空间路由器部署难题，助你轻松实现网络分流与性能优化。</description><pubDate>Thu, 11 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt; 老家卧室的一台工控机（PVE宿主环境）下运行着黑群晖，家里的弱电箱空间狭小放不了稍大的硬路由器，性能较鸡肋。最后干脆在PVE环境再跑个软路由做旁路网关来分担压力，编译 OPENWRT 固件太耗时，恩山论坛有位网友编译了一个全功能版本的固件，就直接拿来用，本篇文章将记录如何在 Proxmox VE 环境通过虚拟机安装 OpenWrt 配置旁路由的过程，仅做参考。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;openwrt-1.jpg&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;576&quot; src=&quot;/_astro/3643_1671586966_2fe759.8nceeT4Z_Z7SVry.webp&quot; srcset=&quot;/_astro/3643_1671586966_2fe759.8nceeT4Z_ZHQT4f.webp 640w, /_astro/3643_1671586966_2fe759.8nceeT4Z_1PXSNu.webp 750w, /_astro/3643_1671586966_2fe759.8nceeT4Z_PLixD.webp 828w, /_astro/3643_1671586966_2fe759.8nceeT4Z_Z7SVry.webp 1024w&quot; /&gt;&lt;figcaption&gt;openwrt-1.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# OPENWRT 镜像下载地址：https://imgs.mpdn.fun:8443/lede/x86_64/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Plus 版本为功能较多的版本，推荐下载&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 默认账号 root 密码 password&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# OPENWRT默认ip 192.168.1.1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# OPENWRT 固件来自恩山论坛用户@bleach1991&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# img2kvm 下载地址 http://dl.everun.top/softwares/utilities/img2kvm/img2kvm&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;section&gt;&lt;h2&gt;PVE创建虚拟机&lt;a href=&quot;#pve创建虚拟机&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;关于Proxmox VE的安装教程不赘述-&amp;gt; &lt;a href=&quot;https://blog.moewah.com/posts/2497/&quot;&gt;戳这里&lt;/a&gt;&lt;/p&gt;&lt;p&gt;使用 PVE 创建虚拟机，&lt;strong&gt;名称&lt;/strong&gt;（随意），记住你的 &lt;code&gt;VM ID&lt;/code&gt;，我这里是 &lt;code&gt;102 &lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;image-20210311112754107.png&quot; loading=&quot;lazy&quot; width=&quot;691&quot; height=&quot;505&quot; src=&quot;/_astro/3643_1839863276_ae19b1.DolegR-1_2fsYSl.webp&quot; srcset=&quot;/_astro/3643_1839863276_ae19b1.DolegR-1_Z2cvXL5.webp 640w, /_astro/3643_1839863276_ae19b1.DolegR-1_2fsYSl.webp 691w&quot; /&gt;&lt;figcaption&gt;image-20210311112754107.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&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;figure&gt;&lt;img alt=&quot;image-20210311112832209.png&quot; loading=&quot;lazy&quot; width=&quot;696&quot; height=&quot;504&quot; src=&quot;/_astro/3643_2474115603_a6a132.VWAMVpGE_gRUl7.webp&quot; srcset=&quot;/_astro/3643_2474115603_a6a132.VWAMVpGE_OaXTu.webp 640w, /_astro/3643_2474115603_a6a132.VWAMVpGE_gRUl7.webp 696w&quot; /&gt;&lt;figcaption&gt;image-20210311112832209.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;设置CPU（请自行根据硬件实际条件进行配置）&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;image-20210311113313223.png&quot; loading=&quot;lazy&quot; width=&quot;698&quot; height=&quot;507&quot; src=&quot;/_astro/3643_4099006748_d37963.D9UTPTGC_ZYtg3c.webp&quot; srcset=&quot;/_astro/3643_4099006748_d37963.D9UTPTGC_24D2n6.webp 640w, /_astro/3643_4099006748_d37963.D9UTPTGC_ZYtg3c.webp 698w&quot; /&gt;&lt;figcaption&gt;image-20210311113313223.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;内存&lt;/strong&gt; 我给了2G&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;image-20210311113358154.png&quot; loading=&quot;lazy&quot; width=&quot;692&quot; height=&quot;507&quot; src=&quot;/_astro/3643_3482881885_e66b31.B-Bnt4ae_1IiUEF.webp&quot; srcset=&quot;/_astro/3643_3482881885_e66b31.B-Bnt4ae_ZcMIV9.webp 640w, /_astro/3643_3482881885_e66b31.B-Bnt4ae_1IiUEF.webp 692w&quot; /&gt;&lt;figcaption&gt;image-20210311113358154.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;网络设置&lt;/strong&gt;，&lt;strong&gt;模型&lt;/strong&gt;我选择 &lt;code&gt;intel E1000&lt;/code&gt; 支持开启千兆全双工&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;image-20210311113502260.png&quot; loading=&quot;lazy&quot; width=&quot;696&quot; height=&quot;501&quot; src=&quot;/_astro/3643_3986644865_1c7d02.DG_PoBKa_ZlODTN.webp&quot; srcset=&quot;/_astro/3643_3986644865_1c7d02.DG_PoBKa_Z2ktXAI.webp 640w, /_astro/3643_3986644865_1c7d02.DG_PoBKa_ZlODTN.webp 696w&quot; /&gt;&lt;figcaption&gt;image-20210311113502260.png&lt;/figcaption&gt;&lt;/figure&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;figure&gt;&lt;img alt=&quot;image-20210311114014177.png&quot; loading=&quot;lazy&quot; width=&quot;1003&quot; height=&quot;392&quot; src=&quot;/_astro/3643_1264039449_cb4ac4.CqdlnGGC_48y2p.webp&quot; srcset=&quot;/_astro/3643_1264039449_cb4ac4.CqdlnGGC_1NnpXf.webp 640w, /_astro/3643_1264039449_cb4ac4.CqdlnGGC_Z2bAGnx.webp 750w, /_astro/3643_1264039449_cb4ac4.CqdlnGGC_1BvMe1.webp 828w, /_astro/3643_1264039449_cb4ac4.CqdlnGGC_48y2p.webp 1003w&quot; /&gt;&lt;figcaption&gt;image-20210311114014177.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&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;创建虚拟机的过程中，自动创建了一块32G的硬盘，要&lt;strong&gt;删除&lt;/strong&gt; 此硬盘，则需要先&lt;strong&gt;分离&lt;/strong&gt; 硬盘。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;image-20210311114320351.png&quot; loading=&quot;lazy&quot; width=&quot;924&quot; height=&quot;403&quot; src=&quot;/_astro/3643_2992609055_52ad2a.lP3Hm1wo_Z2qAFkN.webp&quot; srcset=&quot;/_astro/3643_2992609055_52ad2a.lP3Hm1wo_Mo45F.webp 640w, /_astro/3643_2992609055_52ad2a.lP3Hm1wo_1Fvsch.webp 750w, /_astro/3643_2992609055_52ad2a.lP3Hm1wo_ZeqV3c.webp 828w, /_astro/3643_2992609055_52ad2a.lP3Hm1wo_Z2qAFkN.webp 924w&quot; /&gt;&lt;figcaption&gt;image-20210311114320351.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;将&lt;strong&gt;分离&lt;/strong&gt; 后得到&lt;strong&gt;未使用的磁盘&lt;/strong&gt; 进行&lt;strong&gt;删除&lt;/strong&gt; 操作，确保当前硬件没有其它磁盘。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;image-20210311114411147.png&quot; loading=&quot;lazy&quot; width=&quot;1020&quot; height=&quot;399&quot; src=&quot;/_astro/3643_2929048762_63438f.Cx55SHGJ_FYbq5.webp&quot; srcset=&quot;/_astro/3643_2929048762_63438f.Cx55SHGJ_17GcRN.webp 640w, /_astro/3643_2929048762_63438f.Cx55SHGJ_2cTekW.webp 750w, /_astro/3643_2929048762_63438f.Cx55SHGJ_UOz8z.webp 828w, /_astro/3643_2929048762_63438f.Cx55SHGJ_FYbq5.webp 1020w&quot; /&gt;&lt;figcaption&gt;image-20210311114411147.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&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;openwrt-x86-64-generic-squashfs-combined.img.gz&lt;/code&gt;后上传 &lt;code&gt;openwrt-x86-64-generic-squashfs-combined.img&lt;/code&gt; 镜像文件和&lt;code&gt;img2kvm&lt;/code&gt;两个文件到 pve 系统&lt;code&gt;root&lt;/code&gt;根目录（可以借助ftp工具或者 rz 命令进行上传）使用。&lt;/p&gt;&lt;p&gt;然后通过 &lt;code&gt;ssh&lt;/code&gt; 进入 pve 根目录，运行命令将镜像文件写入到磁盘：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;./img2kvm openwrt-x86-64-generic-squashfs-combined.img 102 vm-102-disk-0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 命令中 102 为本机 VM id，请修改为你自己的 VM id&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;若成功写入磁盘，ssh 终端会出现 &lt;code&gt;Successfully&lt;/code&gt;的提示 ，虚拟机会多出一块&lt;strong&gt;未使用的磁盘&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;image-20210311120701138.png&quot; loading=&quot;lazy&quot; width=&quot;995&quot; height=&quot;378&quot; src=&quot;/_astro/3643_3865926532_83023d.-1ogKVMz_Z1FWSWa.webp&quot; srcset=&quot;/_astro/3643_3865926532_83023d.-1ogKVMz_Z1WUfgq.webp 640w, /_astro/3643_3865926532_83023d.-1ogKVMz_1tbYMh.webp 750w, /_astro/3643_3865926532_83023d.-1ogKVMz_171W9G.webp 828w, /_astro/3643_3865926532_83023d.-1ogKVMz_Z1FWSWa.webp 995w&quot; /&gt;&lt;figcaption&gt;image-20210311120701138.png&lt;/figcaption&gt;&lt;/figure&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;figure&gt;&lt;img alt=&quot;image-20210311120730311.png&quot; loading=&quot;lazy&quot; width=&quot;892&quot; height=&quot;407&quot; src=&quot;/_astro/3643_3729311791_7f9983.DiyyLM9v_Z1yqVbi.webp&quot; srcset=&quot;/_astro/3643_3729311791_7f9983.DiyyLM9v_SteR8.webp 640w, /_astro/3643_3729311791_7f9983.DiyyLM9v_1NS1i5.webp 750w, /_astro/3643_3729311791_7f9983.DiyyLM9v_25jyqN.webp 828w, /_astro/3643_3729311791_7f9983.DiyyLM9v_Z1yqVbi.webp 892w&quot; /&gt;&lt;figcaption&gt;image-20210311120730311.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;写入磁盘镜像已经完成。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;20220223150031.jpg&quot; loading=&quot;lazy&quot; width=&quot;1081&quot; height=&quot;341&quot; src=&quot;/_astro/3643_1528870097_ca3458.DP6lhsHf_Z2fEuzx.webp&quot; srcset=&quot;/_astro/3643_1528870097_ca3458.DP6lhsHf_ApvTo.webp 640w, /_astro/3643_1528870097_ca3458.DP6lhsHf_Z2qWp7R.webp 750w, /_astro/3643_1528870097_ca3458.DP6lhsHf_HPmzD.webp 828w, /_astro/3643_1528870097_ca3458.DP6lhsHf_Z2fIyLe.webp 1080w, /_astro/3643_1528870097_ca3458.DP6lhsHf_Z2fEuzx.webp 1081w&quot; /&gt;&lt;figcaption&gt;20220223150031.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;将写入 openwrt 镜像的磁盘调整到第一顺位，并勾选 &lt;strong&gt;已启用&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;20220223150339.jpg&quot; loading=&quot;lazy&quot; width=&quot;889&quot; height=&quot;391&quot; src=&quot;/_astro/3643_3687935697_82647b.B9TJjTbG_Z2lylXc.webp&quot; srcset=&quot;/_astro/3643_3687935697_82647b.B9TJjTbG_1H8eQC.webp 640w, /_astro/3643_3687935697_82647b.B9TJjTbG_1i8RrG.webp 750w, /_astro/3643_3687935697_82647b.B9TJjTbG_ZBVU71.webp 828w, /_astro/3643_3687935697_82647b.B9TJjTbG_Z2lylXc.webp 889w&quot; /&gt;&lt;figcaption&gt;20220223150339.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&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;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;image-20210311121223174.png&quot; loading=&quot;lazy&quot; width=&quot;690&quot; height=&quot;114&quot; src=&quot;/_astro/3643_560498413_2e8596.CPLwxW4t_ZdG7NI.webp&quot; srcset=&quot;/_astro/3643_560498413_2e8596.CPLwxW4t_ZO6W96.webp 640w, /_astro/3643_560498413_2e8596.CPLwxW4t_ZdG7NI.webp 690w&quot; /&gt;&lt;figcaption&gt;image-20210311121223174.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;运行命令修改网络配置：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vi /etc/config/network&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;默认配置如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;config interface &apos;lan&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option type &apos;bridge&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option ifname &apos;eth0&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option proto &apos;static&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option ipaddr &apos;192.168.1.1&apos; #默认openwrt ip地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option netmask &apos;255.255.255.0&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option ip6assign &apos;60&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;修改为：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;config interface &apos;lan&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option type &apos;bridge&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option ifname &apos;eth0&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option proto &apos;static&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option ipaddr &apos;192.168.0.2&apos; #主路由192.168.0.1,旁路由我设置192.168.0.2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option netmask &apos;255.255.255.0&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option ip6assign &apos;60&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option gateway &apos;192.168.0.1&apos; # 填写为主路由地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;option dns &apos;114.114.114.114 223.5.5.5&apos; # 正常可用的DNS地址&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;按 &lt;code&gt;ESC&lt;/code&gt;输入&lt;code&gt;:wq&lt;/code&gt; 保存并退出。运行下面命令，重启网络使配置生效，当然你也可以&lt;code&gt;reboot&lt;/code&gt;重启openwrt都行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/etc/init.d/network restart&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;配置修改 OPENWRT 旁路由 DHCP&lt;a href=&quot;#配置修改-openwrt-旁路由-dhcp&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;完成网络配置，这时候浏览器输入旁路由ip地址 &lt;code&gt;192.168.0.2&lt;/code&gt;，输入账号密码可以成功进入。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;image-20210311124311147.png&quot; loading=&quot;lazy&quot; width=&quot;1310&quot; height=&quot;635&quot; src=&quot;/_astro/3643_1784531347_f02701.Bqly5qkY_itzJD.webp&quot; srcset=&quot;/_astro/3643_1784531347_f02701.Bqly5qkY_Oodms.webp 640w, /_astro/3643_1784531347_f02701.Bqly5qkY_99fPC.webp 750w, /_astro/3643_1784531347_f02701.Bqly5qkY_1OOHiY.webp 828w, /_astro/3643_1784531347_f02701.Bqly5qkY_1NbHAT.webp 1080w, /_astro/3643_1784531347_f02701.Bqly5qkY_2rbPqV.webp 1280w, /_astro/3643_1784531347_f02701.Bqly5qkY_itzJD.webp 1310w&quot; /&gt;&lt;figcaption&gt;image-20210311124311147.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;依次点击 &lt;strong&gt;网络&lt;/strong&gt; - &lt;strong&gt;接口&lt;/strong&gt; ，修改 &lt;strong&gt;LAN&lt;/strong&gt; 接口设置&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;image-20210311124505304.png&quot; loading=&quot;lazy&quot; width=&quot;1269&quot; height=&quot;329&quot; src=&quot;/_astro/3643_60465722_ba2815.D7rR6WfU_Z5gzih.webp&quot; srcset=&quot;/_astro/3643_60465722_ba2815.D7rR6WfU_Z1qyLkc.webp 640w, /_astro/3643_60465722_ba2815.D7rR6WfU_6WVGO.webp 750w, /_astro/3643_60465722_ba2815.D7rR6WfU_1DKfW.webp 828w, /_astro/3643_60465722_ba2815.D7rR6WfU_Z1y2phh.webp 1080w, /_astro/3643_60465722_ba2815.D7rR6WfU_Z5gzih.webp 1269w&quot; /&gt;&lt;figcaption&gt;image-20210311124505304.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;进入高级设置，勾选&lt;strong&gt;动态DHCP&lt;/strong&gt;、&lt;strong&gt;强制&lt;/strong&gt;，填写子网掩码 &lt;code&gt;255.255.255.0&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;image-20210311124627445.png&quot; loading=&quot;lazy&quot; width=&quot;1118&quot; height=&quot;552&quot; src=&quot;/_astro/4697_834985994_084566.DAUrF5ah_10APtO.webp&quot; srcset=&quot;/_astro/4697_834985994_084566.DAUrF5ah_qW1gx.webp 640w, /_astro/4697_834985994_084566.DAUrF5ah_ZbqxUo.webp 750w, /_astro/4697_834985994_084566.DAUrF5ah_29LGh2.webp 828w, /_astro/4697_834985994_084566.DAUrF5ah_Z2aFN7n.webp 1080w, /_astro/4697_834985994_084566.DAUrF5ah_10APtO.webp 1118w&quot; /&gt;&lt;figcaption&gt;image-20210311124627445.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;其中 &lt;strong&gt;DHCP选项&lt;/strong&gt; 填写格式如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3,192.168.0.2 #3,表示设置网关地址选项，192.168.0.2 为旁路由ip&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;6,192.168.0.2 #6,表示设置DNS服务器地址选项，192.168.0.2 为旁路由ip&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;关闭/修改主路由 DHCP&lt;a href=&quot;#关闭修改主路由-dhcp&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;要么将主路由 DHCP 关闭，一定要开启DHCP则需要将网关地址和DNS地址填写为旁路由ip地址，然后重启主路由器。（考虑到不同路由器的差异，不一一举例。我用的是梅林固件，我这里选择关闭DHCP）&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;iShot2021-03-11 18.47.26.jpg&quot; loading=&quot;lazy&quot; width=&quot;2118&quot; height=&quot;1532&quot; src=&quot;/_astro/3643_3961834097_c24b5f.CQhZH3rz_1T2oMi.webp&quot; srcset=&quot;/_astro/3643_3961834097_c24b5f.CQhZH3rz_Z2qi5d.webp 640w, /_astro/3643_3961834097_c24b5f.CQhZH3rz_Z24gWVl.webp 750w, /_astro/3643_3961834097_c24b5f.CQhZH3rz_PeVI6.webp 828w, /_astro/3643_3961834097_c24b5f.CQhZH3rz_R5Nvi.webp 1080w, /_astro/3643_3961834097_c24b5f.CQhZH3rz_27pY43.webp 1280w, /_astro/3643_3961834097_c24b5f.CQhZH3rz_Z1WtxBq.webp 1668w, /_astro/3643_3961834097_c24b5f.CQhZH3rz_1JAiwX.webp 2048w, /_astro/3643_3961834097_c24b5f.CQhZH3rz_1T2oMi.webp 2118w&quot; /&gt;&lt;figcaption&gt;iShot2021-03-11 18.47.26.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;此时，可以通过 OPENWRT 旁路由进行留学、去广告等相关设置。 为所欲为的事情不予细说，各位请自行发挥。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>群晖DSM卸载Universal Search套件指南</title><link>https://blog.moewah.com/posts/3926/</link><guid isPermaLink="true">https://blog.moewah.com/posts/3926/</guid><description>群晖Universal Search占用系统资源过高怎么办？本文提供通过SSH终端卸载或临时停用SynoFinder套件的完整操作步骤，解决NAS性能瓶颈问题。</description><pubDate>Sun, 03 Jan 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Synology Universal Search 是一款适用于群晖DSM的强大搜索工具。可在一次搜索中查找从照片到便签的匹配项目。还可以为文件夹建立索引，以便按文件名或文件内容提供精确且迅速的搜索结果。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Synology Universal Search.jpg&quot; loading=&quot;lazy&quot; width=&quot;1090&quot; height=&quot;589&quot; src=&quot;/_astro/3926_2568170840_ec860f.DQBdiZcL_25vWWh.webp&quot; srcset=&quot;/_astro/3926_2568170840_ec860f.DQBdiZcL_eBjjn.webp 640w, /_astro/3926_2568170840_ec860f.DQBdiZcL_Z1sSdWm.webp 750w, /_astro/3926_2568170840_ec860f.DQBdiZcL_1rgsL3.webp 828w, /_astro/3926_2568170840_ec860f.DQBdiZcL_13kvsc.webp 1080w, /_astro/3926_2568170840_ec860f.DQBdiZcL_25vWWh.webp 1090w&quot; /&gt;&lt;figcaption&gt;Synology Universal Search.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;但多数用户对于群晖的 Universal Search 应用套件在索引过程占用过高的系统资源（内存、CPU）而不满，你可以通过SSH终端以root权限将其卸载/停用。&lt;/p&gt;
&lt;section&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;通过 SSH 登录并执行以下命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 切换至root用户&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo -i&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 卸载 SynoFinder&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;synopkg uninstall SynoFinder&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# DSM 6+&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;synoservice --disable pkgctl-SynoFinder&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# DSM 7+&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;synosystemctl disable pkgctl-SynoFinder&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;重启后程序会再次启用，可以将上面这行命令添加到任务计划程序，以便在每次重新启动时执行。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>为OpenWrt单独编译ipk插件完整指南</title><link>https://blog.moewah.com/posts/4658/</link><guid isPermaLink="true">https://blog.moewah.com/posts/4658/</guid><description>如何为OpenWrt单独编译ipk插件？本文详细讲解从克隆源码、配置组件到编译安装的全流程，解决依赖问题并避免内核模块误操作，助你高效定制路由器功能。</description><pubDate>Fri, 01 Jan 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt; 本文介绍如何为 OpenWrt 单独编译 ipk 插件，部分软件可能需要同时编译依赖文件才能让软件正常运行，考虑到编译过程其实相差不大，这里提供一个小小的示例，可以举一反三。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;openwrt.png&quot; loading=&quot;lazy&quot; width=&quot;860&quot; height=&quot;400&quot; src=&quot;/_astro/4106_30968971_69d812.CMrA-1Zh_Z1SJlKv.webp&quot; srcset=&quot;/_astro/4106_30968971_69d812.CMrA-1Zh_Z85y5R.webp 640w, /_astro/4106_30968971_69d812.CMrA-1Zh_15KBR.webp 750w, /_astro/4106_30968971_69d812.CMrA-1Zh_Z26Pkgb.webp 828w, /_astro/4106_30968971_69d812.CMrA-1Zh_Z1SJlKv.webp 860w&quot; /&gt;&lt;figcaption&gt;openwrt.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;前提：必须先完整编译一次固件才能单独编译 ipk 软件包。在此大前提下，若需要单独更新 OpenWrt 某个插件或者需要增加安装某个插件的时候，则可以单独编译对应的 ipk 插件进行安装，而不必编译整个系统。&lt;/p&gt;&lt;/blockquote&gt;
&lt;section&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;以编译 Rosy 主题为例：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 进入 OpenWrt 目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd ~/openwrt/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 克隆 Rosy 主题源码到 package 目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git clone https://github.com/rosywrt/luci-theme-rosy.git package/luci-theme-rosy&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;make menuconfig&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;进入 &lt;code&gt;LuCI --&amp;gt; Themes&lt;/code&gt;  选项找到 &lt;code&gt;luci-theme-rosy&lt;/code&gt;&lt;/p&gt;&lt;p&gt;然后配置该选项为’M’，保存退出。&lt;code&gt;M&lt;/code&gt;表示选中插件但不编译进固件。如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;M&amp;gt; luci-theme-rosy....................... Rosy Theme&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;make package/luci-theme-rosy/luci-theme-rosy/compile V=99&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;注：&lt;code&gt;V=99&lt;/code&gt; 表示输出详细的 debug 信息&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;我这里是 &lt;code&gt;x86_64&lt;/code&gt; 架构，编译完成插件包默认存放路径：&lt;code&gt;~/openwrt/bin/packages/x86_64/base&lt;/code&gt;目录下&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;上传 IPK 软件包到 OpenWrt&lt;a href=&quot;#上传-ipk-软件包到-openwrt&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;scp luci-theme-rosy_git-19.069.38477-5ed9705-1_all.ipk root@192.168.199.1:/tmp&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;安装 IPK 软件包&lt;a href=&quot;#安装-ipk-软件包&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;SSH 进入路由器，安装&lt;code&gt;tmp&lt;/code&gt;目录下的 ipk 软件包，例如&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;opkg install /tmp/luci-theme-rosy_git-19.069.38477-5ed9705-1_all.ipk&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;make package/luci-theme-rosy/luci-theme-rosy clean&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;虽然 OpenWrt 编译出的内核模块也是一个 ipk 包，它们的名字基本会以 &lt;code&gt;kmod-&lt;/code&gt; 作为前缀，但它是无法独立地运行的，内核对内核模块进行严格的版本检查，即使一个小版本号不一致也会导致加载的不成功，因此对于新手用户尽量不要尝试卸载 / 安装内核模块，这极大可能会影响 Open­Wrt 正常使用。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>为知笔记Docker私有部署全流程教程</title><link>https://blog.moewah.com/posts/3605/</link><guid isPermaLink="true">https://blog.moewah.com/posts/3605/</guid><description>如何在本地搭建为知笔记私有服务器？本文详细拆解Docker环境下为知笔记的部署步骤，涵盖环境准备、容器运行与更新方法，助你实现数据自主可控。</description><pubDate>Sat, 28 Nov 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt; 之前见过一些朋友在讨论印象笔记、有道云笔记和为知笔记哪个好用？功能相差不大，个人更在乎UI是否能给人以沉浸式的记录体验。为知笔记如今已经是一款收费的产品，通过私有部署5个账号以内可以免费使用，但收藏及通知功能是需要付费购买许可才能使用的，这里简单记录下为知笔记docker私有部署的整个过程。类似为知笔记的还有Leanote（蚂蚁笔记）有兴趣的朋友也可以去了解一下。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;WizNote.jpg&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;757&quot; src=&quot;/_astro/3605_2104103305_ae573e.BFGZDHw__1EUEK4.webp&quot; srcset=&quot;/_astro/3605_2104103305_ae573e.BFGZDHw__Z2tEg4y.webp 640w, /_astro/3605_2104103305_ae573e.BFGZDHw__2rjvjB.webp 750w, /_astro/3605_2104103305_ae573e.BFGZDHw__Z2vquuN.webp 828w, /_astro/3605_2104103305_ae573e.BFGZDHw__1EUEK4.webp 1024w&quot; /&gt;&lt;figcaption&gt;WizNote.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&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;操作系统：Windows / macOS / Linux
CPU： Intel / AMD x64, ARM v7 (arm32), ARM 64
内存：至少2G&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;
&lt;section&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;使用 docker 搭建为知笔记。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1、需要先安装 Docker&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 6&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rpm -iUvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum update -y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum -y install docker-io&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service docker start&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig docker on&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 7、Debian、Ubuntu&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl -sSL https://get.docker.com/ | sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl start docker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl enable docker&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2、创建数据目录&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir -p ～/wizdata&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;在用户目录建立一个 &lt;code&gt;wizdata&lt;/code&gt; 的文件夹（&lt;code&gt;root&lt;/code&gt;用户是在&lt;code&gt;root&lt;/code&gt;目录下，非&lt;code&gt;root&lt;/code&gt;用户则在&lt;code&gt;home&lt;/code&gt;目录下）。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3、运行容器&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;然后通过下面的命令，下载并启动为知笔记服务。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker run --name wiz --restart=always -it -d -v  ~/wizdata:/wiz/storage -v  /etc/localtime:/etc/localtime -p 8999:80 -p 9269:9269/udp  wiznote/wizserver&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;若&lt;code&gt;8999&lt;/code&gt;端口被占用，请替换为其它可用端口，即修改 &lt;code&gt;-p&lt;/code&gt; 参数 &lt;code&gt;&amp;lt;其他未占用端口&amp;gt;:80&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4、浏览器访问&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;安装完成后在浏览器访问 &lt;code&gt;http://服务器ip地址:8999&lt;/code&gt; 就可以进入为知笔记的登录页面。如下图所示：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;为知笔记-登录界面.jpg&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;597&quot; src=&quot;/_astro/3605_3404077228_11ac2d.DOIfrd9l_1kpo4B.webp&quot; srcset=&quot;/_astro/3605_3404077228_11ac2d.DOIfrd9l_Z2utC5a.webp 640w, /_astro/3605_3404077228_11ac2d.DOIfrd9l_1ec1Cf.webp 750w, /_astro/3605_3404077228_11ac2d.DOIfrd9l_R4PmM.webp 828w, /_astro/3605_3404077228_11ac2d.DOIfrd9l_1kpo4B.webp 1024w&quot; /&gt;&lt;figcaption&gt;为知笔记-登录界面.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;默认管理员账号：&lt;code&gt;admin@wiz.cn&lt;/code&gt;，密码：&lt;code&gt;123456&lt;/code&gt;。登录成功后记得及时修改密码。&lt;/p&gt;&lt;p&gt;若看到下面的界面说明安装尚未完成！首次运行的时候需要启动一堆的应用，包括安装数据库，初始化配置等等，所以要有耐心边等边刷新页面查看。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;错误提示.png&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;605&quot; src=&quot;/_astro/3605_3810142862_8f8ab9.dRefYkBw_282oyS.webp&quot; srcset=&quot;/_astro/3605_3810142862_8f8ab9.dRefYkBw_Z1pRfr7.webp 640w, /_astro/3605_3810142862_8f8ab9.dRefYkBw_ZaBG37.webp 750w, /_astro/3605_3810142862_8f8ab9.dRefYkBw_ZYqti.webp 828w, /_astro/3605_3810142862_8f8ab9.dRefYkBw_282oyS.webp 1024w&quot; /&gt;&lt;figcaption&gt;错误提示.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&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;因为为知笔记的docker镜像可能会经常更新，所以想要更新容器，那么需要做的是先停止并删除旧容器，然后 &lt;code&gt;pull&lt;/code&gt; 最新的镜像，运行新容器。&lt;/p&gt;&lt;p&gt;复制下面代码，创建一个名为 &lt;code&gt;update-wiznote.sh&lt;/code&gt;的脚本&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#!/bin/sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 变量=值&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;image_name=wiznote/wizserver&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;image_tag=latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;container_name=wiz&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service_port=8999&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;data_root_dir=~/wizdata&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 停止容器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker stop ${container_name}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 删除容器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker rm ${container_name}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 下载最新镜像&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker pull ${image_name}:${image_tag}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 运行新容器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker run --name ${container_name} --restart=always -it -d -v  ${data_root_dir}:/wiz/storage -v  /etc/localtime:/etc/localtime -p ${service_port}:80 -p 9269:9269/udp ${image_name}:${image_tag}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;运行脚本更新&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 赋予执行权限&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod +x update-wiznote.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 运行脚本，会在当前目录输出log文件，便于排查错误&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;bash update-wiznote.sh &amp;gt; ./update-wiz.log&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;删除容器并不会删除&lt;code&gt;wizdata&lt;/code&gt;中的数据，实在不放心可以在执行更新脚本前给&lt;code&gt;wizdata&lt;/code&gt;整个数据目录备份一遍。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;建议配合cronjob定时任务运行&lt;code&gt;update-wiznote.sh&lt;/code&gt;脚本，每月1号执行1次，更新频次可以根据自己的实际情况而定。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;img alt=&quot;为知笔记.jpg&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;597&quot; src=&quot;/_astro/3605_927073850_3f7ccf.HUG7VwdQ_Z1SB7MU.webp&quot; srcset=&quot;/_astro/3605_927073850_3f7ccf.HUG7VwdQ_1xVBgo.webp 640w, /_astro/3605_927073850_3f7ccf.HUG7VwdQ_AeuOT.webp 750w, /_astro/3605_927073850_3f7ccf.HUG7VwdQ_1P4Ydz.webp 828w, /_astro/3605_927073850_3f7ccf.HUG7VwdQ_Z1SB7MU.webp 1024w&quot; /&gt;&lt;figcaption&gt;为知笔记.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;为知笔记是一款 UI 非常美观的云笔记，提供iOS、Android、MAC、Windows、Linux等客户端支持多终端同步，方便用户跨平台使用，为知笔记私有部署更多信息可以查看 &lt;a href=&quot;https://www.wiz.cn/zh-cn/docker&quot; target=&quot;_blank&quot;&gt;官方说明文档&lt;/a&gt; 或者 &lt;a href=&quot;https://www.wiz.cn/zh-cn&quot; target=&quot;_blank&quot;&gt;官方网站&lt;/a&gt;大家如果有任何意见或建议，欢迎在下方评论处留言。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>OpenWrt 新手配置使用指南</title><link>https://blog.moewah.com/posts/4054/</link><guid isPermaLink="true">https://blog.moewah.com/posts/4054/</guid><description>如何快速上手OpenWrt？本文详细讲解OpenWrt基础设置，包括修改密码、更换主题、时区调整、LAN IP配置及PPPoE拨号等核心操作，帮助新手轻松完成软路由部署。</description><pubDate>Thu, 01 Oct 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt; 换过无数路由器最后还是 OpenWrt 香，对于家用路由的选择我个人更倾向于选择一款 WI-FI 信号较好的路由器让其充当一个无线AP即可，耗性能的事情还是得靠软路由。也因此喵斯基部落考虑利用本篇文章整理一系列有关于 OpenWrt 使用方法，帮助新手更快上手 OpenWrt ，文章会不定期更新，篇幅较长的内容则会考虑写入新页面然后以引入内链的形式在本文做体现（部分敏感的内容不考虑更新，问就是因为它敏感而我尊重敏感本身）。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;openwrt.jpg&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; src=&quot;/_astro/4054_2015901808_a49ca0.BwVc8Mwk_1t8nUY.webp&quot; srcset=&quot;/_astro/4054_2015901808_a49ca0.BwVc8Mwk_16qPB6.webp 640w, /_astro/4054_2015901808_a49ca0.BwVc8Mwk_2uXq54.webp 750w, /_astro/4054_2015901808_a49ca0.BwVc8Mwk_Z1o7eBv.webp 828w, /_astro/4054_2015901808_a49ca0.BwVc8Mwk_24WuaL.webp 1080w, /_astro/4054_2015901808_a49ca0.BwVc8Mwk_Z1cGET8.webp 1280w, /_astro/4054_2015901808_a49ca0.BwVc8Mwk_PmbLE.webp 1668w, /_astro/4054_2015901808_a49ca0.BwVc8Mwk_1t8nUY.webp 1920w&quot; /&gt;&lt;figcaption&gt;openwrt.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;OpenWrt 新手配置使用指南&lt;a href=&quot;#openwrt-新手配置使用指南&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1、更改 OpenWrt 默认登录密码&lt;a href=&quot;#1更改-openwrt-默认登录密码&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;若没有自行替换修改过管理账号密码，Open­Wrt 默认账号 &lt;code&gt;root&lt;/code&gt; 密码 &lt;code&gt;password&lt;/code&gt;，若需要更改 OpenWrt 默认登录密码则依次进入「系统」 - 「管理权」 ，在「主机密码」的输入框输入新密码，保存应用。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;1.png&quot; loading=&quot;lazy&quot; width=&quot;1112&quot; height=&quot;295&quot; src=&quot;/_astro/4054_2194943186_07d991.DsKkPX2H_iB3S.webp&quot; srcset=&quot;/_astro/4054_2194943186_07d991.DsKkPX2H_10leoR.webp 640w, /_astro/4054_2194943186_07d991.DsKkPX2H_5pkvN.webp 750w, /_astro/4054_2194943186_07d991.DsKkPX2H_Z1TCq10.webp 828w, /_astro/4054_2194943186_07d991.DsKkPX2H_Z1wJKR6.webp 1080w, /_astro/4054_2194943186_07d991.DsKkPX2H_iB3S.webp 1112w&quot; /&gt;&lt;figcaption&gt;1.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&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;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;2.png&quot; loading=&quot;lazy&quot; width=&quot;1297&quot; height=&quot;279&quot; src=&quot;/_astro/4054_1883830085_c4d861.BagCnDSR_11efuf.webp&quot; srcset=&quot;/_astro/4054_1883830085_c4d861.BagCnDSR_1gSd0d.webp 640w, /_astro/4054_1883830085_c4d861.BagCnDSR_1qTsBM.webp 750w, /_astro/4054_1883830085_c4d861.BagCnDSR_ZWNTOX.webp 828w, /_astro/4054_1883830085_c4d861.BagCnDSR_Z1VPGQU.webp 1080w, /_astro/4054_1883830085_c4d861.BagCnDSR_aMYau.webp 1280w, /_astro/4054_1883830085_c4d861.BagCnDSR_11efuf.webp 1297w&quot; /&gt;&lt;figcaption&gt;2.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;「系统」 - 「系统」 - 「系统属性」 - 「常规设置」，在「时区」下拉框选择 &lt;code&gt;Asia/Shanghai&lt;/code&gt;，保存应用。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;3.png&quot; loading=&quot;lazy&quot; width=&quot;1238&quot; height=&quot;312&quot; src=&quot;/_astro/4054_1658212358_837971.B3onbXbb_cd2Lu.webp&quot; srcset=&quot;/_astro/4054_1658212358_837971.B3onbXbb_Zw9gHS.webp 640w, /_astro/4054_1658212358_837971.B3onbXbb_vAsSb.webp 750w, /_astro/4054_1658212358_837971.B3onbXbb_YXMEM.webp 828w, /_astro/4054_1658212358_837971.B3onbXbb_AnRiY.webp 1080w, /_astro/4054_1658212358_837971.B3onbXbb_cd2Lu.webp 1238w&quot; /&gt;&lt;figcaption&gt;3.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4、更换 LAN IP 地址&lt;a href=&quot;#4更换-lan-ip-地址&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;「网络」 - 「接口」 - 「LAN」 - 「修改」，在「IPv4 地址」自定义需要的LAN IP 地址&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;4.png&quot; loading=&quot;lazy&quot; width=&quot;1123&quot; height=&quot;524&quot; src=&quot;/_astro/4054_1074379571_fb64b5.DVbHPIRp_Z2Wea4.webp&quot; srcset=&quot;/_astro/4054_1074379571_fb64b5.DVbHPIRp_Zmo67j.webp 640w, /_astro/4054_1074379571_fb64b5.DVbHPIRp_Z1D1SSN.webp 750w, /_astro/4054_1074379571_fb64b5.DVbHPIRp_Z1FCiP8.webp 828w, /_astro/4054_1074379571_fb64b5.DVbHPIRp_1UQyxU.webp 1080w, /_astro/4054_1074379571_fb64b5.DVbHPIRp_Z2Wea4.webp 1123w&quot; /&gt;&lt;figcaption&gt;4.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5、作为主路由拨号上网&lt;a href=&quot;#5作为主路由拨号上网&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;将猫设置为桥接模式，通过路由器来实现拨号。通过「网络」 - 「接口」找到 WAN 口，修改 OpenWRT 的 WAN 口协议将其切换为 PPPoE。填写宽带运营商提供的账号密码（PAP/CHAP 用户名：宽带账号；PAP/CHAP 密码：宽带密码），保存并应用。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;5.png&quot; loading=&quot;lazy&quot; width=&quot;1159&quot; height=&quot;666&quot; src=&quot;/_astro/4054_350592040_51cd2d.BeH6-QQj_2PoaY.webp&quot; srcset=&quot;/_astro/4054_350592040_51cd2d.BeH6-QQj_lQxoi.webp 640w, /_astro/4054_350592040_51cd2d.BeH6-QQj_ZdYIQK.webp 750w, /_astro/4054_350592040_51cd2d.BeH6-QQj_AHx28.webp 828w, /_astro/4054_350592040_51cd2d.BeH6-QQj_Z24wz4E.webp 1080w, /_astro/4054_350592040_51cd2d.BeH6-QQj_2PoaY.webp 1159w&quot; /&gt;&lt;figcaption&gt;5.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6、禁用 IPv6&lt;a href=&quot;#6禁用-ipv6&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;删除「网络」- 「接口」 中的 WAN6 接口。&lt;/li&gt;
&lt;li&gt;在「网络」 -「接口」 -「WAN」-「高级设置」，&lt;strong&gt;使用内置的ipv6管理&lt;/strong&gt; （取消勾选）；&lt;/li&gt;
&lt;li&gt;在「网络」 -「接口」 -「LAN」，在「基本设置」将&lt;strong&gt;IPv6 分配长度&lt;/strong&gt; 设置为&lt;strong&gt;已禁用&lt;/strong&gt; ；在「高级设置」&lt;strong&gt;使用内置的ipv6管理&lt;/strong&gt; （取消勾选）；在「IPv6 设置」，更改设置如下：
&lt;ul&gt;
&lt;li&gt;路由通告服务：&lt;strong&gt;已禁用&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;DHCPv6 服务：&lt;strong&gt;已禁用&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;NDP 代理：&lt;strong&gt;已禁用&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;详细的图文介绍，请移步 —&amp;gt;&lt;a href=&quot;https://blog.moewah.com/posts/4032/&quot;&gt;《OpenWrt 如何彻底禁用 IPv6 功能》&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;7、动态解析/P2P 实现远程访问&lt;a href=&quot;#7动态解析p2p-实现远程访问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果有公网IP，首选 DDNS 方案。常用的插件有 AliDDNS -&amp;gt;&lt;a href=&quot;https://github.com/honwen/luci-app-aliddns/releases/download/v20210117/luci-app-aliddns_0.4.0-1_all.ipk&quot; target=&quot;_blank&quot;&gt;插件下载&lt;/a&gt; 及 腾讯云 DDNS -&amp;gt;&lt;a href=&quot;http://openwrt-tencentddns-1301800460.cos.ap-guangzhou.myqcloud.com/luci-app-tencentddns_0.1.0-1_all.ipk&quot; target=&quot;_blank&quot;&gt;插件下载&lt;/a&gt; （两款插件使用门槛较低）&lt;/p&gt;&lt;p&gt;如果没有公网IP，较经济的方案：推荐 ZeroTier -&amp;gt;&lt;a href=&quot;https://github.com/rufengsuixing/luci-app-zerotier/releases/download/1.0-16/luci-app-zerotier_1.0-16_all.ipk&quot; target=&quot;_blank&quot;&gt;插件下载&lt;/a&gt; 和 DDNSTO -&amp;gt;&lt;a href=&quot;https://www.ddnsto.com/zh/guide/koolshare_merlin.html#_3-openwrt%E5%9B%BA%E4%BB%B6&quot; target=&quot;_blank&quot;&gt;插件安装&lt;/a&gt;（基本不存在上手的门槛，因为不直接通过公网IP因此也无需考虑防火墙设置、端口转发）&lt;/p&gt;&lt;p&gt;详细的配置过程已有相关文章，请移步 —&amp;gt;&lt;a href=&quot;https://blog.moewah.com/posts/4106/&quot;&gt;《OpenWrt 远程访问：ddns 动态解析和 ZeroTier 虚拟局域网》&lt;/a&gt; 以及 &lt;a href=&quot;https://blog.moewah.com/posts/4796/&quot;&gt;《Tailscale：一款开箱即用的虚拟局域组网工具！》&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;8、SSH 开启远程访问&lt;a href=&quot;#8ssh-开启远程访问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;「系统」 - 「管理权」 - 「SSH 访问」 - 「Dropbear 实例」 ，变更「接口」 为 「未指定」。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;8.png&quot; loading=&quot;lazy&quot; width=&quot;1230&quot; height=&quot;487&quot; src=&quot;/_astro/4054_449297760_d03bb6.LyVyTSG9_ZA7Xiw.webp&quot; srcset=&quot;/_astro/4054_449297760_d03bb6.LyVyTSG9_2QBMc.webp 640w, /_astro/4054_449297760_d03bb6.LyVyTSG9_Z1xUSDG.webp 750w, /_astro/4054_449297760_d03bb6.LyVyTSG9_D8Ohm.webp 828w, /_astro/4054_449297760_d03bb6.LyVyTSG9_ZANRCe.webp 1080w, /_astro/4054_449297760_d03bb6.LyVyTSG9_ZA7Xiw.webp 1230w&quot; /&gt;&lt;figcaption&gt;8.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;默认 SSH 端口为 &lt;code&gt;22&lt;/code&gt;，可自行更换使用其他可用端口。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;9、更换为国内软件源&lt;a href=&quot;#9更换为国内软件源&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;由于国内的软件源均已支持 &lt;code&gt;https&lt;/code&gt;，更换软件源前需确保 &lt;code&gt;curl&lt;/code&gt; 支持 &lt;code&gt;ssl&lt;/code&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;opkg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;opkg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ca-certificates&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;luci-ssl-openssl&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;「系统」 - 「软件包」 - 「配置」，完整复制一份「发行版软件源」所有条目，粘贴到「自定义软件源」输入框，将其中的&lt;code&gt;http://downloads.openwrt.org/&lt;/code&gt; 全部替换为 &lt;code&gt;https://mirrors.cloud.tencent.com/lede/&lt;/code&gt;  (腾讯镜像源）或者&lt;code&gt; https://mirrors.ustc.edu.cn/lede/&lt;/code&gt;  (中科大镜像源） ，提交。&lt;/p&gt;&lt;p&gt;也可以直接使用 &lt;code&gt;sed&lt;/code&gt; 命令替换软件源为腾讯镜像源。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sed&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;s_downloads.openwrt.org_mirrors.cloud.tencent.com/lede_&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/opkg/distfeeds.conf&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;10、OpenWrt 插件的安装与卸载&lt;a href=&quot;#10openwrt-插件的安装与卸载&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;通过 LuCi 界面管理软件包&lt;a href=&quot;#通过-luci-界面管理软件包&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;「系统」 - 「软件包」 -「动作」，可在「已安装软件包」的列表中找到需要卸载的包名称进行卸载，同时通过在「过滤器」的输入框内输入插件的关键词，在软件仓库中查找需要的安装包进行安装。大多数插件可通过 LuCi 进行安装/卸载。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;10.png&quot; loading=&quot;lazy&quot; width=&quot;1421&quot; height=&quot;675&quot; src=&quot;/_astro/4054_2345860956_1cb4df.CmSzkIMP_97THG.webp&quot; srcset=&quot;/_astro/4054_2345860956_1cb4df.CmSzkIMP_Z1YDV1X.webp 640w, /_astro/4054_2345860956_1cb4df.CmSzkIMP_1fsoqs.webp 750w, /_astro/4054_2345860956_1cb4df.CmSzkIMP_Z1gy5Oh.webp 828w, /_astro/4054_2345860956_1cb4df.CmSzkIMP_Zb8Ura.webp 1080w, /_astro/4054_2345860956_1cb4df.CmSzkIMP_187IXy.webp 1280w, /_astro/4054_2345860956_1cb4df.CmSzkIMP_97THG.webp 1421w&quot; /&gt;&lt;figcaption&gt;10.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;通过SSH终端安装/更新/卸载&lt;a href=&quot;#通过ssh终端安装更新卸载&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;1、如果是第三方下载的软件包可通过终端命令进行安装，可通过&lt;code&gt;scp&lt;/code&gt;命令上传到 OpenWrt 的 &lt;code&gt;tmp&lt;/code&gt; 目录进行安装。（推荐上传至 &lt;code&gt;tmp&lt;/code&gt;是因为它占用的是内存而不占用实际的存储空间）&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 1、通过Scp上传文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;scp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-P&lt;/span&gt;&lt;span&gt;&lt;span&gt; [Port] &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;PackageName&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;OpenWrt LANIP&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;:/tmp&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 示例&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 上传本地当前路径下的luci-app-aliddns包文件到LANIP为192.168.1.1的tmp目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;scp&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;22&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./luci-app-aliddns_v0.3.0-1.ipk&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;root@192.168.1.1:/tmp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 2、在OpenWrt终端安装已上传的包&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;opkg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/[PackageName]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;## 示例&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;opkg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/luci-app-aliddns_v0.3.0-1.ipk&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;2、SSH 终端 &lt;code&gt;opkg&lt;/code&gt; 包管理常见命令&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 获取软件列表&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;opkg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;list&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;opkg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; [PackageName]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 卸载&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;opkg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;remove&lt;/span&gt;&lt;span&gt; [PackageName]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 更新软件包&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;opkg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;upgrade&lt;/span&gt;&lt;span&gt; [PackageName]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 更新所有可被更新的软件包&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;opkg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;upgrade&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;opkg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;list-upgradable&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;awk&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;{print $1}&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;注：因内核对内核模块进行严格的版本检查，即使一个小版本号不一致也会导致加载的不成功，因此尽量不要尝试卸载/安装内核模块，极大可能会影响 OpenWrt 正常使用。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;11、配置旁路由&lt;a href=&quot;#11配置旁路由&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;已有相关文章供参考，请移步 —&amp;gt; &lt;a href=&quot;https://blog.moewah.com/posts/3643/&quot;&gt;《OpenWrt 配置旁路由教程》&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;12、sysupgrade 更新固件&lt;a href=&quot;#12sysupgrade-更新固件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;1）先本地上传固件到 OpenWrt 的&lt;code&gt;tmp&lt;/code&gt;目录&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 默认为22端口可以不追加-P参数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;scp&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;22&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;./openwrt-ramips-mt7621-hiwifi_hc5962-squashfs-sysupgrade.bin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;root@192.168.1.1:/tmp&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;2）OpenWrt 终端使用 &lt;code&gt;sysupgrade&lt;/code&gt; 命令更新固件，根据个人的性格、喜好、胆识选择适合自己的姿势尝试刷入更新包&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 保留配置升级&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sysupgrade&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/openwrt-ramips-mt7621-hiwifi_hc5962-squashfs-sysupgrade.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 不保留配置升级&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sysupgrade&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;/tmp/openwrt-ramips-mt7621-hiwifi_hc5962-squashfs-sysupgrade.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 梭哈模式（不保留配置，强制更新）不计较得失成败，不要怂就是干&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sysupgrade&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;-F&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/openwrt-ramips-mt7621-hiwifi_hc5962-squashfs-sysupgrade.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;13、OpenWrt 扩展容量&lt;a href=&quot;#13openwrt-扩展容量&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;已有相关文章供参考，请移步 —&amp;gt; &lt;a href=&quot;https://blog.moewah.com/posts/4719/&quot;&gt;《OpenWrt 存储空间扩容方案》&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;14、将 OpenWrt 设置为 AP 模式&lt;a href=&quot;#14将-openwrt-设置为-ap-模式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;已有相关文章供参考，请移步 —&amp;gt; &lt;a href=&quot;https://blog.moewah.com/posts/4977/&quot;&gt;《将 OpenWrt 设置为交换机 / AP 模式》&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>OpenWrt 中彻底禁用 IPv6 功能指南</title><link>https://blog.moewah.com/posts/4032/</link><guid isPermaLink="true">https://blog.moewah.com/posts/4032/</guid><description>如何在 OpenWrt 中关闭 IPv6？本文详细拆解从删除 WAN6 接口到禁用 LAN 口 IPv6 的全流程操作，解决双栈网络下 IPv6 优先导致的连接不稳定问题，确保网络稳定运行。</description><pubDate>Tue, 01 Sep 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt; 个人选择在 OpenWrt 中关闭/禁用 IPv6 功能的原因：在IPv6+IPv4双栈网络下，IPv6 优先级更高，通过IPv6访问可能出现质量不稳定的情况。有需要的可以按照以下步骤在 OpenWrt 中彻底禁用 IPv6 功能。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;openwrt.png&quot; loading=&quot;lazy&quot; width=&quot;860&quot; height=&quot;400&quot; src=&quot;/_astro/4106_30968971_69d812.CMrA-1Zh_Z1SJlKv.webp&quot; srcset=&quot;/_astro/4106_30968971_69d812.CMrA-1Zh_Z85y5R.webp 640w, /_astro/4106_30968971_69d812.CMrA-1Zh_15KBR.webp 750w, /_astro/4106_30968971_69d812.CMrA-1Zh_Z26Pkgb.webp 828w, /_astro/4106_30968971_69d812.CMrA-1Zh_Z1SJlKv.webp 860w&quot; /&gt;&lt;figcaption&gt;openwrt.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&gt;&lt;h3&gt;一、删除 WAN6 接口&lt;a href=&quot;#一删除-wan6-接口&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;注：编译 OpenWrt 固件时，若没有主动将 &lt;code&gt;ipv6helper&lt;/code&gt; 加入编译选项，则可以忽略这一步骤，一般不会存在 WAN6 接口这件事。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;支持 IPv6 的固件启动后默认会多出一个 WAN6 接口，可以在「网络」 -「 接口」手动删除 WAN6 接口&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;1.jpg&quot; loading=&quot;lazy&quot; width=&quot;1050&quot; height=&quot;499&quot; src=&quot;/_astro/4032_1520856868_3ba757.yMoMzaFt_10JP3n.webp&quot; srcset=&quot;/_astro/4032_1520856868_3ba757.yMoMzaFt_Z2iv5cg.webp 640w, /_astro/4032_1520856868_3ba757.yMoMzaFt_VBfga.webp 750w, /_astro/4032_1520856868_3ba757.yMoMzaFt_Z1zpeYz.webp 828w, /_astro/4032_1520856868_3ba757.yMoMzaFt_10JP3n.webp 1050w&quot; /&gt;&lt;figcaption&gt;1.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;然后，保存并应用。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;二、WAN 口禁用 IPv6&lt;a href=&quot;#二wan-口禁用-ipv6&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在「网络」 -「接口」 -「WAN」-「高级设置」&lt;/p&gt;&lt;p&gt;&lt;strong&gt;使用内置的ipv6管理：取消勾选&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;2.jpg&quot; loading=&quot;lazy&quot; width=&quot;1058&quot; height=&quot;421&quot; src=&quot;/_astro/4032_1992788452_fb8565.CKz03i7D_Z3hnwB.webp&quot; srcset=&quot;/_astro/4032_1992788452_fb8565.CKz03i7D_1VXW1b.webp 640w, /_astro/4032_1992788452_fb8565.CKz03i7D_Z230akB.webp 750w, /_astro/4032_1992788452_fb8565.CKz03i7D_1K7jgW.webp 828w, /_astro/4032_1992788452_fb8565.CKz03i7D_Z3hnwB.webp 1058w&quot; /&gt;&lt;figcaption&gt;2.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;保存并应用。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h3&gt;三、LAN 口禁用 IPv6&lt;a href=&quot;#三lan-口禁用-ipv6&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在「网络」 -「接口」 -「LAN」-「基本设置」，更改设置如下：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;IPv6 分配长度：已禁用&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;3.jpg&quot; loading=&quot;lazy&quot; width=&quot;1070&quot; height=&quot;686&quot; src=&quot;/_astro/4032_857124851_89b5d5.B0gPUA1x_Z1HIt1A.webp&quot; srcset=&quot;/_astro/4032_857124851_89b5d5.B0gPUA1x_19GKJy.webp 640w, /_astro/4032_857124851_89b5d5.B0gPUA1x_1eIrza.webp 750w, /_astro/4032_857124851_89b5d5.B0gPUA1x_22ofLf.webp 828w, /_astro/4032_857124851_89b5d5.B0gPUA1x_Z1HIt1A.webp 1070w&quot; /&gt;&lt;figcaption&gt;3.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;保存并应用。&lt;/p&gt;&lt;p&gt;在「网络」 -「接口」 -「LAN」-「高级设置」，更改设置如下：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;使用内置的ipv6管理：取消勾选&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;4.jpg&quot; loading=&quot;lazy&quot; width=&quot;1032&quot; height=&quot;621&quot; src=&quot;/_astro/4032_2455690918_103479.BcF8KIoN_Z1IGpu5.webp&quot; srcset=&quot;/_astro/4032_2455690918_103479.BcF8KIoN_ZqjorS.webp 640w, /_astro/4032_2455690918_103479.BcF8KIoN_Z18Jty1.webp 750w, /_astro/4032_2455690918_103479.BcF8KIoN_28ogkB.webp 828w, /_astro/4032_2455690918_103479.BcF8KIoN_Z1IGpu5.webp 1032w&quot; /&gt;&lt;figcaption&gt;4.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;保存并应用。&lt;/p&gt;&lt;p&gt;在「网络」 - 「接口」 - 「LAN」 - 「IPv6 设置」，更改设置如下：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;路由通告服务：已禁用&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DHCPv6 服务：已禁用&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NDP 代理：已禁用&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;5.jpg&quot; loading=&quot;lazy&quot; width=&quot;1037&quot; height=&quot;370&quot; src=&quot;/_astro/4032_3930825772_0dc0c8.CUKnqKS5_Z1AXf35.webp&quot; srcset=&quot;/_astro/4032_3930825772_0dc0c8.CUKnqKS5_1BACUu.webp 640w, /_astro/4032_3930825772_0dc0c8.CUKnqKS5_Z1zwFKP.webp 750w, /_astro/4032_3930825772_0dc0c8.CUKnqKS5_Lpihd.webp 828w, /_astro/4032_3930825772_0dc0c8.CUKnqKS5_Z1AXf35.webp 1037w&quot; /&gt;&lt;figcaption&gt;5.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;保存并应用。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;Q：为什么要在 OpenWrt 中禁用 IPv6？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A：IPv6+IPv4 双栈网络下，IPv6 优先级更高，通过 IPv6 访问可能出现连接不稳定的情况。禁用后确保网络稳定运行。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：OpenWrt 怎么彻底关闭 IPv6？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A：三步走：删除 WAN6 接口、WAN 口禁用 IPv6、LAN 口禁用 IPv6。LAN 口禁用时还要把路由通告服务、DHCPv6 服务、NDP 代理都设为「已禁用」。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：编译固件时没加 ipv6helper，还需要删除 WAN6 接口吗？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A：不需要。没有 ipv6helper 就不会有 WAN6 接口，跳过第一步直接从 WAN 口设置开始。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：WAN 口和 LAN 口都要禁用 IPv6，有什么区别？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A：WAN 口禁用是取消「使用内置的ipv6管理」，LAN 口除了取消内置管理，还要把 IPv6 分配长度设为「已禁用」，并把路由通告、DHCPv6、NDP 代理三项都禁用。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：怎么确认 IPv6 已经彻底禁用了？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A：检查「网络」-「接口」，确认没有 WAN6 接口。检查 LAN 口的 IPv6 设置，三项服务都显示「已禁用」。每步操作后记得保存并应用。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>SSL证书自动续期失败？竟是时间不同步！</title><link>https://blog.moewah.com/posts/3331/</link><guid isPermaLink="true">https://blog.moewah.com/posts/3331/</guid><description>为什么acme.sh无法自动续期SSL证书？本文揭示因服务器时间不同步导致的Let&apos;s Encrypt验证失败问题，并提供ntp同步解决方案，助你解决证书续期难题。</description><pubDate>Thu, 06 Aug 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;**说明：**最近忙着给一个PC站做移动端的页面适配，因此比较少来（喵斯基部落）。临时想翻翻之前写的笔记，结果发现Let’s Encrypt的SSL证书到期了，证书管理用的是&lt;code&gt;acme.sh&lt;/code&gt;脚本，自动续期失败很是无语。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;HTTPS.jpg&quot; loading=&quot;lazy&quot; width=&quot;860&quot; height=&quot;400&quot; src=&quot;/_astro/3331_2096882620_56a363.CVhViaaI_2v8AUU.webp&quot; srcset=&quot;/_astro/3331_2096882620_56a363.CVhViaaI_1B3p88.webp 640w, /_astro/3331_2096882620_56a363.CVhViaaI_UDYdV.webp 750w, /_astro/3331_2096882620_56a363.CVhViaaI_102aL9.webp 828w, /_astro/3331_2096882620_56a363.CVhViaaI_2v8AUU.webp 860w&quot; /&gt;&lt;figcaption&gt;HTTPS.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;常规操作就是先执行&lt;code&gt;crontab -l&lt;/code&gt;调出任务列表中的自动续期命令，我们手动运行进行证书续期&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;acme.sh --cron --home &quot;/root/.acme.sh&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;这时屏幕打印报错信息如下：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[Thu Aug  6 01:24:56 CST 2020] Getting webroot for domain=&apos;moewah.com&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[Thu Aug  6 01:24:56 CST 2020] Getting webroot for domain=&apos;*.moewah.com&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[Thu Aug  6 01:24:56 CST 2020] Adding txt value: fSBNKmxqZx07MDI7BN8GOjGYqWUaVXEuM_fEol33Bs4 for domain:  _acme-challenge.moewah.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[Thu Aug  6 01:24:58 CST 2020] Error add txt for domain:_acme-challenge.moewah.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[Thu Aug  6 01:24:58 CST 2020] Please add &apos;--debug&apos; or &apos;--log&apos; to check more details.&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;按照提示我加上&lt;code&gt;--debug&lt;/code&gt;看看详细的信息&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;acme.sh --cron --home &quot;/root/.acme.sh&quot; --debug&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;找到了关键的错误信息，如下图所示&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;QQ截图20200806144224.jpg&quot; loading=&quot;lazy&quot; width=&quot;881&quot; height=&quot;370&quot; src=&quot;/_astro/3331_2519930012_d81762.Mh_iI22t_Z1Tfg9h.webp&quot; srcset=&quot;/_astro/3331_2519930012_d81762.Mh_iI22t_k3lqj.webp 640w, /_astro/3331_2519930012_d81762.Mh_iI22t_1aSmdz.webp 750w, /_astro/3331_2519930012_d81762.Mh_iI22t_Z19cevG.webp 828w, /_astro/3331_2519930012_d81762.Mh_iI22t_Z1Tfg9h.webp 881w&quot; /&gt;&lt;figcaption&gt;QQ截图20200806144224.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;根据链接找到了&lt;a href=&quot;https://error-center.aliyun.com/status/search?Keyword=InvalidTimeStamp.Expired&amp;amp;source=PopGw&quot; target=&quot;_blank&quot;&gt;阿里云错误中心&lt;/a&gt;得到如下的解释：&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;QQ截图20200806143957.jpg&quot; loading=&quot;lazy&quot; width=&quot;1213&quot; height=&quot;236&quot; src=&quot;/_astro/3331_3581110653_af019f.6Y2p6hMY_Z1LVJhN.webp&quot; srcset=&quot;/_astro/3331_3581110653_af019f.6Y2p6hMY_Z19wBd4.webp 640w, /_astro/3331_3581110653_af019f.6Y2p6hMY_Z1CAKAS.webp 750w, /_astro/3331_3581110653_af019f.6Y2p6hMY_ZCHhSE.webp 828w, /_astro/3331_3581110653_af019f.6Y2p6hMY_Z21uOP2.webp 1080w, /_astro/3331_3581110653_af019f.6Y2p6hMY_Z1LVJhN.webp 1213w&quot; /&gt;&lt;figcaption&gt;QQ截图20200806143957.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;用户时间和服务器时间不在 15 分钟内…检查下服务器时间，原来时间没有同步上。我们先同步一下服务器的时间（顺便悄咪咪的加入到cron任务中）：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ntpdate -u ntp.api.bz&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;这时再执行续期命令成功搞定。&lt;/p&gt;</content:encoded></item><item><title>群晖DSM安装Nano编辑器完整教程</title><link>https://blog.moewah.com/posts/3990/</link><guid isPermaLink="true">https://blog.moewah.com/posts/3990/</guid><description>如何在群晖NAS上安装nano文本编辑器？本文详解通过SynoCommunity套件源添加与配置，实现SSH终端中使用nano编辑文件的完整流程，解决群晖官方不提供Nano的问题。</description><pubDate>Fri, 10 Jul 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;相信有很多人更愿意在 SSH 终端使用 nano 编辑器，nano 是 Unix 和类 Unix 系统中的一个文本编辑器，是Pico的复制品（clone）。nano的目标是类似Pico的全功能但又易于使用的编辑器。本文主要介绍如何在 Synology DSM 上安装使用 Nano 以帮助大家更方便的在 SSH 终端进行文件的编辑。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;nano.jpg&quot; loading=&quot;lazy&quot; width=&quot;725&quot; height=&quot;396&quot; src=&quot;/_astro/3990_3550615539_189d8e.DRGoJu55_OyKKA.webp&quot; srcset=&quot;/_astro/3990_3550615539_189d8e.DRGoJu55_2tVVJI.webp 640w, /_astro/3990_3550615539_189d8e.DRGoJu55_OyKKA.webp 725w&quot; /&gt;&lt;figcaption&gt;nano.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;群晖 Synology 官方并不提供 Nano 编辑器的安装包，但我们其实可以从 SynoCommunity （第三方套件源）进行安装。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;添加 SynoCommunity 套件源&lt;a href=&quot;#添加-synocommunity-套件源&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;figure&gt;&lt;img alt=&quot;1.png&quot; loading=&quot;lazy&quot; width=&quot;1411&quot; height=&quot;794&quot; src=&quot;/_astro/3990_3993588432_5a74a5.B3mlzO_5_dYdbL.webp&quot; srcset=&quot;/_astro/3990_3993588432_5a74a5.B3mlzO_5_Z1Pr4Sr.webp 640w, /_astro/3990_3993588432_5a74a5.B3mlzO_5_IoHYi.webp 750w, /_astro/3990_3993588432_5a74a5.B3mlzO_5_ZgMRgy.webp 828w, /_astro/3990_3993588432_5a74a5.B3mlzO_5_Z2f6OYL.webp 1080w, /_astro/3990_3993588432_5a74a5.B3mlzO_5_Z9vtb3.webp 1280w, /_astro/3990_3993588432_5a74a5.B3mlzO_5_dYdbL.webp 1411w&quot; /&gt;&lt;figcaption&gt;1.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;如果使用的系统版本为群晖 DSM 6+，则需要进入「常规」设置中，勾选信任层级为「任何发行者」&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;4.png&quot; loading=&quot;lazy&quot; width=&quot;1158&quot; height=&quot;688&quot; src=&quot;/_astro/3990_3082327586_1fa16b.DduPBBnH_Z1OuG6F.webp&quot; srcset=&quot;/_astro/3990_3082327586_1fa16b.DduPBBnH_ZUKxN8.webp 640w, /_astro/3990_3082327586_1fa16b.DduPBBnH_Z17rc4Y.webp 750w, /_astro/3990_3082327586_1fa16b.DduPBBnH_Z1tynkr.webp 828w, /_astro/3990_3082327586_1fa16b.DduPBBnH_1F8DyB.webp 1080w, /_astro/3990_3082327586_1fa16b.DduPBBnH_Z1OuG6F.webp 1158w&quot; /&gt;&lt;figcaption&gt;4.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;然后，依次点击「套件来源」-&amp;gt; 「新增」&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;2.png&quot; loading=&quot;lazy&quot; width=&quot;1289&quot; height=&quot;691&quot; src=&quot;/_astro/3990_1877892310_5faae1.B_pxUMeo_1Tc2cg.webp&quot; srcset=&quot;/_astro/3990_1877892310_5faae1.B_pxUMeo_Z1VR8CH.webp 640w, /_astro/3990_1877892310_5faae1.B_pxUMeo_1pOrTu.webp 750w, /_astro/3990_1877892310_5faae1.B_pxUMeo_ZJcYb2.webp 828w, /_astro/3990_1877892310_5faae1.B_pxUMeo_ZbYVkE.webp 1080w, /_astro/3990_1877892310_5faae1.B_pxUMeo_1KXi1a.webp 1280w, /_astro/3990_1877892310_5faae1.B_pxUMeo_1Tc2cg.webp 1289w&quot; /&gt;&lt;figcaption&gt;2.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;添加套件源信息包含「名称」和「位置」&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;名称：SynoCommunity&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;位置：https://packages.synocommunity.com/&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;3.png&quot; loading=&quot;lazy&quot; width=&quot;1272&quot; height=&quot;701&quot; src=&quot;/_astro/3990_2196712747_effc6b.CD8n6Vrk_Z11usXh.webp&quot; srcset=&quot;/_astro/3990_2196712747_effc6b.CD8n6Vrk_Z103bMK.webp 640w, /_astro/3990_2196712747_effc6b.CD8n6Vrk_oWKfj.webp 750w, /_astro/3990_2196712747_effc6b.CD8n6Vrk_1mqNtA.webp 828w, /_astro/3990_2196712747_effc6b.CD8n6Vrk_ZYWCnJ.webp 1080w, /_astro/3990_2196712747_effc6b.CD8n6Vrk_Z11usXh.webp 1272w&quot; /&gt;&lt;figcaption&gt;3.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;回到套件中心，点击「社群」刷新一下页面，找到 「SynoCli File Tools」并「安装套件」&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;5.png&quot; loading=&quot;lazy&quot; width=&quot;1264&quot; height=&quot;682&quot; src=&quot;/_astro/3990_659768602_934674.Dzo1Tf55_Z22RJrR.webp&quot; srcset=&quot;/_astro/3990_659768602_934674.Dzo1Tf55_YcTVl.webp 640w, /_astro/3990_659768602_934674.Dzo1Tf55_Z33W7P.webp 750w, /_astro/3990_659768602_934674.Dzo1Tf55_Z1NRO6V.webp 828w, /_astro/3990_659768602_934674.Dzo1Tf55_Z25qLj7.webp 1080w, /_astro/3990_659768602_934674.Dzo1Tf55_Z22RJrR.webp 1264w&quot; /&gt;&lt;figcaption&gt;5.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;SynoCli File Tools 套件包含了许多实用的命令行工具，其中包含了 less、tree、file、nano 等，而 Nano 原来可以单独安装，但现在只能通过 SynoCli File Tools 套件获得。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;6.png&quot; loading=&quot;lazy&quot; width=&quot;1209&quot; height=&quot;746&quot; src=&quot;/_astro/3990_1320479429_d5b7b5.CzTtIKgp_TuCje.webp&quot; srcset=&quot;/_astro/3990_1320479429_d5b7b5.CzTtIKgp_1P83Vk.webp 640w, /_astro/3990_1320479429_d5b7b5.CzTtIKgp_2hwOER.webp 750w, /_astro/3990_1320479429_d5b7b5.CzTtIKgp_2cKi9f.webp 828w, /_astro/3990_1320479429_d5b7b5.CzTtIKgp_1Y29fr.webp 1080w, /_astro/3990_1320479429_d5b7b5.CzTtIKgp_TuCje.webp 1209w&quot; /&gt;&lt;figcaption&gt;6.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;使用 Nano 编辑器&lt;a href=&quot;#使用-nano-编辑器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;套件安装完成后，通过 PuTTY 、XShell 等 SSH 终端工具连接到群晖DSM系统，可以运行 &lt;code&gt;nano [文件名] &lt;/code&gt; 编辑文件。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;Nano 命令工具使用手册&lt;a href=&quot;#nano-命令工具使用手册&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 新建／打开文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nano 路径+文件名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;复制一整行：Alt+6&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;剪切一整行：Ctrl+K&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;粘贴：Ctrl+U&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;搜索：Ctrl+W&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Ctrl+Y 上一页（翻页）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Ctrl+V 下一页（翻页）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Ctrl+O 保存编辑&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Ctrl+X 退出；输入Y确认保存，输入N不保存，按Ctrl+C取消返回。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;例如，编辑 SSH 服务器配置文件。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nano /etc/ssh/sshd_config&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果没有 &lt;code&gt;root&lt;/code&gt; 权限，就需要运行&lt;code&gt;sudo&lt;/code&gt; 进行赋权，如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo nano /etc/ssh/sshd_config&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;编辑完成后按键 &lt;strong&gt;CTR L+ X&lt;/strong&gt; 呼出窗口&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;7.png&quot; loading=&quot;lazy&quot; width=&quot;1173&quot; height=&quot;794&quot; src=&quot;/_astro/3990_389429724_698089.BFveCqTO_Zhkwsp.webp&quot; srcset=&quot;/_astro/3990_389429724_698089.BFveCqTO_ahSOF.webp 640w, /_astro/3990_389429724_698089.BFveCqTO_ZbQ5wj.webp 750w, /_astro/3990_389429724_698089.BFveCqTO_ZYg1gs.webp 828w, /_astro/3990_389429724_698089.BFveCqTO_Z1H3ODe.webp 1080w, /_astro/3990_389429724_698089.BFveCqTO_Zhkwsp.webp 1173w&quot; /&gt;&lt;figcaption&gt;7.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;按键 &lt;strong&gt;Y&lt;/strong&gt; 保存编辑并退出。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Watchtower 自动更新 Docker 镜像与容器</title><link>https://blog.moewah.com/posts/3863/</link><guid isPermaLink="true">https://blog.moewah.com/posts/3863/</guid><description>如何实现 Docker 容器的自动更新？本文详解 Watchtower 工具的使用方法，解决手动更新容器耗时费力的问题，提供自动清除旧镜像和选择性更新的实战方案，助你高效管理 Docker 环境。</description><pubDate>Sat, 13 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;在服务器上部署 Docker 容器有一种在手机上装 APP 的感觉，但 Docker 容器并不会像手机 APP 那样会自动更新，而如果我们需要更新容器一般需要以下三个步骤：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;停止并删除容器：&lt;code&gt;docker rm -f &amp;lt;CONTAINER&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;更新镜像：&lt;code&gt;docker pull &amp;lt;IMAGE&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;启动容器：&lt;code&gt;docker run &amp;lt;ARG&amp;gt; ... &amp;lt;IMAGE&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;如果部署了大量的容器需要更新使用这种传统的方式工作量是巨大的。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;docker-update.png&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;457&quot; src=&quot;/_astro/3863_2462098729_0e9ec8.KJ4kdbCi_1udrg1.webp&quot; srcset=&quot;/_astro/3863_2462098729_0e9ec8.KJ4kdbCi_Z6E20V.webp 640w, /_astro/3863_2462098729_0e9ec8.KJ4kdbCi_Z16DvKL.webp 750w, /_astro/3863_2462098729_0e9ec8.KJ4kdbCi_1udrg1.webp 800w&quot; /&gt;&lt;figcaption&gt;docker-update.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/containrrr/watchtower&quot; target=&quot;_blank&quot;&gt;Watchtower&lt;/a&gt; 是一个可以实现自动化更新 Docker 基础镜像与容器的实用工具。它监视正在运行的容器以及相关的镜像，当检测到&lt;code&gt;reg­istry&lt;/code&gt;中的镜像与本地的镜像有差异时，它会拉取最新镜像并使用最初部署时相同的参数重新启动相应的容器，一切好像什么都没发生过，就像更新手机上的APP一样。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;Watch­tower&lt;/code&gt;本身被打包为&lt;code&gt;Docker&lt;/code&gt;镜像，因此可以像运行任何其他容器一样运行它：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;watchtower&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;containrrr/watchtower&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后所有容器都会自动更新，也包括&lt;code&gt;Watch­tower&lt;/code&gt;本身。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;none&lt;/code&gt;的旧镜像，如果放任不管会占用大量的磁盘空间。要避免这种情况可以加入&lt;code&gt;--cleanup&lt;/code&gt;选项，这样每次更新都会把旧的镜像清理掉。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;watchtower&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--restart=always&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;containrrr/watchtower&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--cleanup&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;code&gt;nginx&lt;/code&gt;、&lt;code&gt;redis&lt;/code&gt;这两个容器，我们可以把&lt;strong&gt;容器名称&lt;/strong&gt;追加到启动命令的最后面，就像下面这个例子：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;watchtower&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--restart=always&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;containrrr/watchtower&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--cleanup&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;nginx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;redis&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果需要排除某些容器，可以将&lt;code&gt;com.centurylinklabs.watchtower.enable&lt;/code&gt;设置为&lt;code&gt;false&lt;/code&gt;。即在&lt;code&gt;docker run&lt;/code&gt;命令中加入&lt;code&gt;--label=com.centurylinklabs.watchtower.enable=false&lt;/code&gt;参数。在下面这个例子中，除了容器名称为&lt;code&gt;nginx&lt;/code&gt;、&lt;code&gt;redis&lt;/code&gt;以外的容器都会自动更新：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;watchtower&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--restart=always&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--label=com.centurylinklabs.watchtower.enable=false&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;containrrr/watchtower&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--cleanup&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;nginx&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;redis&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;Watch­tower&lt;/code&gt;每&lt;code&gt;5&lt;/code&gt;分钟会轮询一次，如果你觉得这个频率太高了可以使用如下选项来控制更新的频率：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--interval&lt;/code&gt;,&lt;code&gt;-i&lt;/code&gt;：设置间隔更新时间。默认 300 秒（ 5 分钟）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--schedule&lt;/code&gt;,&lt;code&gt;-s&lt;/code&gt;：设置定时更新时间。格式为6位的 Cron 表达式，比如&lt;code&gt;--schedule &quot;0 0 4 * * *&quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;比如每小时检查一次更新：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;watchtower&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--restart=always&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;containrrr/watchtower&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--cleanup&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;-i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3600&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;每天凌晨 1 点更新（北京时间)，注意追加环境变量 &lt;code&gt;-e TZ=Asia/Shanghai&lt;/code&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker run -d \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--name watchtower \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--restart=always \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-e TZ=Asia/Shanghai \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-v /var/run/docker.sock:/var/run/docker.sock \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;containrrr/watchtower \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--cleanup \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-s &quot;0 0 1 * * *&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;Watch­tower&lt;/code&gt;以 &lt;code&gt;detached（后台）&lt;/code&gt;模式在运行并自动更新容器，而&lt;code&gt;Watch­tower&lt;/code&gt;也支持以&lt;code&gt;foreground（前台）&lt;/code&gt;模式来使用，即运行一次退出并删掉容器，来实现手动更新容器。这对于偶尔更新一次那些在自动更新中被排除的容器非常有用。&lt;/p&gt;&lt;p&gt;对于&lt;code&gt;foreground&lt;/code&gt;模式，需要加上&lt;code&gt;--run-once&lt;/code&gt;这个专用的选项。下面的例子&lt;code&gt;Docker&lt;/code&gt;会运行一次&lt;code&gt;Watch­tower&lt;/code&gt;并检查容器名称为&lt;code&gt;nginx&lt;/code&gt;容器的基础镜像更新，最后删掉本次运行创建的&lt;code&gt;Watch­tower&lt;/code&gt;容器。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;containrrr/watchtower&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--cleanup&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--run-once&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;nginx&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;同样的手动更新你也可以排除某些容器，更新其它的容器：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--label=com.centurylinklabs.watchtower.enable=false&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;containrrr/watchtower&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--cleanup&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--run-once&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;nginx&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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://containrrr.github.io/watchtower/&quot; target=&quot;_blank&quot;&gt;Watchtower Document&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&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;若 Watchtower 报错&lt;code&gt;Could not do a head request for xxx , falling back to regular pull.&lt;/code&gt; 导致无法自动更新容器的问题与注册表相关，请取消自定义注册表镜像。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>PVE快照复制虚拟机：模板克隆vs备份还原</title><link>https://blog.moewah.com/posts/pve-snapshot-clone-vs-backup-restore/</link><guid isPermaLink="true">https://blog.moewah.com/posts/pve-snapshot-clone-vs-backup-restore/</guid><description>如何高效复制PVE中的虚拟机？本文详解模板克隆与备份还原两种方法的适用场景、操作步骤及避坑指南，帮助你快速实现虚拟机环境复用和跨节点迁移。</description><pubDate>Sun, 05 Apr 2020 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;上周我把一台 Ubuntu 服务器调整优化到了最佳状态，Nginx、SSL、防火墙全配好了。这时候我想保存这个状态，以后还能基于它开新机器。&lt;/p&gt;&lt;p&gt;如果你也有类似需求，继续看。&lt;/p&gt;&lt;p&gt;PVE的快照和VMware不太一样，它只是个”时光书签”，记住某个时刻的磁盘状态。&lt;strong&gt;快照本身不能独立存在，也不能直接变成新虚拟机&lt;/strong&gt;。但有两种方法能解决这个需求。&lt;/p&gt;&lt;section&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;适合需要反复创建相同环境虚拟机的场景。把VM变成模板后，像复印机一样”复印”新机器。&lt;/p&gt;&lt;p&gt;登录PVE的Shell(节点→Shell)，假设你的VM编号是100:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;qm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stop&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;qm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rollback&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clean-install&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 回滚到你想要的快照&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;qm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;template&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;# 变成模板&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;执行后这台VM会变成小方框图标，表示它现在是模板，不能直接开机了。&lt;/p&gt;&lt;p&gt;在Web界面里右键模板→克隆，选择完整克隆，填新VM编号和名字。或者命令行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;qm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;201&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;&quot;&lt;/span&gt;&lt;span&gt;dev-env-for-tom&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--full&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;qm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;202&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;&quot;&lt;/span&gt;&lt;span&gt;dev-env-for-jerry&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--full&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;几秒钟就有了两台新机器。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;速度极快，通常几秒到几分钟&lt;/strong&gt;。但原VM变成模板后不能直接运行，需要提前规划。&lt;/p&gt;&lt;/section&gt;&lt;section&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;适合偶尔复制一台、跨节点迁移、需要保留原VM运行的场景。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;创建备份(原VM可以开着)：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vzdump&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--mode&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;snapshot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--compress&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;zstd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--storage&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;local&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;--mode snapshot&lt;/code&gt;是快照模式备份,几乎不中断业务。Web界面操作更直观:选中VM→备份标签→立即备份。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;还原成新VM：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;qmrestore&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/var/lib/vz/dump/vzdump-qemu-100-&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;.vma.zst&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;301&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--unique&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;--unique true&lt;/code&gt;自动处理MAC地址冲突。Web界面:数据中心→存储→备份→选中备份→还原。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;原VM继续运行,可跨节点迁移&lt;/strong&gt;，但备份还原需要时间。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;怎么选？看你的需求：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;需要反复创建相同环境的VM → 用模板克隆&lt;/p&gt;&lt;p&gt;偶尔复制一台、跨服务器迁移 → 用备份还原&lt;/p&gt;&lt;/section&gt;&lt;section&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;。快照依赖原磁盘文件，如果原VM的磁盘坏了，快照也救不了你。重要数据用vzdump做真正的备份。&lt;/p&gt;&lt;p&gt;克隆前记得改网络配置。两台一模一样的VM同时开机，IP地址和MAC地址相同会冲突。备份还原的&lt;code&gt;--unique true&lt;/code&gt;参数就是干这个的。&lt;/p&gt;&lt;p&gt;链接克隆省空间但别乱删。链接克隆像快捷方式，依赖原模板。如果删了模板，链接克隆就废了。生产环境用完整克隆。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;qm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;listsnapshot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;              &lt;/span&gt;&lt;span&gt;# 查看所有快照&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;qm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;snapshot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;before-update&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 创建快照&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;qm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rollback&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;before-update&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 回滚快照&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;qm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;template&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;span&gt;# 转为模板&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;qm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;201&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--full&lt;/span&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;# 完整克隆&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vzdump&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--mode&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;snapshot&lt;/span&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;# 创建备份&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;qmrestore&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xxx.vma.zst&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;301&lt;/span&gt;&lt;span&gt;         &lt;/span&gt;&lt;span&gt;# 还原备份&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Redis临时与永久密码设置全攻略</title><link>https://blog.moewah.com/posts/3893/</link><guid isPermaLink="true">https://blog.moewah.com/posts/3893/</guid><description>如何给Redis设置密码？本文详解临时密码无需重启、永久密码需修改配置文件的两种方式，解决Redis安全访问问题，确保数据库连接安全。</description><pubDate>Sat, 15 Feb 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Redis 如何设置密码？Redis 密码设置有两种方式，一种是设置永久可用的密码，但需要重启 Redis 服务；一种是设置临时密码，不需要重启 Redis 服务。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;redis.jpg&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;320&quot; src=&quot;/_astro/3893_985343406_aecd1d.CEahHwdH_1q4RdN.webp&quot; srcset=&quot;/_astro/3893_985343406_aecd1d.CEahHwdH_fqAf2.webp 640w, /_astro/3893_985343406_aecd1d.CEahHwdH_v26sv.webp 750w, /_astro/3893_985343406_aecd1d.CEahHwdH_1q4RdN.webp 800w&quot; /&gt;&lt;figcaption&gt;redis.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;Redis设置临时密码&lt;a href=&quot;#redis设置临时密码&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Redis 默认使用端口&lt;code&gt;6379&lt;/code&gt;，默认密码为&lt;code&gt;空&lt;/code&gt;。可通过登录&lt;code&gt;redis-cli&lt;/code&gt;使用命令行设置临时密码&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 进入Redis-Cli 回车&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;redis-cli -p 6379&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 设置临时密码（yourPassword）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;config set requirepass yourPassword&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;当 Redis 服务重启后，密码会失效。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Redis设置永久密码&lt;a href=&quot;#redis设置永久密码&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;可以使用&lt;code&gt;find&lt;/code&gt;命令找到&lt;code&gt;redis.conf&lt;/code&gt;，随后使用&lt;code&gt;nano&lt;/code&gt;或&lt;code&gt;vim&lt;/code&gt;编辑器，在配置文件找到如下这行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#requirepass foobared&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;去掉&lt;code&gt;#&lt;/code&gt;注释符，并且把 &lt;code&gt;foobared&lt;/code&gt;改为自己的密码。&lt;/p&gt;&lt;p&gt;如：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;requirepass mypassword&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;修改完成，保存并退出。当退出 Redis 重新连上Redis的时候，就需要输入新密码了。&lt;/p&gt;&lt;p&gt;检验下密码是否生效：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 进入Redis，回车&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;redis-cli -p 6379&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 输入新设置的密码，并回车&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;auth mypassword&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;若成功输出 &lt;code&gt;OK&lt;/code&gt;表示密码校验成功，代表成功设置永久性密码。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>简易RSS阅读器Miniflux 2 Docker安装指南</title><link>https://blog.moewah.com/posts/3157/</link><guid isPermaLink="true">https://blog.moewah.com/posts/3157/</guid><description>如何快速部署Miniflux 2？本文提供基于Docker的极简安装教程，解决私有化部署中常见的环境配置与数据库连接问题，助你轻松搭建个人RSS阅读器。</description><pubDate>Tue, 07 Jan 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt;&lt;code&gt;Miniflux&lt;/code&gt;使用&lt;code&gt;Golang&lt;/code&gt;编写，是一个极简、快速、轻便且易于安装的&lt;code&gt;Feed&lt;/code&gt;阅读器，支持&lt;code&gt;Atom&lt;/code&gt;、&lt;code&gt;RSS 1.0&lt;/code&gt;/&lt;code&gt;2.0&lt;/code&gt;、&lt;code&gt;JSON&lt;/code&gt;格式，支持&lt;code&gt;OPML&lt;/code&gt;导入/导出等，仅支持&lt;code&gt;Postgresql&lt;/code&gt;数据库，官方文档中的安装教程比较繁琐，这里就说下&lt;code&gt;Docker&lt;/code&gt;安装方法。&lt;/p&gt;
&lt;section&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;figure&gt;&lt;img alt=&quot;列表页面&quot; loading=&quot;lazy&quot; width=&quot;753&quot; height=&quot;144&quot; src=&quot;/_astro/3157_3427518404_12a5d9.D-SmiwVf_Z1Kipeu.webp&quot; srcset=&quot;/_astro/3157_3427518404_12a5d9.D-SmiwVf_12p7Ll.webp 640w, /_astro/3157_3427518404_12a5d9.D-SmiwVf_KrKqJ.webp 750w, /_astro/3157_3427518404_12a5d9.D-SmiwVf_Z1Kipeu.webp 753w&quot; /&gt;&lt;figcaption&gt;列表页面&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;内容页面&quot; loading=&quot;lazy&quot; width=&quot;757&quot; height=&quot;334&quot; src=&quot;/_astro/3157_3740680116_408502.BXcWZ-pt_2voTXg.webp&quot; srcset=&quot;/_astro/3157_3740680116_408502.BXcWZ-pt_1xfgS9.webp 640w, /_astro/3157_3740680116_408502.BXcWZ-pt_Z5zHfx.webp 750w, /_astro/3157_3740680116_408502.BXcWZ-pt_2voTXg.webp 757w&quot; /&gt;&lt;figcaption&gt;内容页面&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&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;OpenVZ&lt;/code&gt;架构的&lt;code&gt;VPS&lt;/code&gt;服务器。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1、安装环境&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#Debian/Ubuntu系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt-get -y install git make nano curl&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS/RHEL系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum -y install git make nano curl&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2、安装Docker和Docker Compose&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#安装Docker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl -sSL https://get.docker.com/ | sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service docker start&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#安装Docker Compose&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl -L https://github.com/docker/compose/releases/download/v2.9.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod +x /usr/local/bin/docker-compose&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;3、安装Miniflux 2&lt;/strong&gt;
新建&lt;code&gt;docker-compose.yml&lt;/code&gt;文件，使用命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nano docker-compose.yml&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;复制并粘贴以下代码：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;version: &apos;3&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;services:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;miniflux:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;image: miniflux/miniflux&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ports:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &quot;8080:8080&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;depends_on:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- db&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;environment:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- DATABASE_URL=postgres://miniflux:secret@db/miniflux?sslmode=disable&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;db:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;image: postgres&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;environment:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- POSTGRES_USER=miniflux&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- POSTGRES_PASSWORD=secret&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;volumes:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- miniflux-db:/var/lib/postgresql/data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;volumes:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;miniflux-db:&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;使用&lt;code&gt;Ctrl+x&lt;/code&gt;、&lt;code&gt;y&lt;/code&gt;保存退出。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;开始运行镜像&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker-compose up -d&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;4、设置管理员账号密码&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#找到Miniflu容器，并记住container-id。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker ps&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#将container-name换成container-id后运行&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker exec -ti &amp;lt;container-name&amp;gt; /usr/bin/miniflux -migrate&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker exec -ti &amp;lt;container-name&amp;gt; /usr/bin/miniflux -create-admin&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;输入账户和密码后，就可以通过&lt;code&gt;http://yourip:8080&lt;/code&gt;进入界面了。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;添加SSL&lt;a href=&quot;#添加ssl&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果想使用域名并添加&lt;code&gt;SSL&lt;/code&gt;证书，首先解析一个域名到服务器上。&lt;/p&gt;&lt;p&gt;安装&lt;code&gt;Caddy&lt;/code&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/caddy_install.sh &amp;amp;&amp;amp; chmod +x caddy_install.sh &amp;amp;&amp;amp; bash caddy_install.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#备用地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget -N --no-check-certificate https://blog.moewah.com/source/caddy_install.sh &amp;amp;&amp;amp; chmod +x caddy_install.sh &amp;amp;&amp;amp; bash caddy_install.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;编辑配置文件&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#以下全部内容是一个整体，修改域名、IP、邮箱后一起复制到SSH运行！&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo &quot;https://yourdomain.com {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tls admin@moewah.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy / 111.111.111.111:9090 {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;header_upstream Host {host}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;header_upstream X-Real-IP {remote}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;header_upstream X-Forwarded-For {remote}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;header_upstream X-Forwarded-Port {server_port}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;header_upstream X-Forwarded-Proto {scheme}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;log /var/log/caddy.log&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;gzip&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&quot; &amp;gt; /usr/local/caddy/Caddyfile&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;启动&lt;code&gt;Caddy&lt;/code&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/etc/init.d/caddy restart&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;最后就可以通过域名&lt;code&gt;https&lt;/code&gt;访问了。&lt;/p&gt;&lt;p&gt;&lt;code&gt;Miniflux&lt;/code&gt;还可以配合&lt;code&gt;RSSHub&lt;/code&gt;一起使用，查看：&lt;a href=&quot;https://blog.moewah.com/posts/1364/&quot;&gt;RSSHub：一个轻量、易于扩展的RSS生成器&lt;/a&gt;。更多使用姿势请翻阅官方文档：&lt;a href=&quot;https://docs.miniflux.net/&quot; target=&quot;_blank&quot;&gt;https://docs.miniflux.net/&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>群晖NAS无法使用TUN-TAP解决方案</title><link>https://blog.moewah.com/posts/2750/</link><guid isPermaLink="true">https://blog.moewah.com/posts/2750/</guid><description>群晖NAS运行zerotier时报错&apos;无法打开TUN/TAP设备&apos;？本文提供从检查tun模块到持久化配置的完整解决方案，帮助用户解决Zerotier内网穿透失败问题。</description><pubDate>Fri, 09 Aug 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近我的群晖NAS在执行 &lt;code&gt;zerotier-one -d&lt;/code&gt; 启动命令的时候就会报错，导致使用 zerotier 内网穿透一直失败，报错如下：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ERROR: unable to configure virtual network port: could not open TUN/TAP device: No such file or directory&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;据说在 &lt;a href=&quot;http://download.zerotier.com/RELEASES/1.4.2/dist/synology/zerotier_braswell-6.1_1.4.0-0.spk&quot; target=&quot;_blank&quot;&gt;Zerotier-1.4.0&lt;/a&gt; 版本中已经修复了这一问题，大家可以自己去试试看，若依然解决不了可以继续往下看，步骤如下：&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;检查tun模块状态&lt;a href=&quot;#检查tun模块状态&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;检查是否安装了&lt;code&gt;tun&lt;/code&gt;模块：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lsmod | grep tun&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果结果为空，请尝试安装它：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;insmod /lib/modules/tun.ko&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果一切顺利，继续进行下一个测试。&lt;/p&gt;&lt;section&gt;&lt;h4&gt;测试tun.ko模块是否有效&lt;a href=&quot;#测试tunko模块是否有效&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;确保&lt;code&gt;tun.ko&lt;/code&gt;模块可以正常工作：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir /dev/net&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mknod /dev/net/tun c 10 200&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod 600 /dev/net/tun&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat /dev/net/tun&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果&lt;code&gt;cat&lt;/code&gt;命令的返回结果是&lt;code&gt;File descriptor in bad state&lt;/code&gt;，则表示模块已正确安装。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;使tun.ko模块持久化&lt;a href=&quot;#使tunko模块持久化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;模块安装需要在每次Synology重启时保持持久性，就必须重复使用&lt;code&gt;insmod&lt;/code&gt;命令。&lt;/p&gt;&lt;p&gt;可以创建开机脚本搞定，执行如下命令进行创建：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat &amp;lt;&amp;lt;EOF &amp;gt; /usr/local/etc/rc.d/tun.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#!/bin/sh -e&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;insmod /lib/modules/tun.ko&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;EOF&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;给脚本可执行权限：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod a+x /usr/local/etc/rc.d/tun.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;重新启动 Synology NAS 或手动执行一次脚本。完成！&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Docker BT离线下载镜像部署实战指南</title><link>https://blog.moewah.com/posts/3147/</link><guid isPermaLink="true">https://blog.moewah.com/posts/3147/</guid><description>如何在Docker环境实现BT离线下载？本文聚焦虚拟化运维，提供容器部署的完整指南，详细说明Aria2、utorrent、Deluge等镜像配置与使用方法，帮助快速搭建高效下载服务。</description><pubDate>Wed, 31 Jul 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt; 之前写过一些有关于&lt;a href=&quot;https://www.moewah.com/tag/offline-download/&quot; target=&quot;_blank&quot;&gt;离线下载&lt;/a&gt;的内容，例如 yunBT、&lt;a href=&quot;https://www.moewah.com/archives/1444.html&quot; target=&quot;_blank&quot;&gt;Motrix&lt;/a&gt;、pyLoad等，目前了解到部分项目作者已弃坑。另外考虑到一些项目需要手动部署比较麻烦，所以这里提供几款BT离线下载程序的Docker镜像包括&lt;code&gt;Aria2&lt;/code&gt;、&lt;code&gt;utorrent&lt;/code&gt;、&lt;code&gt;Deluge&lt;/code&gt;、&lt;code&gt;Transmission&lt;/code&gt;、&lt;code&gt;Rutorrent&lt;/code&gt;、&lt;code&gt;Qbittorrent&lt;/code&gt; 、&lt;code&gt;Simple Torrent&lt;/code&gt;做个简单的分享。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;docker-bt.jpg&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;896&quot; src=&quot;/_astro/3147_2135178728_204956.DhQZ9_i-_Z16uCOA.webp&quot; srcset=&quot;/_astro/3147_2135178728_204956.DhQZ9_i-_Z2vuiRb.webp 640w, /_astro/3147_2135178728_204956.DhQZ9_i-_5NKQD.webp 750w, /_astro/3147_2135178728_204956.DhQZ9_i-_1SASBs.webp 828w, /_astro/3147_2135178728_204956.DhQZ9_i-_Z1Xb2UP.webp 1080w, /_astro/3147_2135178728_204956.DhQZ9_i-_Z16uCOA.webp 1280w&quot; /&gt;&lt;figcaption&gt;docker-bt.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;安装Docker&lt;a href=&quot;#安装docker&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;首先安装下面程序之前，需要在服务器上安装&lt;code&gt;Docker&lt;/code&gt;环境，使用命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 6系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rpm -iUvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum update -y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum -y install docker-io&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service docker start&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig docker on&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 7、Debian、Ubuntu系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl -sSL https://get.docker.com/ | sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl start docker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl enable docker&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;安装Aria2&lt;a href=&quot;#安装aria2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;镜像来源：&lt;/strong&gt; &lt;a href=&quot;https://hub.docker.com/r/onisuly/aria2-with-webui&quot; target=&quot;_blank&quot;&gt;https://hub.docker.com/r/onisuly/aria2-with-webui&lt;/a&gt;&lt;/p&gt;&lt;p&gt;先安装&lt;code&gt;Docker&lt;/code&gt;，然后执行以下命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker run --restart=always --name aria2-ariang -d \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-p 6060:80 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-p 6800:6800 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-e SECRET=moewah \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-v ~/aria2/down:/data \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-v ~/aria2/conf:/conf \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;onisuly/aria2-with-webui&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;安装完成后，相关信息如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;AriaNg地址：http://your-ip:6060&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;aria2连接端口：6800&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;aria2连接密匙：moewah&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;下载/配置目录：~/aria2&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;CentOS&lt;/code&gt;系统安装后，可能还需要开启相应的端口，大致如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 6&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iptables -I INPUT -p tcp --dport 6060 -j ACCEPT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iptables -A INPUT -p tcp --dport 6800 -j ACCEPT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service iptables save&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service iptables restart&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 7&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --zone=public --add-port=6060/tcp --permanent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --zone=public --add-port=6800/tcp --permanent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --reload&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果你不想用了，可以使用以下命令卸载：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#删掉容器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ContainerID=`docker ps|grep onisuly/aria2-with-webui|awk &apos;{print $1}&apos;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker kill ${ContainerID}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker rm ${ContainerID}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker rmi `docker images|grep onisuly/aria2-with-webui|awk &apos;{print $3}&apos;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#删掉下载文件夹&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm -rf ~/aria2&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;安装utorrent&lt;a href=&quot;#安装utorrent&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;镜像来源：&lt;/strong&gt; &lt;a href=&quot;https://hub.docker.com/r/ekho/utorrent&quot; target=&quot;_blank&quot;&gt;https://hub.docker.com/r/ekho/utorrent&lt;/a&gt;&lt;/p&gt;&lt;p&gt;先安装&lt;code&gt;Docker&lt;/code&gt;，然后执行以下命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker run --restart=always --name utorrent -d \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-p 8080:8080 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-p 6881:6881 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-v ~/utorrent:/utorrent/data \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ekho/utorrent&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;安装完成后，相关信息如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;utorrent地址：http://your-ip:8080/gui&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;访问用户名：admin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;访问密码：为空&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;下载目录：~/utorrent&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;CentOS&lt;/code&gt;系统安装后，可能还需要开启相应的端口，大致如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 6&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iptables -I INPUT -p tcp --dport 8080 -j ACCEPT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iptables -A INPUT -p tcp --dport 6881 -j ACCEPT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service iptables save&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service iptables restart&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 7&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --zone=public --add-port=8080/tcp --permanent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --zone=public --add-port=6881/tcp --permanent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --reload&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果你不想用了，可以使用以下命令卸载：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#删掉容器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ContainerID=`docker ps|grep ekho/utorrent|awk &apos;{print $1}&apos;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker kill ${ContainerID}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker rm ${ContainerID}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker rmi `docker images|grep ekho/utorrent|awk &apos;{print $3}&apos;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#删掉下载文件夹&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm -rf ~/utorrent&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;安装Deluge&lt;a href=&quot;#安装deluge&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;镜像来源：&lt;/strong&gt; &lt;a href=&quot;https://hub.docker.com/r/linuxserver/deluge&quot; target=&quot;_blank&quot;&gt;https://hub.docker.com/r/linuxserver/deluge&lt;/a&gt;&lt;/p&gt;&lt;p&gt;先安装&lt;code&gt;Docker&lt;/code&gt;，然后执行以下命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker run --restart=always --name deluge -d \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--net=host \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-v ~/deluge/config:/config \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-v ~/deluge/downloads:/downloads \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;linuxserver/deluge&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;安装完成后，相关信息如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;deluge地址：http://your-ip:8112&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;访问密码：deluge&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;配置/下载目录：~/deluge&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;CentOS&lt;/code&gt;系统安装后，可能还需要开启相应的端口，大致如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 6&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iptables -I INPUT -p tcp --dport 8112 -j ACCEPT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service iptables save&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service iptables restart&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 7&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --zone=public --add-port=8112/tcp --permanent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --reload&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;进入界面后，记得点击上方的&lt;code&gt;Preferences&lt;/code&gt;，将下载目录设置为&lt;code&gt;/downloads&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;如果你不想用了，可以使用以下命令卸载：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#删掉容器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ContainerID=`docker ps|grep linuxserver/deluge|awk &apos;{print $1}&apos;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker kill ${ContainerID}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker rm ${ContainerID}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker rmi `docker images|grep linuxserver/deluge|awk &apos;{print $3}&apos;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#删掉下载文件夹&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm -rf ~/deluge&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;安装Transmission&lt;a href=&quot;#安装transmission&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;镜像来源：&lt;/strong&gt; &lt;a href=&quot;https://hub.docker.com/r/linuxserver/transmission&quot; target=&quot;_blank&quot;&gt;https://hub.docker.com/r/linuxserver/transmission&lt;/a&gt;&lt;/p&gt;&lt;p&gt;先安装&lt;code&gt;Docker&lt;/code&gt;，然后执行以下命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker run --restart=always --name transmission -d \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-e TRANSMISSION_WEB_HOME=/transmission-web-control/ \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-e USER=moewah \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-e PASS=moewah \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-p 9091:9091 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-p 51413:51413 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-p 51413:51413/udp \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-v ~/transmission/config:/config \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-v ~/transmission/downloads:/downloads \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-v ~/transmission/watch:/watch \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;linuxserver/transmission&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;安装完成后，相关信息如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;transmission地址：http://your-ip:9091&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;访问用户名：moewah&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;访问密码：moewah&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;配置/下载目录：~/transmission&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;CentOS&lt;/code&gt;系统安装后，可能还需要开启相应的端口，大致如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 6&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iptables -I INPUT -p tcp --dport 9091 -j ACCEPT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iptables -A INPUT -p tcp --dport 51413 -j ACCEPT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iptables -A INPUT -p udp --dport 51413 -j ACCEPT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service iptables save&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service iptables restart&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 7&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --zone=public --add-port=9091/tcp --permanent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --zone=public --add-port=51413/tcp --permanent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --zone=public --add-port=51413/udp --permanent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --reload&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果你不想用了，可以使用以下命令卸载：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#删掉容器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ContainerID=`docker ps|grep linuxserver/transmission|awk &apos;{print $1}&apos;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker kill ${ContainerID}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker rm ${ContainerID}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker rmi `docker images|grep linuxserver/transmission|awk &apos;{print $3}&apos;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#删掉下载文件夹&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm -rf ~/transmission&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;安装Rutorrent&lt;a href=&quot;#安装rutorrent&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;镜像来源：&lt;/strong&gt; &lt;a href=&quot;https://hub.docker.com/r/linuxserver/rutorrent&quot; target=&quot;_blank&quot;&gt;https://hub.docker.com/r/linuxserver/rutorrent&lt;/a&gt;&lt;/p&gt;&lt;p&gt;先安装&lt;code&gt;Docker&lt;/code&gt;，然后执行以下命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker run --restart=always --name rutorrent -d \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-p 2222:80 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-p 5000:5000 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-p 51413:51413 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-p 6881:6881/udp \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-v ~/rutorrent/config:/config \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-v ~/rutorrent/downloads:/downloads \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;linuxserver/rutorrent&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;安装完成后，相关信息如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rutorrent地址：http://your-ip:2222&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;配置/下载目录：~/rutorrent&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;CentOS&lt;/code&gt;系统安装后，可能还需要开启相应的端口，大致如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 6&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iptables -I INPUT -p tcp --dport 2222 -j ACCEPT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iptables -A INPUT -p tcp --dport 5000 -j ACCEPT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iptables -A INPUT -p tcp --dport 51413 -j ACCEPT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iptables -A INPUT -p udp --dport 6881 -j ACCEPT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service iptables save&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service iptables restart&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 7&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --zone=public --add-port=2222/tcp --permanent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --zone=public --add-port=5000/tcp --permanent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --zone=public --add-port=51413/tcp --permanent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --zone=public --add-port=6881/udp --permanent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --reload&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果你不想用了，可以使用以下命令卸载：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#删掉容器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ContainerID=`docker ps|grep linuxserver/rutorrent|awk &apos;{print $1}&apos;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker kill ${ContainerID}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker rm ${ContainerID}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker rmi `docker images|grep linuxserver/rutorrent|awk &apos;{print $3}&apos;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#删掉下载文件夹&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm -rf ~/rutorrent&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;安装Qbittorrent&lt;a href=&quot;#安装qbittorrent&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;镜像来源：&lt;/strong&gt; &lt;a href=&quot;https://hub.docker.com/r/linuxserver/qbittorrent&quot; target=&quot;_blank&quot;&gt;https://hub.docker.com/r/linuxserver/qbittorrent&lt;/a&gt;&lt;/p&gt;&lt;p&gt;先安装&lt;code&gt;Docker&lt;/code&gt;，然后执行以下命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker run --restart=always --name qbittorrent -d \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-p 6881:6881 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-p 6881:6881/udp \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-p 8080:8080 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-v ~/qbittorrent/config:/config \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-v ~/qbittorrent/downloads:/downloads \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;linuxserver/qbittorrent&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;安装完成后，相关信息如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;qbittorrent地址：http://your-ip:8080&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;用户名：admin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;密码：adminadmin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;配置和/下载目录：~/qbittorrent&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;CentOS&lt;/code&gt;系统安装后，可能还需要开启相应的端口，大致如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 6&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iptables -I INPUT -p tcp --dport 8080 -j ACCEPT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iptables -A INPUT -p tcp --dport 6881 -j ACCEPT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iptables -A INPUT -p udp --dport 6881 -j ACCEPT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service iptables save&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service iptables restart&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 7&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --zone=public --add-port=8080/tcp --permanent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --zone=public --add-port=6881/tcp --permanent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --zone=public --add-port=6881/udp --permanent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --reload&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果你不想用了，可以使用以下命令卸载：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#删掉容器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ContainerID=`docker ps|grep linuxserver/qbittorrent|awk &apos;{print $1}&apos;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker kill ${ContainerID}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker rm ${ContainerID}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker rmi `docker images|grep linuxserver/qbittorrent|awk &apos;{print $3}&apos;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#删掉下载文件夹&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm -rf ~/qbittorrent&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;安装Simple Torrent&lt;a href=&quot;#安装simple-torrent&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;镜像来源：&lt;/strong&gt; &lt;a href=&quot;https://registry.hub.docker.com/u/boypt/cloud-torrent/&quot; target=&quot;_blank&quot;&gt;https://registry.hub.docker.com/u/boypt/cloud-torrent/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;先安装&lt;code&gt;Docker&lt;/code&gt;，然后执行以下命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker run --restart=always --name simple-torrent -d \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-p 3000:3000 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-v ~/downloads:/downloads \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-v ~/torrents:/torrents \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;boypt/cloud-torrent&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;安装完成后，相关信息如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;WebUI地址：http://your-ip:3000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;配置/下载目录：~/downloads&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这里提供个&lt;code&gt;CentOS&lt;/code&gt;系统防火墙开启命令，大致如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 6&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iptables -I INPUT -p tcp --dport 3000 -j ACCEPT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service iptables save&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service iptables restart&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 7&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --zone=public --add-port=3000/tcp --permanent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --reload&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果你不想用了，可以使用以下命令卸载：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#删掉容器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ContainerID=`docker ps|grep boypt/cloud-torrent|awk &apos;{print $1}&apos;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker kill ${ContainerID}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker rm ${ContainerID}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker rmi `docker images|grep boypt/cloud-torrent|awk &apos;{print $3}&apos;`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#删掉下载文件夹&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm -rf ~/downloads&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded></item><item><title>Debian-Ubuntu系统备份与还原完整指南</title><link>https://blog.moewah.com/posts/2610/</link><guid isPermaLink="true">https://blog.moewah.com/posts/2610/</guid><description>如何在Debian/Ubuntu系统中实现完整备份与快速还原？本文提供从tar命令打包到GRUB重装的全流程操作，解决系统崩溃后的数据恢复难题，确保你的Linux系统安全无忧。</description><pubDate>Tue, 30 Jul 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt; 很多人认为完全没有必要给Linux系统做备份，其实这个观点是不正确的。很多一批人在root最高权限下执行操作，难免遇到马失前蹄的偶然性事情发生。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;system-backup-tools-for-the-Linux-desktop.jpg&quot; loading=&quot;lazy&quot; width=&quot;895&quot; height=&quot;532&quot; src=&quot;/_astro/2610_3086192871_fbdf7b.gTOFtQoh_Z1GASpU.webp&quot; srcset=&quot;/_astro/2610_3086192871_fbdf7b.gTOFtQoh_11Xwh5.webp 640w, /_astro/2610_3086192871_fbdf7b.gTOFtQoh_6xN9V.webp 750w, /_astro/2610_3086192871_fbdf7b.gTOFtQoh_1lohxB.webp 828w, /_astro/2610_3086192871_fbdf7b.gTOFtQoh_Z1GASpU.webp 895w&quot; /&gt;&lt;figcaption&gt;system-backup-tools-for-the-Linux-desktop.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;那么如何备份 Debian/Ubuntu系统？很简单，就像你备份或压缩其它东西一样，使用TAR。和Windows不同，Linux不会限制root访问任何东西，你可以把分区上的所有东西都打包到一个TAR文件里去！&lt;/p&gt;
&lt;section&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;1、Debian/Ubuntu 备份还原思路&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;为了简单起见，建议只划分&lt;strong&gt;根分区&lt;/strong&gt;&lt;code&gt;/&lt;/code&gt;和&lt;code&gt;swap&lt;/code&gt;&lt;strong&gt;交换空间&lt;/strong&gt;就好.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;备份: 系统运行时或进入LiveCD,用tar命令压缩备份.&lt;/p&gt;&lt;p&gt;还原: 进入LiveCD，用tar解压还原.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;2、在新电脑上安装备份系统的思路&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;进入LiveCD,用GParted分好区后解压,对备份系统里的 &lt;code&gt;/etc/fstab&lt;/code&gt;分区挂载进行相应的修改,重装GRUB引导.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;注: Live系统(LiveCD)运行在内存上.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;3、其它问题&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;问；Debian系统的LiveCD哪里下载？
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Debian历史镜像下载&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;问：LiveCD怎么用？
&lt;ul&gt;
&lt;li&gt;请使用类&lt;strong&gt;软碟通&lt;/strong&gt; 、 &lt;a href=&quot;https://www.balena.io/etcher/&quot; target=&quot;_blank&quot;&gt;Etcher&lt;/a&gt; 等工具将ISO镜像写入到U盘，使用U盘启动系统。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 切换root用户&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo su&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 进入系统根目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd /&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 使用tar命令打包系统目录和文件（下面一整段作为一条命令执行）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tar pczf bak.tgz \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--exclude=/bak.tgz \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--exclude=/cdrom \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--exclude=/dev \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--exclude=/lost+found \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--exclude=/media \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--exclude=/mnt \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--exclude=/proc \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--exclude=/run \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--exclude=/sys \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--exclude=/tmp \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;其中，&lt;code&gt;--exclude&lt;/code&gt;的作用是用于排除目录和文件。&lt;/p&gt;&lt;/section&gt;&lt;section&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;建议在 LiveCD 模式下还原。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 切换root用户&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo su&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 解包到系统根目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tar pxzf bak.tgz -C /&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 创建目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir cdrom dev lost+found media mnt proc run sys tmp&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;解释：&lt;code&gt;tar pxzf bak.tgz -C /&lt;/code&gt;命令行中的参数&lt;code&gt;p&lt;/code&gt;是为了保留原文件的属性(属性不会依据使用者而变)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;重装GRUB引导&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo grub-install /dev/sda&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo update-grub&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Proxmox 添加多块硬盘详细教程</title><link>https://blog.moewah.com/posts/2546/</link><guid isPermaLink="true">https://blog.moewah.com/posts/2546/</guid><description>如何在Proxmox VE中添加第二块硬盘？本文手把手教你分区、格式化并挂载机械硬盘到PVE系统，解决数据存储扩展问题，核心关键词包括Proxmox-VE、硬盘分区和ext4格式。</description><pubDate>Thu, 25 Jul 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Proxmox（PVE）安装时候只有一块硬盘，我使用了ssd作为系统盘，并安装各种系统在ssd上面，但是想把数据存放在普通的机械硬盘上，这样我们就需要添加另一块硬盘了！&lt;/p&gt;
&lt;p&gt;本文以PVE 5.3-8为例，首选你装好硬盘启动后查看下硬盘的名称&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;1.jpg&quot; loading=&quot;lazy&quot; width=&quot;1167&quot; height=&quot;570&quot; src=&quot;/_astro/2546_3637323964_3bb230.Cd0oEHZ0_Z1UJy1.webp&quot; srcset=&quot;/_astro/2546_3637323964_3bb230.Cd0oEHZ0_Z1I8TGH.webp 640w, /_astro/2546_3637323964_3bb230.Cd0oEHZ0_1zTFPq.webp 750w, /_astro/2546_3637323964_3bb230.Cd0oEHZ0_Z1RkNbC.webp 828w, /_astro/2546_3637323964_3bb230.Cd0oEHZ0_Z23PvJW.webp 1080w, /_astro/2546_3637323964_3bb230.Cd0oEHZ0_Z1UJy1.webp 1167w&quot; /&gt;&lt;figcaption&gt;1.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;如上图所示，我用来当数据盘的设备名称为  &lt;strong&gt;sdc&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;也可以到终端内使用命令查看&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ls /dev/sd*&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;如果你是IDE硬盘，应该没有了吧，使用以下命令查看&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ls /dev/hd*&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;2-1.png&quot; loading=&quot;lazy&quot; width=&quot;304&quot; height=&quot;27&quot; src=&quot;/_astro/2546_856757600_14667c.DVI9DWnz_EEmbT.webp&quot; srcset=&quot;/_astro/2546_856757600_14667c.DVI9DWnz_EEmbT.webp 304w&quot; /&gt;&lt;figcaption&gt;2-1.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;上图是查询结果，如果/dev/sdb这种样子，后面没有sdb1等数字，说明硬盘还没有分区&lt;/p&gt;
&lt;p&gt;之后我们要把这个硬盘分区，并格式化为&lt;strong&gt;ext4&lt;/strong&gt; 格式&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fdisk /dev/sdc&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;进入fdisk界面，按下面方式操作&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Select (default p): (直接按下enter)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Partition number (1-4, default 1): (直接按下enter)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;First sector (2048-167772159, default 2048): (直接按下enter)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Last sector, +sectors or +size{K,M,G} (2048-167772159, default 167772159): (直接按下enter)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Command (m for help): w&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;3-1.png&quot; loading=&quot;lazy&quot; width=&quot;304&quot; height=&quot;93&quot; src=&quot;/_astro/2546_392946365_b2181b.CxHJkgDd_Z1oPOVv.webp&quot; srcset=&quot;/_astro/2546_392946365_b2181b.CxHJkgDd_Z1oPOVv.webp 304w&quot; /&gt;&lt;figcaption&gt;3-1.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;上面的sector会根据你硬盘大小改变，我们分一个区，所以直接默认回车就可以&lt;/p&gt;
&lt;p&gt;分区之后就会多出一个  &lt;strong&gt;/dev/sdc1&lt;/strong&gt; ，之后我们格式化为&lt;strong&gt;ext4&lt;/strong&gt; 格式&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkfs -t ext4 /dev/sdc1&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;格式化需要一些时间，等待一下就可以，不要着急，完成后出现done&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;4.jpg&quot; loading=&quot;lazy&quot; width=&quot;537&quot; height=&quot;107&quot; src=&quot;/_astro/2546_2877430625_c620fc.Dykgpc3y_Z1EAetM.webp&quot; srcset=&quot;/_astro/2546_2877430625_c620fc.Dykgpc3y_Z1EAetM.webp 537w&quot; /&gt;&lt;figcaption&gt;4.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;如上图样子就格式化好了！之后我们要挂载到&lt;strong&gt;pve&lt;/strong&gt; 上面，先新建一个挂载目录&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir -p /mnt/sdc1&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;然后把硬盘挂载信息写入 &lt;code&gt; /etc/fstab&lt;/code&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo /dev/sdc1 /mnt/sdc1 ext4 defaults 1 2 &amp;gt;&amp;gt; /etc/fstab&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;对其中参数不熟悉的，请自行查看文章帮助了解。-&amp;gt;&lt;a href=&quot;https://blog.moewah.com/posts/2558/&quot;&gt;传送门&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如果这里你操作错误，可能会导致PVE无法启动，需要在启动时候接上显示器，进入修复模式 &lt;strong&gt;repair filesystem&lt;/strong&gt; ，直接输入root密码即可进入&lt;/p&gt;
&lt;p&gt;因为此时/目录是只读模式，进行修改&lt;code&gt;/etc/fstab&lt;/code&gt;时，提示无法保存（只读），这时需要将/目录重新挂载为可读写模式  ，用命令&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mount -o remount,rw,auto /&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;然后再对&lt;code&gt;/etc/fstab&lt;/code&gt;进行修改就可以了。重启后系统正常启动。&lt;/p&gt;
&lt;p&gt;之后重启PVE即可&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;reboot&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;开机添加目录
&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;5.jpg&quot; loading=&quot;lazy&quot; width=&quot;1108&quot; height=&quot;462&quot; src=&quot;/_astro/2546_2707176225_fff307.Ceio6PgH_56nwM.webp&quot; srcset=&quot;/_astro/2546_2707176225_fff307.Ceio6PgH_Z13N0CW.webp 640w, /_astro/2546_2707176225_fff307.Ceio6PgH_1N0O1k.webp 750w, /_astro/2546_2707176225_fff307.Ceio6PgH_Z1O5JAN.webp 828w, /_astro/2546_2707176225_fff307.Ceio6PgH_Z1ly9Wx.webp 1080w, /_astro/2546_2707176225_fff307.Ceio6PgH_56nwM.webp 1108w&quot; /&gt;&lt;figcaption&gt;5.jpg&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img alt=&quot;6.jpg&quot; loading=&quot;lazy&quot; width=&quot;662&quot; height=&quot;330&quot; src=&quot;/_astro/2546_2325133391_0354b0.BULNCRmf_b6Jxm.webp&quot; srcset=&quot;/_astro/2546_2325133391_0354b0.BULNCRmf_1EnMhD.webp 640w, /_astro/2546_2325133391_0354b0.BULNCRmf_b6Jxm.webp 662w&quot; /&gt;&lt;figcaption&gt;6.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;添加完毕，就可以在节点里看到你刚刚添加的目录了&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;7.jpg&quot; loading=&quot;lazy&quot; width=&quot;730&quot; height=&quot;432&quot; src=&quot;/_astro/2546_3380028411_a6db55.ChaW6KOk_1bnolV.webp&quot; srcset=&quot;/_astro/2546_3380028411_a6db55.ChaW6KOk_Z3xSX6.webp 640w, /_astro/2546_3380028411_a6db55.ChaW6KOk_1bnolV.webp 730w&quot; /&gt;&lt;figcaption&gt;7.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;</content:encoded></item><item><title>Proxmox VE 去除“没有有效订阅”弹窗提示</title><link>https://blog.moewah.com/posts/2528/</link><guid isPermaLink="true">https://blog.moewah.com/posts/2528/</guid><description>如何解决Proxmox VE免费版登录时频繁弹出“没有有效订阅”的提示？本文提供手动修改文件和sed命令行一键修复的详细方法，帮助用户快速移除烦人的弹窗提示。</description><pubDate>Tue, 23 Jul 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;**说明：**上篇文章&lt;a href=&quot;https://blog.moewah.com/posts/2497/&quot;&gt;《U 盘（优盘）安装 Proxmox VE 图文教程》&lt;/a&gt;，主要对如何通过U盘来安装PVE做了一个简单的了解，在我们安装完成后登陆的时候如果不是订阅用户默认会提示一个讨人烦的信息：&lt;code&gt;没有有效的订阅You do not have a valid subscription for this server. Please visit www.proxmox.com to get a list of available options.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;用的是免费版的，所以每次都弹窗是真的挺烦的&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;proxmox-ve技巧1：移除pve-“no-valid-subscription”-的弹窗提示.png&quot; loading=&quot;lazy&quot; width=&quot;639&quot; height=&quot;159&quot; src=&quot;/_astro/2528_917995521_474534.BV20z4PV_26Oupy.webp&quot; srcset=&quot;/_astro/2528_917995521_474534.BV20z4PV_26Oupy.webp 639w&quot; /&gt;&lt;figcaption&gt;proxmox-ve技巧1：移除pve-“no-valid-subscription”-的弹窗提示.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&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;/usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js&lt;/code&gt;&lt;/p&gt;&lt;p&gt;修改之前记得先备份一下&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;root@kvm2:/usr/share/javascript/proxmox-widget-toolkit# cp proxmoxlib.js proxmoxlib.js.bak&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;root@kvm2:/usr/share/javascript/proxmox-widget-toolkit# ls&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;proxmoxlib.js  proxmoxlib.js.bak&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;root@kvm2:/usr/share/javascript/proxmox-widget-toolkit# vim proxmoxlib.js&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后找到&lt;code&gt;if (data.status !== &apos;Active&apos;) {&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;proxmox-ve技巧1：移除pve-“no-valid-subscription”-的弹窗提示-1.png&quot; loading=&quot;lazy&quot; width=&quot;657&quot; height=&quot;533&quot; src=&quot;/_astro/2528_3272475241_15031e.DiPozGvL_2tMEPt.webp&quot; srcset=&quot;/_astro/2528_3272475241_15031e.DiPozGvL_1ohlFF.webp 640w, /_astro/2528_3272475241_15031e.DiPozGvL_2tMEPt.webp 657w&quot; /&gt;&lt;figcaption&gt;proxmox-ve技巧1：移除pve-“no-valid-subscription”-的弹窗提示-1.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;修改为&lt;code&gt;if (false) {&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;proxmox-ve技巧-移除pve-“no-valid-subscription”-的弹窗提示.png&quot; loading=&quot;lazy&quot; width=&quot;533&quot; height=&quot;175&quot; src=&quot;/_astro/2528_3745379151_466f9f.CMxOGeCh_RlP0p.webp&quot; srcset=&quot;/_astro/2528_3745379151_466f9f.CMxOGeCh_RlP0p.webp 533w&quot; /&gt;&lt;figcaption&gt;proxmox-ve技巧-移除pve-“no-valid-subscription”-的弹窗提示.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;然后保存，重启网页服务&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl restart pveproxy&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后&lt;strong&gt;CTRL+F5&lt;/strong&gt; 强制刷新网页，或清理一下浏览器的缓存就好了！&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;其实上面的步骤也可以理解为：将&lt;code&gt;/usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js&lt;/code&gt;文件中的&lt;code&gt;data.status !== &apos;Active&apos;&lt;/code&gt;替换为&lt;code&gt;false&lt;/code&gt;。既然是这样，那么我们可直接使用&lt;code&gt;SED&lt;/code&gt;命令来搞定：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sed -i.bak &quot;s/data.status !== &apos;Active&apos;/false/g&quot; /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js &amp;amp;&amp;amp; systemctl restart pveproxy&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;执行完成后，清理一下浏览器的缓存就可以了。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>群晖自动更换必应壁纸脚本教程</title><link>https://blog.moewah.com/posts/2538/</link><guid isPermaLink="true">https://blog.moewah.com/posts/2538/</guid><description>如何让群晖登录界面定时更换必应壁纸？本文提供完整脚本使用方法和crontab定时任务配置，解决群晖只能固定壁纸的痛点，实现自动换图功能。</description><pubDate>Tue, 23 Jul 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt; 群晖DSM的登录界面，支持自定义壁纸，但可惜只能选择一张图片。偶然在Google的时候发现已经有朋友使用shell造了一个轮子，配合群晖crontab任务计划，让群晖登录壁纸定时自动更换。&lt;/p&gt;
&lt;p&gt;项目地址：&lt;a href=&quot;https://github.com/kkkgo/DSM_Login_BingWallpaper&quot; target=&quot;_blank&quot;&gt;https://github.com/kkkgo/DSM_Login_BingWallpaper&lt;/a&gt;&lt;/p&gt;
&lt;section&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;此脚本支持的群晖版本：DSM5.x,DSM6.x; 可能不支持 DSM7.x&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;群晖自动更换壁纸1.png&quot; loading=&quot;lazy&quot; width=&quot;1351&quot; height=&quot;648&quot; src=&quot;/_astro/2538_2619383506_735f40.pfH43POp_2hiVgd.webp&quot; srcset=&quot;/_astro/2538_2619383506_735f40.pfH43POp_b8EOC.webp 640w, /_astro/2538_2619383506_735f40.pfH43POp_VOTXD.webp 750w, /_astro/2538_2619383506_735f40.pfH43POp_Z13r8rO.webp 828w, /_astro/2538_2619383506_735f40.pfH43POp_1ApfEh.webp 1080w, /_astro/2538_2619383506_735f40.pfH43POp_2epnuj.webp 1280w, /_astro/2538_2619383506_735f40.pfH43POp_2hiVgd.webp 1351w&quot; /&gt;&lt;figcaption&gt;群晖自动更换壁纸1.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;群晖自动更换壁纸2.png&quot; loading=&quot;lazy&quot; width=&quot;1347&quot; height=&quot;648&quot; src=&quot;/_astro/2538_1191252551_f42e70.H5yTSsHt_Z2uuqtM.webp&quot; srcset=&quot;/_astro/2538_1191252551_f42e70.H5yTSsHt_ZBPKR8.webp 640w, /_astro/2538_1191252551_f42e70.H5yTSsHt_8PtgS.webp 750w, /_astro/2538_1191252551_f42e70.H5yTSsHt_Z1Qqz9z.webp 828w, /_astro/2538_1191252551_f42e70.H5yTSsHt_1rpRqS.webp 1080w, /_astro/2538_1191252551_f42e70.H5yTSsHt_Z27gVrb.webp 1280w, /_astro/2538_1191252551_f42e70.H5yTSsHt_Z2uuqtM.webp 1347w&quot; /&gt;&lt;figcaption&gt;群晖自动更换壁纸2.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;群晖自动更换壁纸3.png&quot; loading=&quot;lazy&quot; width=&quot;1361&quot; height=&quot;651&quot; src=&quot;/_astro/2538_4173514177_aef833.nsP7_I86_HOKHN.webp&quot; srcset=&quot;/_astro/2538_4173514177_aef833.nsP7_I86_17b7zO.webp 640w, /_astro/2538_4173514177_aef833.nsP7_I86_2oBNy7.webp 750w, /_astro/2538_4173514177_aef833.nsP7_I86_Z7oFGC.webp 828w, /_astro/2538_4173514177_aef833.nsP7_I86_4sudL.webp 1080w, /_astro/2538_4173514177_aef833.nsP7_I86_veWxE.webp 1280w, /_astro/2538_4173514177_aef833.nsP7_I86_HOKHN.webp 1361w&quot; /&gt;&lt;figcaption&gt;群晖自动更换壁纸3.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&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;因为我确实比较懒，此教程全部通过ssh完成。所以你需要确保已经完成了下面的准备：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;开启了&lt;code&gt;ssh&lt;/code&gt;功能，使用 &lt;code&gt;sudo -i&lt;/code&gt; 切换至&lt;code&gt;root&lt;/code&gt;用户运行；&lt;/li&gt;
&lt;li&gt;了解如何在群晖中编辑&lt;code&gt;crontab&lt;/code&gt;配置定时任务；参考文章 -&amp;gt; &lt;a href=&quot;https://blog.moewah.com/posts/1112/&quot;&gt;传送门&lt;/a&gt;&lt;/li&gt;
&lt;li&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;strong&gt;桌面&lt;/strong&gt; ，勾选&lt;strong&gt;自定义壁纸&lt;/strong&gt; 。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&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;ssh&lt;/code&gt;并切换到&lt;code&gt;root&lt;/code&gt;用户，执行下面命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#创建一个目录存放脚本&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir -p /volume1/wallpaper&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#下载脚本到刚创建的目录中&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget --no-check-certificate -P /volume1/wallpaper https://raw.githubusercontent.com/kkkgo/DSM_Login_BingWallpaper/master/ChangeBing.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#赋执行权限&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod +x /volume1/wallpaper/ChangeBing.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 执行脚本&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;bash /volume1/wallpaper/ChangeBing.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;此时，输入群晖后台登录地址，按&lt;strong&gt;Ctrl+F5&lt;/strong&gt; 刷新一下页面即可。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;nano&lt;/code&gt;或者 &lt;code&gt;vim&lt;/code&gt; 命令编辑 &lt;code&gt;/etc/crontab&lt;/code&gt; 文件，增加：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;0 7 * * * root /volume1/wallpaper/ChangeBing.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#表示将在每日7点整执行自动更换壁纸的定时任务&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;重启群晖的 crontab 服务使之生效：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;synoservice --restart crond&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;可能会出现重启群晖的时候crontab服务不启动的问题，若存在此问题，请使用 &lt;code&gt;root&lt;/code&gt; 用户运行 &lt;code&gt;vim /etc/rc&lt;/code&gt; 在 &lt;code&gt;exit 0&lt;/code&gt; 前添加一行 &lt;code&gt;synoservice --start crond&lt;/code&gt; 设置为开机启动。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>U盘安装Proxmox VE图文教程</title><link>https://blog.moewah.com/posts/2497/</link><guid isPermaLink="true">https://blog.moewah.com/posts/2497/</guid><description>如何用U盘安装Proxmox VE？本文详细讲解从下载ISO到写入镜像再到系统安装的全流程，包含Etcher和Rufus工具使用技巧，助你快速部署PVE虚拟化环境。</description><pubDate>Mon, 22 Jul 2019 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;ProXmoX VE 介绍&lt;a href=&quot;#proxmox-ve-介绍&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Proxmox VE是一款套开源的虚拟化管理软件，用户可通过网页的方式来管理服务器上使用 kvm 以及 lxc 技术运行的虚拟机。同时提供了一些先进功能的支持，如集群、HA等。PVE虽然是开源，却是由一个商业公司在运营、更新以及维护。&lt;/p&gt;&lt;p&gt;Proxmox VE（以下简称PVE）的安装方式有2种，第一种是先装Debian再添加proxmox的安装源来安装，第二种是直接下载PVE的ISO直接安装。本文主要以第二种直接安装方式来讲讲如何安装PVE。&lt;/p&gt;&lt;/section&gt;
&lt;section&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、下载U盘写盘软件：&lt;/p&gt;&lt;p&gt;可选择&lt;a href=&quot;https://www.balena.io/etcher/&quot; target=&quot;_blank&quot;&gt;Etcher&lt;/a&gt; 或者 &lt;a href=&quot;https://rufus.ie/&quot; target=&quot;_blank&quot;&gt;Rufus&lt;/a&gt;&lt;/p&gt;&lt;p&gt;2、下载PVE ISO文件&lt;/p&gt;&lt;p&gt;官方网站下载地址：&lt;a href=&quot;https://www.proxmox.com/en/downloads&quot; target=&quot;_blank&quot;&gt;https://www.proxmox.com/en/downloads&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&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、U盘插入电脑并打开写盘软件（请确保U盘里没有总要数据，因写盘会擦拭掉U盘原有数据）&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;007vCXfGly1g0g5dhi4vzj306d05hgln.jpg&quot; loading=&quot;lazy&quot; width=&quot;229&quot; height=&quot;197&quot; src=&quot;/_astro/2497_1550981260_793318.HmNjewp9_tc0U6.webp&quot; srcset=&quot;/_astro/2497_1550981260_793318.HmNjewp9_tc0U6.webp 229w&quot; /&gt;&lt;figcaption&gt;007vCXfGly1g0g5dhi4vzj306d05hgln.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;2、选择刚刚下载好的PVE镜像文件并点击开始&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;007vCXfGly1g0g5jxt9etj30bm0ey74y.jpg&quot; loading=&quot;lazy&quot; width=&quot;418&quot; height=&quot;538&quot; src=&quot;/_astro/2497_4029970322_aa72e1.WHqGvQj8_2ffoVL.webp&quot; srcset=&quot;/_astro/2497_4029970322_aa72e1.WHqGvQj8_2ffoVL.webp 418w&quot; /&gt;&lt;figcaption&gt;007vCXfGly1g0g5jxt9etj30bm0ey74y.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;3、点击开始后会提示 检测到 ISOHybrid 镜像，此时务必选择【以 DD 镜像 模式写入】，否则U盘无法安装PVE。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;007vCXfGly1g0g5m7j72qj30f807hq3i.jpg&quot; loading=&quot;lazy&quot; width=&quot;548&quot; height=&quot;269&quot; src=&quot;/_astro/2497_3342319383_18a20b.DfhnREte_2nMEyV.webp&quot; srcset=&quot;/_astro/2497_3342319383_18a20b.DfhnREte_2nMEyV.webp 548w&quot; /&gt;&lt;figcaption&gt;007vCXfGly1g0g5m7j72qj30f807hq3i.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;后续还会有警告提示，直接确定即可。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;007vCXfGly1g0g5nyp3s6j30bs04nmx5.jpg&quot; loading=&quot;lazy&quot; width=&quot;424&quot; height=&quot;167&quot; src=&quot;/_astro/2497_825551063_15c414.BUxxQLdi_ZXwStr.webp&quot; srcset=&quot;/_astro/2497_825551063_15c414.BUxxQLdi_ZXwStr.webp 424w&quot; /&gt;&lt;figcaption&gt;007vCXfGly1g0g5nyp3s6j30bs04nmx5.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;007vCXfGly1g0g5o7d4t7j30d505j74d.jpg&quot; loading=&quot;lazy&quot; width=&quot;473&quot; height=&quot;199&quot; src=&quot;/_astro/2497_4193185256_e6dcd3.DI-7SYzL_khe6I.webp&quot; srcset=&quot;/_astro/2497_4193185256_e6dcd3.DI-7SYzL_khe6I.webp 473w&quot; /&gt;&lt;figcaption&gt;007vCXfGly1g0g5o7d4t7j30d505j74d.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;接下来，等待镜像写入&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;007vCXfGly1g0g5rwbut6j30bm0eygm9.jpg&quot; loading=&quot;lazy&quot; width=&quot;418&quot; height=&quot;538&quot; src=&quot;/_astro/2497_915924677_6bf9fc.hBua9iHZ_Z1sbOu5.webp&quot; srcset=&quot;/_astro/2497_915924677_6bf9fc.hBua9iHZ_Z1sbOu5.webp 418w&quot; /&gt;&lt;figcaption&gt;007vCXfGly1g0g5rwbut6j30bm0eygm9.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;4、镜像写入完毕，点击关闭。至此，PVE的安装U盘已制作完成。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;007vCXfGly1g0g5un05duj30bm0eyjs2.jpg&quot; loading=&quot;lazy&quot; width=&quot;418&quot; height=&quot;538&quot; src=&quot;/_astro/2497_4098827659_cec530.Cg-4bag0_1oa1h6.webp&quot; srcset=&quot;/_astro/2497_4098827659_cec530.Cg-4bag0_1oa1h6.webp 418w&quot; /&gt;&lt;figcaption&gt;007vCXfGly1g0g5un05duj30bm0eyjs2.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三、PVE安装过程&lt;a href=&quot;#三pve安装过程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;1、进入ISO启动，选择“Install Proxmox VE”&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;007vCXfGly1g0g6hrt3xwj30hs0b4dgd.jpg&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;400&quot; src=&quot;/_astro/2497_3376050554_17102f.DWXhao7p_Z1B97Iw.webp&quot; srcset=&quot;/_astro/2497_3376050554_17102f.DWXhao7p_Z1B97Iw.webp 640w&quot; /&gt;&lt;figcaption&gt;007vCXfGly1g0g6hrt3xwj30hs0b4dgd.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;2、自检画面，等待几秒&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;007vCXfGly1g0g6gmiqwrj30sg0evwfb.jpg&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;535&quot; src=&quot;/_astro/2497_3490691980_bb7b60.DrT-YZ4n_Z1eDzGE.webp&quot; srcset=&quot;/_astro/2497_3490691980_bb7b60.DrT-YZ4n_1VeAid.webp 640w, /_astro/2497_3490691980_bb7b60.DrT-YZ4n_Z21hfcu.webp 750w, /_astro/2497_3490691980_bb7b60.DrT-YZ4n_1Y3SUd.webp 828w, /_astro/2497_3490691980_bb7b60.DrT-YZ4n_Z1eDzGE.webp 1024w&quot; /&gt;&lt;figcaption&gt;007vCXfGly1g0g6gmiqwrj30sg0evwfb.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;3、同意协议，点击“I agree”&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;007vCXfGly1g0g6jbyhp7j30sg0lcte7.jpg&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;768&quot; src=&quot;/_astro/2497_3259658239_d36ccf.pJQV_NiP_nTQ7E.webp&quot; srcset=&quot;/_astro/2497_3259658239_d36ccf.pJQV_NiP_2mqKCv.webp 640w, /_astro/2497_3259658239_d36ccf.pJQV_NiP_Z1H8SLw.webp 750w, /_astro/2497_3259658239_d36ccf.pJQV_NiP_Z1zGKM0.webp 828w, /_astro/2497_3259658239_d36ccf.pJQV_NiP_nTQ7E.webp 1024w&quot; /&gt;&lt;figcaption&gt;007vCXfGly1g0g6jbyhp7j30sg0lcte7.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;4、选择硬盘，点击“Next”&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;007vCXfGly1g0g6ovfrijj30sg0lcaeg.jpg&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;768&quot; src=&quot;/_astro/2497_3003310315_411b7c.DAHO9sEa_2ksIld.webp&quot; srcset=&quot;/_astro/2497_3003310315_411b7c.DAHO9sEa_2gfEbK.webp 640w, /_astro/2497_3003310315_411b7c.DAHO9sEa_Z1Nk0dh.webp 750w, /_astro/2497_3003310315_411b7c.DAHO9sEa_Z1FRRdK.webp 828w, /_astro/2497_3003310315_411b7c.DAHO9sEa_2ksIld.webp 1024w&quot; /&gt;&lt;figcaption&gt;007vCXfGly1g0g6ovfrijj30sg0lcaeg.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;如需自定义硬盘空间，点击“Options”&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;007vCXfGly1g0g6qrfir3j30sg0lcgq0.jpg&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;768&quot; src=&quot;/_astro/2497_2429663492_f7fa12.L-UR-ttC_1bPOcG.webp&quot; srcset=&quot;/_astro/2497_2429663492_f7fa12.L-UR-ttC_pVlv9.webp 640w, /_astro/2497_2429663492_f7fa12.L-UR-ttC_1qxOU3.webp 750w, /_astro/2497_2429663492_f7fa12.L-UR-ttC_1xYWTz.webp 828w, /_astro/2497_2429663492_f7fa12.L-UR-ttC_1bPOcG.webp 1024w&quot; /&gt;&lt;figcaption&gt;007vCXfGly1g0g6qrfir3j30sg0lcgq0.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Options 里的设置，根据需求自行斟酌选填，完成后点击“OK”&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;007vCXfGly1g0g7bq1a1xj30sg0lc0w4.jpg&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;768&quot; src=&quot;/_astro/2497_309377989_ab36c1.0SeiP77__ZJlNKH.webp&quot; srcset=&quot;/_astro/2497_309377989_ab36c1.0SeiP77__Z176ePR.webp 640w, /_astro/2497_309377989_ab36c1.0SeiP77__1AXRMB.webp 750w, /_astro/2497_309377989_ab36c1.0SeiP77__oFEbd.webp 828w, /_astro/2497_309377989_ab36c1.0SeiP77__ZJlNKH.webp 1024w&quot; /&gt;&lt;figcaption&gt;007vCXfGly1g0g7bq1a1xj30sg0lc0w4.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;5、设定国家、时区和键盘，Country输入China即可，点击“Next”&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;007vCXfGly1g0g7dn6qzfj30sg0lc0wy.jpg&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;768&quot; src=&quot;/_astro/2497_2839304422_bde328.DfyoozTI_Ze8NYn.webp&quot; srcset=&quot;/_astro/2497_2839304422_bde328.DfyoozTI_Z15UlEN.webp 640w, /_astro/2497_2839304422_bde328.DfyoozTI_Z5iRfT.webp 750w, /_astro/2497_2839304422_bde328.DfyoozTI_28fIC.webp 828w, /_astro/2497_2839304422_bde328.DfyoozTI_Ze8NYn.webp 1024w&quot; /&gt;&lt;figcaption&gt;007vCXfGly1g0g7dn6qzfj30sg0lc0wy.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;6、设置管理员root账号密码和邮箱&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;007vCXfGly1g0g7fhty1dj30sg0lcq76.jpg&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;768&quot; src=&quot;/_astro/2497_4249182310_032752.BYu2VYyA_z8diX.webp&quot; srcset=&quot;/_astro/2497_4249182310_032752.BYu2VYyA_1dK603.webp 640w, /_astro/2497_4249182310_032752.BYu2VYyA_2emzoW.webp 750w, /_astro/2497_4249182310_032752.BYu2VYyA_2lNHot.webp 828w, /_astro/2497_4249182310_032752.BYu2VYyA_z8diX.webp 1024w&quot; /&gt;&lt;figcaption&gt;007vCXfGly1g0g7fhty1dj30sg0lcq76.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;7、设定主机名，IP，网关，掩码和DNS，点击“Next”&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;007vCXfGly1g0g7lk66a7j30sg0lc798.jpg&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;768&quot; src=&quot;/_astro/2497_395529457_7bb60c.D42voMQJ_1cSHjQ.webp&quot; srcset=&quot;/_astro/2497_395529457_7bb60c.D42voMQJ_14Ovcx.webp 640w, /_astro/2497_395529457_7bb60c.D42voMQJ_Z1hhuWU.webp 750w, /_astro/2497_395529457_7bb60c.D42voMQJ_Z2tzIzj.webp 828w, /_astro/2497_395529457_7bb60c.D42voMQJ_1cSHjQ.webp 1024w&quot; /&gt;&lt;figcaption&gt;007vCXfGly1g0g7lk66a7j30sg0lc798.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;8、安装中，等待几分钟&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;007vCXfGly1g0g7rd9gh5j30sg0lcae8.jpg&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;768&quot; src=&quot;/_astro/2497_1952304451_557ca3.BtidMBU9_Z7Tt6g.webp&quot; srcset=&quot;/_astro/2497_1952304451_557ca3.BtidMBU9_ZUHGlH.webp 640w, /_astro/2497_1952304451_557ca3.BtidMBU9_4SM3c.webp 750w, /_astro/2497_1952304451_557ca3.BtidMBU9_ckU2I.webp 828w, /_astro/2497_1952304451_557ca3.BtidMBU9_Z7Tt6g.webp 1024w&quot; /&gt;&lt;figcaption&gt;007vCXfGly1g0g7rd9gh5j30sg0lcae8.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;9、安装完提示重启，点击“Reboot”（点击前请先拔掉U盘）&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;007vCXfGly1g0g7uitmdsj30sg0lcadj.jpg&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;768&quot; src=&quot;/_astro/2497_1933176945_15aaa6.BH-bmHW6_rUndw.webp&quot; srcset=&quot;/_astro/2497_1933176945_15aaa6.BH-bmHW6_Z14yz30.webp 640w, /_astro/2497_1933176945_15aaa6.BH-bmHW6_Z3W5D6.webp 750w, /_astro/2497_1933176945_15aaa6.BH-bmHW6_3u2lq.webp 828w, /_astro/2497_1933176945_15aaa6.BH-bmHW6_rUndw.webp 1024w&quot; /&gt;&lt;figcaption&gt;007vCXfGly1g0g7uitmdsj30sg0lcadj.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;10、启动选项，默认5S，从硬盘启动PVE&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;007vCXfGly1g0g7v30wx0j30hs0dcdg0.jpg&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;480&quot; src=&quot;/_astro/2497_224928944_24f0fb.DUpoy1uW_ZbciLz.webp&quot; srcset=&quot;/_astro/2497_224928944_24f0fb.DUpoy1uW_ZbciLz.webp 640w&quot; /&gt;&lt;figcaption&gt;007vCXfGly1g0g7v30wx0j30hs0dcdg0.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;11、启动完成后的控制台，会提示控制台访问URL&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;007vCXfGly1g0g7vye97jj30m80gomx9.jpg&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;600&quot; src=&quot;/_astro/2497_2143242020_07af34.Dl0RJp-N_1myoDL.webp&quot; srcset=&quot;/_astro/2497_2143242020_07af34.Dl0RJp-N_Z1qFdnJ.webp 640w, /_astro/2497_2143242020_07af34.Dl0RJp-N_1hoTfJ.webp 750w, /_astro/2497_2143242020_07af34.Dl0RJp-N_1myoDL.webp 800w&quot; /&gt;&lt;figcaption&gt;007vCXfGly1g0g7vye97jj30m80gomx9.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;12、输入URL &lt;a href=&quot;https://192.168.1.2:8006/&quot; target=&quot;_blank&quot;&gt;https://192.168.1.2:8006&lt;/a&gt; （如输入 http:// 或 后面没有加上端口 :8006 ，则无法访问 ）&lt;/p&gt;&lt;p&gt;语言可以选择中文，对于中文支持不错&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;007vCXfGly1g0g81s60t3j30uj0llgnh.jpg&quot; loading=&quot;lazy&quot; width=&quot;1099&quot; height=&quot;777&quot; src=&quot;/_astro/2497_495850289_b18153.B8AAENko_Z1gVddW.webp&quot; srcset=&quot;/_astro/2497_495850289_b18153.B8AAENko_ZwKfSG.webp 640w, /_astro/2497_495850289_b18153.B8AAENko_ZrtErx.webp 750w, /_astro/2497_495850289_b18153.B8AAENko_Z1zs22M.webp 828w, /_astro/2497_495850289_b18153.B8AAENko_ZHXOJb.webp 1080w, /_astro/2497_495850289_b18153.B8AAENko_Z1gVddW.webp 1099w&quot; /&gt;&lt;figcaption&gt;007vCXfGly1g0g81s60t3j30uj0llgnh.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;切换成中文后，输入用户名 root，密码 ，即可访问&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;007vCXfGly1g0g8332e3rj30uj0ll0u1.jpg&quot; loading=&quot;lazy&quot; width=&quot;1099&quot; height=&quot;777&quot; src=&quot;/_astro/2497_2529988376_6076de.CBWy8Vlf_1J7TL4.webp&quot; srcset=&quot;/_astro/2497_2529988376_6076de.CBWy8Vlf_WRkMr.webp 640w, /_astro/2497_2529988376_6076de.CBWy8Vlf_1BuL28.webp 750w, /_astro/2497_2529988376_6076de.CBWy8Vlf_Z199NcH.webp 828w, /_astro/2497_2529988376_6076de.CBWy8Vlf_Z1Wgqy.webp 1080w, /_astro/2497_2529988376_6076de.CBWy8Vlf_1J7TL4.webp 1099w&quot; /&gt;&lt;figcaption&gt;007vCXfGly1g0g8332e3rj30uj0ll0u1.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;正常登录（每次登录）后会有一个 有效订阅 的提示&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;007vCXfGly1g0g84rg4m1j30uj0lltan.jpg&quot; loading=&quot;lazy&quot; width=&quot;1099&quot; height=&quot;777&quot; src=&quot;/_astro/2497_4059545463_68156e.Dr6FtVj6_Z1Df2Yg.webp&quot; srcset=&quot;/_astro/2497_4059545463_68156e.Dr6FtVj6_ZrOSda.webp 640w, /_astro/2497_4059545463_68156e.Dr6FtVj6_bMx1w.webp 750w, /_astro/2497_4059545463_68156e.Dr6FtVj6_2vk6AC.webp 828w, /_astro/2497_4059545463_68156e.Dr6FtVj6_1EQTC3.webp 1080w, /_astro/2497_4059545463_68156e.Dr6FtVj6_Z1Df2Yg.webp 1099w&quot; /&gt;&lt;figcaption&gt;007vCXfGly1g0g84rg4m1j30uj0lltan.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;13、进入PVE UI的截图&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;007vCXfGly1g0g871r51ej30u80nfabu.jpg&quot; loading=&quot;lazy&quot; width=&quot;1088&quot; height=&quot;843&quot; src=&quot;/_astro/2497_2465832579_95452e.D_AaxkjW_1hO3Os.webp&quot; srcset=&quot;/_astro/2497_2465832579_95452e.D_AaxkjW_2q5b48.webp 640w, /_astro/2497_2465832579_95452e.D_AaxkjW_Z10p4kv.webp 750w, /_astro/2497_2465832579_95452e.D_AaxkjW_Z1FNJ0r.webp 828w, /_astro/2497_2465832579_95452e.D_AaxkjW_WqIjT.webp 1080w, /_astro/2497_2465832579_95452e.D_AaxkjW_1hO3Os.webp 1088w&quot; /&gt;&lt;figcaption&gt;007vCXfGly1g0g871r51ej30u80nfabu.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;至此，U盘安装PVE完毕。如需设置添加虚拟机可参考站内其它文章&lt;a href=&quot;https://blog.moewah.com/posts/3643/&quot;&gt;《Proxmox VE 虚拟机安装 OpenWrt 配置旁路由教程》&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Linux VPS 系统精简优化实战指南</title><link>https://blog.moewah.com/posts/2407/</link><guid isPermaLink="true">https://blog.moewah.com/posts/2407/</guid><description>如何让CentOS和Debian系统更轻量高效？本文详细拆解VPS系统精简优化流程，从移除冗余软件到清理缓存文件，帮助用户降低系统资源占用，提升服务器性能和响应速度。</description><pubDate>Fri, 19 Jul 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt; 在安装Linux系统前我们需要顾虑到电脑硬件性能，选择最小化安装非常有必要，毕竟服务器资源一定的情况下，系统只会日益臃肿慢慢开始拖慢所有服务，这些因素在我们安装系统前就应该考虑的，分析哪些是服务器必需和非必需从而尽可能的精简系统。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;linux-debian-centos.jpg&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;384&quot; src=&quot;/_astro/2407_1257402367_376d7b.BKS8HvRT_Z1Wu5t1.webp&quot; srcset=&quot;/_astro/2407_1257402367_376d7b.BKS8HvRT_ZSCukQ.webp 640w, /_astro/2407_1257402367_376d7b.BKS8HvRT_ZXfjHn.webp 750w, /_astro/2407_1257402367_376d7b.BKS8HvRT_ZhDkpC.webp 828w, /_astro/2407_1257402367_376d7b.BKS8HvRT_Z1Wu5t1.webp 1024w&quot; /&gt;&lt;figcaption&gt;linux-debian-centos.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;提示：&lt;/strong&gt; 请在刚装好的系统中执行操作，而不是在已经运行网站的服务器中优化机器，以免出现机器问题。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;Debian系统精简优化&lt;a href=&quot;#debian系统精简优化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;升级Debian系统&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt-get update&amp;amp;&amp;amp;apt-get upgrade&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;移除多余的软件&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt-get -y purge apache2-* bind9-* xinetd samba-* nscd-* portmap sendmail-* sasl2-bin&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;对于这些被移除软件的说明：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apache2-* //apache服务器,一般我们自己会用一键安装包安装&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;bind9-* //我们不需要用VPS搭建DNS,所以去掉&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;xinetd //xinetd是服务守护进程&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;samba-* //samba能让linux使用windows共享功能，不需要&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nscd-* //DNS缓存软件，同bind9，不需要&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;portmap //端口转发，一般Web服务器不需要&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sendmail-* //发送邮件用，如果有需要保留&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sasl2-bin //一个权限程序，占用资源，删除&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;删除多余组件&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt-get -y purge lynx memtester unixodbc python-* odbcinst-* sudo tcpdump ttf-*&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;清理缓存文件&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt-get autoremove &amp;amp;&amp;amp; apt-get clean&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;通过上述4步，就可以完成对debian系统的精简优化。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;CentOS  系统精简优化&lt;a href=&quot;#centos--系统精简优化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;删除不必要的自带软件包&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum remove Deployment_Guide-en-US finger cups-libs cups ypbind&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum remove bluez-libs desktop-file-utils ppp rp-pppoe wireless-tools irda-utils&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum remove sendmail* samba* talk-server finger-server bind* xinetd&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum remove nfs-utils nfs-utils-lib rdate fetchmail eject ksh mkbootdisk mtools&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum remove syslinux tcsh startup-notification talk apmd rmt dump setserial portmap yp-tools&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum groupremove &quot;Mail Server&quot; &quot;Games and Entertainment&quot; &quot;X Window System&quot; &quot;X Software Development&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum groupremove &quot;Development Libraries&quot; &quot;Dialup Networking Support&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum groupremove &quot;Games and Entertainment&quot; &quot;Sound and Video&quot; &quot;Graphics&quot; &quot;Editors&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum groupremove &quot;Text-based Internet&quot; &quot;GNOME Desktop Environment&quot; &quot;GNOME Software Development&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;升级centos系统&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum update #更新系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum clean all #清理全部缓存文件&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;禁用seLinux&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sestatus #先执行看seLinux状态，如果不是disabled，就需要执行下面步骤，否则不要执行&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vi /etc/selinux/config&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;SELINUX=disabled #禁用SeLinux&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;SELINUX=enforcing #使用SeLinux&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;禁止IPV6（执行后需要reboot重启）&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vi /etc/modprobe.conf #打开文件，把下面两行加到最后&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;alias net-pf-10 off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;alias ipv6 off&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;初始化防火墙&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;touch /etc/sysconfig/iptables&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iptables -F&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iptables -X&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iptables -Z&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service iptables save&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service iptables restart&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#! /bin/bash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service acpid off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service atd stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service auditd stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service avahi-daemon stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service avahi-dnsconfd stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service bluetooth stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service conman stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service cpuspeed stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service cups stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service dnsmasq stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service dund stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service firstboot stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service hidd stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service httpd stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service ibmasm stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service ip6tables stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service irda stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service kdump stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service lm_sensors stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service mcstrans stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service messagebus stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service microcode_ctl stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service netconsole stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service netfs stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service netplugd stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service nfs stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service nfslock stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service nscd stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service ntpd stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service oddjobd stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service pand stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service pcscd stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service portmap stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service psacct stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service rdisc stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service restorecond stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service rpcgssd stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service rpcidmapd stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service rpcsvcgssd stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service saslauthd stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service sendmail stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service setroubleshoot stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service smb stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service vncserver stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service winbind stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service wpa_supplicant stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service xfs stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service ypbind stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service yum-updatesd stop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;51&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig acpid off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;52&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig atd off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;53&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig auditd off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;54&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig avahi-daemon off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;55&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig avahi-dnsconfd off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;56&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig bluetooth off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;57&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig conman off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;58&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig cpuspeed off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;59&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig cups off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;60&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig dnsmasq off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;61&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig dund off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;62&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig firstboot off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;63&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig hidd off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;64&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig httpd off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;65&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig ibmasm off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;66&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig ip6tables off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;67&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig irda off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;68&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig kdump off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;69&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig lm_sensors off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;70&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig mcstrans off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;71&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig messagebus off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;72&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig microcode_ctl off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;73&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig netconsole off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;74&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig netfs off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;75&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig netplugd off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;76&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig nfs off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;77&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig nfslock off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;78&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig nscd off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;79&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig ntpd off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;80&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig oddjobd off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;81&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig pand off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;82&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig pcscd off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;83&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig portmap off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;84&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig psacct off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;85&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig rdisc off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;86&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig restorecond off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;87&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig rpcgssd off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;88&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig rpcidmapd off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;89&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig rpcsvcgssd off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;90&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig saslauthd off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;91&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig sendmail off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;92&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig setroubleshoot off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;93&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig smb off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;94&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig vncserver off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;95&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig winbind off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;96&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig wpa_supplicant off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;97&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig xfs off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;98&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig ypbind off&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;99&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig yum-updatesd off&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这样通过上述6步骤，就可以完成对centos精简和优化。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>禁止百度搜索引擎收录的终极解决方案</title><link>https://blog.moewah.com/posts/2351/</link><guid isPermaLink="true">https://blog.moewah.com/posts/2351/</guid><description>如何彻底阻止百度等搜索引擎收录网站？本文提供通过Nginx配置屏蔽特定user_agent的实战方法，有效防止二级站抢夺主站排名，确保SEO权重不被分散。</description><pubDate>Wed, 17 Jul 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt; 虽然建设网站的目的大部分是为了优化搜索引擎排名，实现互联网营销，但特殊情况下，仍会遇到“不希望搜索引擎收录”的需求，例如因为一些原因做了一个内容与主站几乎相同的二级站，但因为内容高度相似，百度关键词排名一部分给了二级站，影响了主站点的排名，这个时候就有这个必要斩断百度的收录。这里给出一个能有效禁止百度等搜索引擎收录的解决方案。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;搜索引擎.png&quot; loading=&quot;lazy&quot; width=&quot;860&quot; height=&quot;400&quot; src=&quot;/_astro/2351_2739558786_2fb51f.BNi2HwLb_sHMtq.webp&quot; srcset=&quot;/_astro/2351_2739558786_2fb51f.BNi2HwLb_IIpo2.webp 640w, /_astro/2351_2739558786_2fb51f.BNi2HwLb_ZQObqj.webp 750w, /_astro/2351_2739558786_2fb51f.BNi2HwLb_2kGVru.webp 828w, /_astro/2351_2739558786_2fb51f.BNi2HwLb_sHMtq.webp 860w&quot; /&gt;&lt;figcaption&gt;搜索引擎.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一、Robots.txt只能禁止抓取，无法禁止收录&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;很多人认为在robots.txt中禁止百度蜘蛛爬取就等于禁止收录，这是严重的误解。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;robots-txt-defined.png&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;600&quot; src=&quot;/_astro/2351_558377557_56f553.COKMFpFb_Z1IhpqP.webp&quot; srcset=&quot;/_astro/2351_558377557_56f553.COKMFpFb_1AG5DD.webp 640w, /_astro/2351_558377557_56f553.COKMFpFb_Z1Gsbwk.webp 750w, /_astro/2351_558377557_56f553.COKMFpFb_Z13g1lN.webp 828w, /_astro/2351_558377557_56f553.COKMFpFb_Z1IhpqP.webp 900w&quot; /&gt;&lt;figcaption&gt;robots-txt-defined.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;robots.txt文件可以告诉搜索引擎哪些目录和文件可以抓取，哪些不可以。经过实践发现，即使禁止搜索引擎抓取根目录，robots文件也并不能实现禁止百度等搜索引擎收录。&lt;/p&gt;
&lt;p&gt;如果一个网站的外链较多，基本上无法通过正常手段禁止百度收录，淘宝便是一个典型的案例（淘宝的robots.txt设置为禁止抓取根目录，但首页依然被收录）。关于robots.txt的作用、文件格式、使用方法，可参考&amp;gt;&amp;gt;&lt;a href=&quot;http://ziyuan.baidu.com/college/courseinfo?id=267&amp;amp;page=12&quot; target=&quot;_blank&quot;&gt;百度站长平台的说明&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;二、通过Nginx判断user_agent禁止百度等搜索引擎访问，实现禁止收录&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;既然不能直接禁止抓取，那就干脆禁止百度蜘蛛等搜索引擎访问，思路是：判断&lt;code&gt;user_agent&lt;/code&gt;，如果是百度蜘蛛、谷歌机器人等搜索引擎的&lt;code&gt;user_agent&lt;/code&gt;，就返回403或者404，这样百度等搜索引擎就会认为这个网站无法打开或者不存在，自然也就不会收录了。&lt;/p&gt;
&lt;p&gt;其实之前也写过类似的文章&lt;a href=&quot;https://blog.moewah.com/posts/12/&quot;&gt;《Apache/Nginx/PHP 屏蔽垃圾 UA 爬虫的方法》&lt;/a&gt;可以参考一下&lt;/p&gt;
&lt;p&gt;这里Nginx的配置代码如下：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;if ($http_user_agent ~* &quot;qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot&quot;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return 403;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;通过&lt;code&gt;curl&lt;/code&gt;模拟搜索引擎抓取，测试以上代码有效，并在多次项目实践中验证了此方法的可行性，实现了彻底禁止百度收录！&lt;/p&gt;</content:encoded></item><item><title>Netch：开源游戏加速器实测体验</title><link>https://blog.moewah.com/posts/2299/</link><guid isPermaLink="true">https://blog.moewah.com/posts/2299/</guid><description>Netch是什么？这款开源游戏加速工具支持Socks5、V2等协议，无需复杂IP规则即可实现进程级加速，UDP NAT FullCone功能还能解决NAT类型问题，适合追求高性价比的游戏玩家。</description><pubDate>Fri, 12 Jul 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt;&lt;code&gt;Netch&lt;/code&gt;是近期一款开源的网络游戏加速器，支持Socks5、55R、V2等协议，UDP NAT FullCone及指定进程加速不需要难维护的IP规则，功能上和SSTAP差不太多；不过听说加速体验效果比后者要更好，甚至堪比一些付费的加速器，当然前提需要你的线路给力，不然加速就没意义了，这里就分享下，具体效果就需要自行体验了。&lt;/p&gt;
&lt;section&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;Github地址：&lt;/strong&gt; &lt;a href=&quot;https://github.com/netchx/Netch&quot; target=&quot;_blank&quot;&gt;https://github.com/netchx/Netch&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;下载地址：&lt;/strong&gt; &lt;a href=&quot;https://github.com/netchx/Netch/releases&quot; target=&quot;_blank&quot;&gt;https://github.com/netchx/Netch/releases&lt;/a&gt;&lt;/p&gt;&lt;p&gt;这里就说下大概使用演示，由于博主没有下海外游戏，所以先拿国产的&lt;code&gt;世纪佳缘3&lt;/code&gt;来测试一下。&lt;/p&gt;&lt;p&gt;首先双击打开程序，添加好&lt;code&gt;55R&lt;/code&gt;等服务器或者添加订阅，然后点击快速创建模式。
&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Netch(1).png&quot; loading=&quot;lazy&quot; width=&quot;607&quot; height=&quot;202&quot; src=&quot;/_astro/2299_2297654436_bbe7e4.BeCggmzy_Z25mfXP.webp&quot; srcset=&quot;/_astro/2299_2297654436_bbe7e4.BeCggmzy_Z25mfXP.webp 607w&quot; /&gt;&lt;figcaption&gt;Netch(1).png&lt;/figcaption&gt;&lt;/figure&gt;
点击扫描，选择游戏安装包，会自动扫描所有的&lt;code&gt;exe&lt;/code&gt;程序，然后保存即可。
&lt;figure&gt;&lt;img alt=&quot;Netch(2).png&quot; loading=&quot;lazy&quot; width=&quot;351&quot; height=&quot;354&quot; src=&quot;/_astro/2299_707033238_606d12.COFXFkSu_Z2vsAId.webp&quot; srcset=&quot;/_astro/2299_707033238_606d12.COFXFkSu_Z2vsAId.webp 351w&quot; /&gt;&lt;figcaption&gt;Netch(2).png&lt;/figcaption&gt;&lt;/figure&gt;
最后选择节点启动加速即可。
&lt;figure&gt;&lt;img alt=&quot;Netch(3).png&quot; loading=&quot;lazy&quot; width=&quot;606&quot; height=&quot;205&quot; src=&quot;/_astro/2299_3344796011_a274b7.aXb06mkx_Z1PkeVO.webp&quot; srcset=&quot;/_astro/2299_3344796011_a274b7.aXb06mkx_Z1PkeVO.webp 606w&quot; /&gt;&lt;figcaption&gt;Netch(3).png&lt;/figcaption&gt;&lt;/figure&gt;
最后要补充的是&lt;code&gt;UDP NAT&lt;/code&gt;支持&lt;code&gt;FullCone&lt;/code&gt;的，能解决游戏&lt;code&gt;NAT&lt;/code&gt;类型严格的问题，至于更多的功能的话，只能等待作者慢慢添加了，效果自行测试。&lt;p&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Git 常用命令速查与使用详解</title><link>https://blog.moewah.com/posts/2292/</link><guid isPermaLink="true">https://blog.moewah.com/posts/2292/</guid><description>如何快速掌握Git常用命令？本文详细整理了Git配置、基础操作及版本控制核心流程，涵盖git add、commit、status等高频命令使用方法，助你高效管理代码版本。</description><pubDate>Thu, 11 Jul 2019 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;0x00 写在前面&lt;a href=&quot;#0x00-写在前面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;现在大部分的开发团队都以 Git 作为自己的版本控制工具，需要对 Git 的使用非常的熟悉。这篇文章中本人整理了自己在开发过程中经常使用到的 Git 命令，方便在偶尔忘记时速查。使用 GUI 工具的同学，也可以对照起来看看。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;常用 Git 命令使用教程.png&quot; loading=&quot;lazy&quot; width=&quot;2631&quot; height=&quot;3183&quot; src=&quot;/_astro/2292_717956322_78ae4d.n6OTTv7k_ZiHUkF.webp&quot; srcset=&quot;/_astro/2292_717956322_78ae4d.n6OTTv7k_Z1EWkRv.webp 640w, /_astro/2292_717956322_78ae4d.n6OTTv7k_ZwHJ0H.webp 750w, /_astro/2292_717956322_78ae4d.n6OTTv7k_1Cztxw.webp 828w, /_astro/2292_717956322_78ae4d.n6OTTv7k_Z2uYfYO.webp 1080w, /_astro/2292_717956322_78ae4d.n6OTTv7k_Z1T9Nh0.webp 1280w, /_astro/2292_717956322_78ae4d.n6OTTv7k_1OaM8q.webp 1668w, /_astro/2292_717956322_78ae4d.n6OTTv7k_1CA3kS.webp 2048w, /_astro/2292_717956322_78ae4d.n6OTTv7k_1kfJAW.webp 2560w, /_astro/2292_717956322_78ae4d.n6OTTv7k_ZiHUkF.webp 2631w&quot; /&gt;&lt;figcaption&gt;常用 Git 命令使用教程.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;0x01 Git 配置&lt;a href=&quot;#0x01-git-配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;1.1 在安装完成 Git 后，开始正式使用前，是需要有一些全局设置的，如用户名、邮箱。&lt;/p&gt;&lt;p&gt;设置的主要命令是 &lt;code&gt;git config&lt;/code&gt;:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git config --global user.name &quot;your name&quot;      // 设置全局用户名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git config --global user.email &quot;your email&quot;    // 设置邮箱&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;其中， &lt;code&gt;--global&lt;/code&gt; 指定为全局配置，不使用该参数，则为当前所在仓库配置。&lt;/p&gt;&lt;p&gt;1.2 除了用户名、邮箱之外，还有很多的配置可以用来自定义 Git，如：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git config --global color.ui true        // 让 Git 显示不同的颜色&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git config core.ignorecase true            // 让 Git 对仓库中的文件大小写敏感&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;1.3 查看所有的已经做出的配置：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git config -l&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;0x02 基础操作&lt;a href=&quot;#0x02-基础操作&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 创建 Git 版本库&lt;a href=&quot;#1-创建-git-版本库&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在本地创建 Git 版本库，需要使用 &lt;code&gt;git init&lt;/code&gt; 命令。&lt;/p&gt;&lt;p&gt;首先，你需要新建一个存放版本库的目录，然后进入到该目录所在路径，然后执行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git init&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后查看目录结构中，就可以看到包含有 &lt;code&gt;.git&lt;/code&gt; 子目录，这就说明创建版本库成功了。&lt;/p&gt;&lt;/section&gt;&lt;section&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;/p&gt;&lt;p&gt;2.1 将文件添加到暂存区，使用的是 &lt;code&gt;git add&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git add Readme.md        // 添加单个文件到暂存区&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git add .                // 将当前目录下所有修改添加到暂存区，除按照规则忽略的之外&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;注意：这边空文件夹是不会被添加到暂存区中的。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;2.2 将暂存区中的文件，提交到仓库中。需要使用 &lt;code&gt;git commit&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git commit        // 如果暂存区有文件，则将其中的文件提交到仓库&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git commit -m &apos;your comments&apos;         // 带评论提交，用于说明提交内容、变更、作用等&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;注意：这边直接用 &lt;code&gt;git commit&lt;/code&gt; 提交，会先弹出添加评论的页面。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&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;p&gt;不论我们是新建了文件，将文件加入暂存区，或者其他的修改等等，我们都可以通过：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git status&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;来随时查看仓库中文件的状态。这个应该是使用 Git 做版本控制过程中，我使用最多的一个命令。&lt;/p&gt;&lt;/section&gt;&lt;section&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;code&gt;git diff&lt;/code&gt; 来查看具体的修改内容。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git diff    // 查看版本库中所有的改动&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git diff Readme.md        // 查看具体文件的改动&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. 查看提交历史记录&lt;a href=&quot;#5-查看提交历史记录&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;有的时候，你会需要查看自己做过哪些提交，来回顾自己完成的部分。或者需要寻找某个具体的提交来查看当时的代码。这里需要用到：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git log     // 显示所有提交的历史记录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git log --pretty=oneline    // 单行显示提交历史记录的内容&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;在 &lt;code&gt;git log&lt;/code&gt; 的输出内容中，可以看到每次提交的 ID，是一个 40 位的字符串。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6. 版本回退&lt;a href=&quot;#6-版本回退&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;有了 &lt;code&gt;git log&lt;/code&gt; 来查看提交的历史记录，我们就可以通过 &lt;code&gt;git reset --hard&lt;/code&gt; 来回退到我们需要的特定版本，然后使用当时的代码进行各种操作。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git reset --hard HEAD^        // 回退到上一个提交版本&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git reset --hard HEAD^^        // 回退到上上一个提交版本&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git reset --hard &apos;commit_id&apos;    // 会退到 commit_id 指定的提交版本&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;7. 回到未来的某个提交&lt;a href=&quot;#7-回到未来的某个提交&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;当退回到某个提交的版本以后，再通过 &lt;code&gt;git log&lt;/code&gt; 是无法显示在这之后的提交信息的。但是，通过 &lt;code&gt;git reflog&lt;/code&gt; 可以获取到操作命令的历史。&lt;/p&gt;&lt;p&gt;因此，想要回到未来的某个提交，先通过 &lt;code&gt;git reflog&lt;/code&gt; 从历史命令中找到想要回到的提交版本的 ID，然后通过 &lt;code&gt;git reset --hard&lt;/code&gt; 来切换。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git reflog&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git reset --hard &apos;commit_id&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;8. 撤销修改&lt;a href=&quot;#8-撤销修改&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;撤销修改同样包括两方面的内容，由于仓库中的文件在提交之前，可能在工作区中，尚未在版本控制范围内，也可能在暂存区中。&lt;/p&gt;&lt;p&gt;8.1 丢弃工作区中文件的修改&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git checkout -- Readme.md    // 如果 Readme.md 文件在工作区，则丢弃其修改&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git checkout -- .            // 丢弃当前目录下所有工作区中文件的修改&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;注意： &lt;code&gt;git checkout --&lt;/code&gt; 中的 &lt;code&gt;--&lt;/code&gt; 是必须的。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;8.2 丢弃已经进入暂存区的修改&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git reset HEAD Readme.md // 将 Readme.md 恢复到 HEAD 提交版本的状态&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;9. 删除文件&lt;a href=&quot;#9-删除文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在文件未添加到暂存区之前，对想删除文件可以直接物理删除。或者通过 &lt;code&gt;git checkout -- file&lt;/code&gt; 来丢弃。如果文件已经被提交，则需要 &lt;code&gt;git rm&lt;/code&gt; 来删除：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git rm Readme.md // 删除已经被提交过的 Readme.md&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;注意： &lt;code&gt;git rm&lt;/code&gt; 只能删除已经提交到版本库中的文件。其他状态的文件直接用这个命令操作是出错的。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;0x03 分支管理&lt;a href=&quot;#0x03-分支管理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;分支是版本控制系统中很重要的一个概念，在 Git 中新建、合并等分支的操作非常轻量便捷，因此我们会很经常的用到。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;branches_.jpg&quot; loading=&quot;lazy&quot; width=&quot;779&quot; height=&quot;238&quot; src=&quot;/_astro/2292_2080097901_e044a6.D5GO0w4M_dptio.webp&quot; srcset=&quot;/_astro/2292_2080097901_e044a6.D5GO0w4M_2iuVh1.webp 640w, /_astro/2292_2080097901_e044a6.D5GO0w4M_ZpA83E.webp 750w, /_astro/2292_2080097901_e044a6.D5GO0w4M_dptio.webp 779w&quot; /&gt;&lt;figcaption&gt;branches_.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;section&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;code&gt;git branch&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git branch        // 查看本地分支信息&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git branch -v     // 查看相对详细的本地分支信息&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git branch -av     // 查看包括远程仓库在内的分支信息&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;注意：在 &lt;code&gt;git branch&lt;/code&gt; 的输出内容中，有一个分支，前面带有 &lt;code&gt;*&lt;/code&gt; 号，这标识我们当前所在的分支。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&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;当我们要修复一个 Bug，或者开发一个新特性，甚至是在初学的时候怕打乱原来的代码，都可以新建一个分支来避免对原来代码的影响。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git branch dev // 新建一个名称为 dev 的分支&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;p&gt;当我们创建完分支以后，我们需要切换到新建的分支，否则，所有的修改，还是在原来的分支上。事实上，所有的改动，只能影响到当前所在的分支。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git checkout dev // 新建完 dev 分支以后，通过该命令切换到 dev 分支&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git checkout -b dev // 新建 dev 分支，并切换到该分支上&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这个命令合并了前两个独立的命令，平常使用中一般这样使用。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. 合并分支&lt;a href=&quot;#5-合并分支&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;当我们修复完成一个 Bug，或者开发完成一个新特性，我们就会把相关的 Bug 或者 特性的上修改合并回原来的主分支上，这时候就需要 &lt;code&gt;git merge&lt;/code&gt; 来做分支的合并。&lt;/p&gt;&lt;p&gt;首先需要切换回最终要合并到的分支，如 &lt;code&gt;master&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git checkout master        // 切换回 master 分支&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git merge dev            // 将 dev 分钟中的修改合并回 master 分支&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;合并回主分支的时候，后面可能会面临到冲突的问题。冲突的解决暂不在这里说明。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6. 删除分支&lt;a href=&quot;#6-删除分支&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;当之前创建的分支，完成了它的使命，如 Bug 修复完，分支合并以后，这个分支就不在需要了，就可以删除它。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git branch -d dev // 删除 dev 分支&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;0x04 远程仓库&lt;a href=&quot;#0x04-远程仓库&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;figure&gt;&lt;img alt=&quot;remotes.jpg&quot; loading=&quot;lazy&quot; width=&quot;905&quot; height=&quot;275&quot; src=&quot;/_astro/2292_2052915719_e6745a.BZ81QuXM_vfBOW.webp&quot; srcset=&quot;/_astro/2292_2052915719_e6745a.BZ81QuXM_XsfLG.webp 640w, /_astro/2292_2052915719_e6745a.BZ81QuXM_NAW0E.webp 750w, /_astro/2292_2052915719_e6745a.BZ81QuXM_Qkcfj.webp 828w, /_astro/2292_2052915719_e6745a.BZ81QuXM_vfBOW.webp 905w&quot; /&gt;&lt;figcaption&gt;remotes.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;section&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;code&gt;git clone&lt;/code&gt;。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git clone https://github.com/git/git.git     // 通过 https 协议，克隆 Github 上 git 仓库的源码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git clone linfuyan@github.com/git/git.git    // 通过 ssh 协议，克隆 Github 上 git 仓库的源码&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;注意： &lt;code&gt;git clone&lt;/code&gt; 后面的仓库地址，可以支持多种协议，如 https， ssh 等。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&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;code&gt;git-guide&lt;/code&gt;，然后你打算将它发布到远程，供其他人协作。那么使用：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git remote add origin your_remote_git_repo // 为本地仓库添加远程仓库&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;p&gt;当本地仓库中，代码完成提交，就需要将代码等推送到远程仓库，这样其他协作人员可以从远程仓库同步内容。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git push -u origin master // 第一次推送时使用，可以简化后面的推送或者拉取命令使用&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git push origin master    // 将本地 master 分支推送到 origin 远程分支&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;注意： &lt;code&gt;git push -u origin master&lt;/code&gt;，第一次使用时，带上 &lt;code&gt;-u&lt;/code&gt; 参数，在将本地的 master 分支推送到远程新的 master 分支的同时，还会把本地的 master 分支和远程的 master 分支关联起来。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&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;p&gt;可以通过 &lt;code&gt;git fetch&lt;/code&gt; 和 &lt;code&gt;git pull&lt;/code&gt; 来获取远程仓库的内容。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git fetch origin master&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git pull origin master&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;git fetch&lt;/code&gt; 和 &lt;code&gt;git pull&lt;/code&gt; 之间的区别：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git fetch&lt;/code&gt; 是仅仅获取远程仓库的更新内容，并不会自动做合并。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git pull&lt;/code&gt; 在获取远程仓库的内容后，会自动做合并，可以看成 &lt;code&gt;git fetch&lt;/code&gt; 之后 &lt;code&gt;git merge&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;注意：建议多使用 &lt;code&gt;git fetch&lt;/code&gt;。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. 查看远程仓库信息&lt;a href=&quot;#5-查看远程仓库信息&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git remote [-v] // 显示远程仓库信息&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6. 建立本地分支和远程分支的关联&lt;a href=&quot;#6-建立本地分支和远程分支的关联&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在本地仓库中的分支和远程仓库中的分支是对应的。一般情况下，远程仓库中的分支名称和本地仓库中的分支名称是一致的。&lt;/p&gt;&lt;p&gt;有的时候，我们会需要指定本地分支与远程分支的关联。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git branch --set-upstream &apos;local_branch&apos; origin/remote_branch&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;7. 修改本地仓库对应的远程仓库地址&lt;a href=&quot;#7-修改本地仓库对应的远程仓库地址&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;当远程的仓库地址发生变化时，需要修改本地仓库对应的远程仓库的地址。主要应用在工程迁移过程中。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git remote set-url origin url&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;0x05 标签管理&lt;a href=&quot;#0x05-标签管理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在项目开发过程中，当一个版本发布完成时，是需要对代码打上标签，便于后续检索。获取处于其他的原因，需要对某个提交打上特定的标签。&lt;/p&gt;&lt;section&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;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git tag -a &apos;tagname&apos; -m &apos;comment&apos; &apos;commit_id&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;-a&lt;/code&gt; 参数指定标签名， &lt;code&gt;-m&lt;/code&gt; 添加备注信息， ‘commit_id’ 指定打标签的提交。&lt;/p&gt;&lt;/section&gt;&lt;section&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;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git tag // 查看本地仓库中的所有标签&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git show tagname&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git tag -d tagname&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. 删除远程标签&lt;a href=&quot;#5-删除远程标签&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git push origin :refs/tags/tagname&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git push origin --delete tagname&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git push origin :tagname&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6. 推送标签到远程仓库&lt;a href=&quot;#6-推送标签到远程仓库&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;打完标签以后，有需要推送到远程仓库。&lt;/p&gt;&lt;p&gt;6.1 推送单个标签到远程仓库&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git push origin tagname&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;6.2 一次性推送所有标签到远程仓库。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git push origin --tags&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;0x06 进阶操作&lt;a href=&quot;#0x06-进阶操作&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;在执行很多的 Git 操作的时候，是需要保持当前操作的仓库/分支处于 clean 状态，及没有未提交的修改。如 &lt;code&gt;git pull&lt;/code&gt;， &lt;code&gt;git merge&lt;/code&gt; 等等，如果有未提交的修改，这些将无法操作。&lt;/p&gt;&lt;p&gt;但是做这些事情的时候，你可能修改了比较多的代码，却又不想丢弃它。那么，你需要把这些修改临时保存起来，这就需要用到 &lt;code&gt;git stash&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;1.1 &lt;strong&gt;临时保存修改&lt;/strong&gt; ，这样仓库就可以回到 clean 状态。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git stash // 保存本地仓库中的临时修改。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;注意：可以多次的 &lt;code&gt;git stash&lt;/code&gt; 来保存不同的临时修改。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;1.2 &lt;strong&gt;查看临时保存&lt;/strong&gt; 。当你临时保存以后，后面还是要取回来的，那它们在哪里呢？&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git stash list // 显示所有临时修改&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;1.3 当我们处理完其他操作时，想要恢复临时保存的修改。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git stash apply        // 恢复所有保存的临时修改&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git stash pop        // 恢复最近一次保存的临时修改&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;1.4 或者，我们后面觉得临时保存不想要了，那可以丢弃它。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git stash clear // 丢弃所有保存的临时修改&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;0x07 写在最后&lt;a href=&quot;#0x07-写在最后&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这些是我目前在项目中经常会用到的操作，这里整理下来，可以作为一个手册。对于 Git 的理解或者更多的解释，并不在这里体现。大家可以参考其他更多的资料。例如&lt;a href=&quot;https://github.com/521xueweihan/git-tips&quot; target=&quot;_blank&quot;&gt;《Git的奇技淫巧》&lt;/a&gt;&amp;amp;&lt;a href=&quot;http://rogerdudler.github.io/git-guide/index.zh.html&quot; target=&quot;_blank&quot;&gt;《Git简明指南》&lt;/a&gt;&amp;amp;&lt;a href=&quot;https://tutorialzine.com/2016/06/learn-git-in-30-minutesLearn%20Git%20in%2030%20Minutes&quot; target=&quot;_blank&quot;&gt;《Learn Git in 30 Minutes》&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Docker必备：Alpine Linux常用命令及用法整理</title><link>https://blog.moewah.com/posts/2198/</link><guid isPermaLink="true">https://blog.moewah.com/posts/2198/</guid><description>如何在Docker中高效使用Alpine Linux？本文详细整理了Alpine常用命令及用法，涵盖SSH配置、源管理等核心操作，帮助开发者快速掌握Alpine在Docker中的实战技巧。</description><pubDate>Thu, 27 Jun 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;博主最近在玩Docker，因为Docker开始对 Alpine Linux 系统产生一些兴趣，Docker 与 Alpine 的关系在我看来是互相成就彼此，下面的内容主要是关于 Alpine 常用的一些命令及用法，差不多可以满足我的日常需求了。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;了解 Alpine&lt;a href=&quot;#了解-alpine&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Alpine 操作系统是一个面向安全的轻型 Linux 发行版。它不同于通常 Linux 发行版，Alpine 采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗，但功能上比 busybox 又完善的多，因此得到开源社区越来越多的青睐。在保持瘦身的同时，Alpine 还提供了自己的包管理工具 apk，可以通过 &lt;a href=&quot;https://pkgs.alpinelinux.org/packages&quot; target=&quot;_blank&quot;&gt;https://pkgs.alpinelinux.org/packages&lt;/a&gt; 网站上查询包信息，也可以直接通过 apk 命令直接查询和安装各种软件。&lt;/p&gt;&lt;p&gt;Alpine 由非商业组织维护的，支持广泛场景的 Linux发行版，它特别为资深/重度Linux用户而优化，关注安全，性能和资源效能。Alpine 镜像可以适用于更多常用场景，并且是一个优秀的可以适用于生产的基础系统/环境。&lt;/p&gt;&lt;p&gt;Alpine Docker 镜像也继承了 Alpine Linux 发行版的这些优势。相比于其他 Docker 镜像，它的容量非常小，仅仅只有 5 MB 左右（对比 Ubuntu 系列镜像接近 200 MB），且拥有非常友好的包管理机制。官方镜像来自 docker-alpine 项目。&lt;/p&gt;&lt;p&gt;目前 Docker 官方已开始推荐使用 Alpine 替代之前的 Ubuntu 做为基础镜像环境。这样会带来多个好处。包括镜像下载速度加快，镜像安全性提高，主机之间的切换更方便，占用更少磁盘空间等。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;一：Alpine Linux开启SSH远程登陆&lt;a href=&quot;#一alpine-linux开启ssh远程登陆&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;最重要的一个服务了，远程登陆需要用它，文件传输需要用它，必备功能。不管你是在实体机上跑，虚拟机上跑，docker里面跑，这个都是必须的。&lt;/p&gt;&lt;/section&gt;&lt;section&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;code&gt;/etc/ssh/sshd_config&lt;/code&gt;&lt;/p&gt;&lt;p&gt;配置文件选项：&lt;code&gt;#PermitRootLogin prohibit-password&lt;/code&gt;&lt;/p&gt;&lt;p&gt;修改为：&lt;code&gt;PermitRootLogin yes&lt;/code&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;看不懂上面的，直接用下面这句。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sed -i &quot;s/#PermitRootLogin.*/PermitRootLogin yes/g&quot; /etc/ssh/sshd_config&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;p&gt;重启服务器：&lt;code&gt;reboot&lt;/code&gt;&lt;/p&gt;&lt;p&gt;重启服务：&lt;code&gt;rc-service sshd restart&lt;/code&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;二：Alpine Linux源管理&lt;a href=&quot;#二alpine-linux源管理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1.简介&lt;a href=&quot;#1简介-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;源这个概念在linux早就存在了，其实就是类似于软件市场的存在，apple在iphone上发扬光大了，并且自己管理安全的软件，使得iphone上软件兼容性等等问题得到改善，用户体验比较好，android基于linux核心开发，也有了软件市场，最著名的就是google市场，因为被墙，所以国内各个大软件厂商也都有了自己的市场。&lt;/p&gt;&lt;p&gt;每个市场（源）都有自己的服务器，linux默认的都是外国的服务器，我们访问比较慢，所以就有了镜像服务器放在国内，让我们访问快一些。管理源，就是增加镜像服务器。&lt;/p&gt;&lt;p&gt;而且，linux因为是大众维护更新代码，所以还区分了稳定版，测试版……各种版本的市场，这些都需要进行源管理。&lt;/p&gt;&lt;/section&gt;&lt;section&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;这几个都有alpine的源&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;清华大学：&lt;a href=&quot;https://mirror.tuna.tsinghua.edu.cn/alpine/&quot; target=&quot;_blank&quot;&gt;https://mirror.tuna.tsinghua.edu.cn/alpine/&lt;/a&gt;
阿里云：&lt;a href=&quot;https://mirrors.aliyun.com/alpine/&quot; target=&quot;_blank&quot;&gt;https://mirrors.aliyun.com/alpine/&lt;/a&gt;
中科大：&lt;a href=&quot;http://mirrors.ustc.edu.cn/alpine/&quot; target=&quot;_blank&quot;&gt;http://mirrors.ustc.edu.cn/alpine/&lt;/a&gt;
还有一些没有alpine的
网易：&lt;a href=&quot;http://mirrors.163.com/&quot; target=&quot;_blank&quot;&gt;http://mirrors.163.com/&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&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;p&gt;直接抄中科大的帮助&lt;a href=&quot;http://mirrors.ustc.edu.cn/help/alpine.html&quot; target=&quot;_blank&quot;&gt;http://mirrors.ustc.edu.cn/help/alpine.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;一般情况下，将 &lt;code&gt;/etc/apk/repositories&lt;/code&gt; 文件中 Alpine 默认的源地址 &lt;code&gt;http://dl-cdn.alpinelinux.org/&lt;/code&gt; 替换为 &lt;code&gt;http://mirrors.ustc.edu.cn/&lt;/code&gt; 即可。&lt;/p&gt;&lt;p&gt;可以使用如下命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sed -i &apos;s/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g&apos; /etc/apk/repositories&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;也可以直接编辑 &lt;code&gt;/etc/apk/repositories&lt;/code&gt; 文件。以下是 v3.5 版本的参考配置：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;https://mirrors.ustc.edu.cn/alpine/v3.5/main&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;https://mirrors.ustc.edu.cn/alpine/v3.5/community&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;也可以使用 &lt;code&gt;latest-stable&lt;/code&gt; 指向最新的稳定版本：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;https://mirrors.ustc.edu.cn/alpine/latest-stable/main&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;https://mirrors.ustc.edu.cn/alpine/latest-stable/community&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;更改完 &lt;code&gt;/etc/apk/repositories&lt;/code&gt; 文件后请运行 &lt;code&gt;apk update&lt;/code&gt; 更新索引以生效。&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;打开&lt;code&gt;/etc/apk/repositories后发现，中科大的sed命令无效，因为默认的源不是dl-cdn&lt;/code&gt;&lt;/p&gt;&lt;p&gt;自己改一下吧&lt;/p&gt;&lt;p&gt;原：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;/media/cdrom/apks&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;http://ftp.halifax.rwth-aachen.de/alpine/v3.7/main&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#http://ftp.halifax.rwth-aachen.de/alpine/v3.7/community&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#http://ftp.halifax.rwth-aachen.de/alpine/edge/main&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#http://ftp.halifax.rwth-aachen.de/alpine/edge/community&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#http://ftp.halifax.rwth-aachen.de/alpine/edge/testing&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;http://mirror.yandex.ru/mirrors/alpine/v3.7/main&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#http://mirror.yandex.ru/mirrors/alpine/v3.7/community&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#http://mirror.yandex.ru/mirrors/alpine/edge/main&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#http://mirror.yandex.ru/mirrors/alpine/edge/community&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#http://mirror.yandex.ru/mirrors/alpine/edge/testing&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;改为：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;http://mirrors.ustc.edu.cn/alpine/v3.7/main&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;http://mirrors.ustc.edu.cn/alpine/v3.7/community&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;http://mirrors.ustc.edu.cn/alpine/edge/main&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;http://mirrors.ustc.edu.cn/alpine/edge/community&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;http://mirrors.ustc.edu.cn/alpine/edge/testing&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;也可以复制下面这组命令，一次执行&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo http://mirrors.ustc.edu.cn/alpine/v3.7/main &amp;gt;/etc/apk/repositories&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo http://mirrors.ustc.edu.cn/alpine/v3.7/community &amp;gt;&amp;gt;/etc/apk/repositories&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo http://mirrors.ustc.edu.cn/alpine/edge/main &amp;gt;&amp;gt;/etc/apk/repositories&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo http://mirrors.ustc.edu.cn/alpine/edge/community &amp;gt;&amp;gt;/etc/apk/repositories&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo http://mirrors.ustc.edu.cn/alpine/edge/testing &amp;gt;&amp;gt;/etc/apk/repositories&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;或者&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo &apos;http://mirrors.ustc.edu.cn/alpine/v3.7/main&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;http://mirrors.ustc.edu.cn/alpine/v3.7/community&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;http://mirrors.ustc.edu.cn/alpine/edge/main&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;http://mirrors.ustc.edu.cn/alpine/edge/community&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;http://mirrors.ustc.edu.cn/alpine/edge/testing&apos; &amp;gt;/etc/apk/repositories&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三：Alpine Linux 包管理&lt;a href=&quot;#三alpine-linux-包管理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1.简介&lt;a href=&quot;#1简介-2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Alpine使用&lt;code&gt;apk&lt;/code&gt;进行包管理，下面介绍常用命令&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.apk update&lt;a href=&quot;#2apk-update&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apk update #更新最新镜像源列表&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.apk search&lt;a href=&quot;#3apk-search&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apk search #查找所以可用软件包&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apk search -v #查找所以可用软件包及其描述内容&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apk search -v &apos;acf*&apos; #通过软件包名称查找软件包&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apk search -v -d &apos;docker&apos; #通过描述文件查找特定的软件包&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.apk add&lt;a href=&quot;#4apk-add&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apk add openssh #安装一个软件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apk add openssh openntp vim   #安装多个软件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apk add --no-cache mysql-client  #不使用本地镜像源缓存，相当于先执行update，再执行add&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5.apk info&lt;a href=&quot;#5apk-info&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apk info #列出所有已安装的软件包&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apk info -a zlib #显示完整的软件包信息&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apk info --who-owns /sbin/lbu #显示指定文件属于的包&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6.apk upgrade&lt;a href=&quot;#6apk-upgrade&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apk upgrade #升级所有软件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apk upgrade openssh #升级指定软件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apk upgrade openssh openntp vim   #升级多个软件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apk add --upgrade busybox #指定升级部分软件包&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;7.apk del&lt;a href=&quot;#7apk-del&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apk del openssh  #删除一个软件&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;四：Alpine Linux服务管理&lt;a href=&quot;#四alpine-linux服务管理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1.简介&lt;a href=&quot;#1简介-3&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;alpine没有使用fedora的&lt;code&gt;systemctl&lt;/code&gt;来进行服务管理，使用的是&lt;code&gt;RC&lt;/code&gt;系列命令&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.rc-update&lt;a href=&quot;#2rc-update&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;rc-update&lt;/code&gt;主要用于不同运行级增加或者删除服务。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;alpine:~# rc-update --help&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Usage: rc-update [options] add &amp;lt;service&amp;gt; [&amp;lt;runlevel&amp;gt;...]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;or: rc-update [options] del &amp;lt;service&amp;gt; [&amp;lt;runlevel&amp;gt;...]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;or: rc-update [options] [show [&amp;lt;runlevel&amp;gt;...]]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Options: [ asuChqVv ]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-a, --all                         Process all runlevels&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-s, --stack                       Stack a runlevel instead of a service&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-u, --update                      Force an update of the dependency tree&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-h, --help                        Display this help output&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-C, --nocolor                     Disable color output&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-V, --version                     Display software version&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-v, --verbose                     Run verbosely&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-q, --quiet                       Run quietly (repeat to suppress errors)&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.rc-status&lt;a href=&quot;#3rc-status&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;rc-status 主要用于运行级的状态管理。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;alpine:~# rc-status --help&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Usage: rc-status [options] &amp;lt;runlevel&amp;gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;or: rc-status [options] [-a | -c | -l | -m | -r | -s | -u]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Options: [ aclmrsuChqVv ]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-a, --all                         Show services from all run levels&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-c, --crashed                     Show crashed services&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-l, --list                        Show list of run levels&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-m, --manual                      Show manually started services&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-r, --runlevel                    Show the name of the current runlevel&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-s, --servicelist                 Show service list&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-u, --unused                      Show services not assigned to any runlevel&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-h, --help                        Display this help output&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-C, --nocolor                     Disable color output&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-V, --version                     Display software version&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-v, --verbose                     Run verbosely&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-q, --quiet                       Run quietly (repeat to suppress errors)&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.rc-service&lt;a href=&quot;#4rc-service&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;rc-service主用于管理服务的状态&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;alpine:~# rc-service --help&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Usage: rc-service [options] [-i] &amp;lt;service&amp;gt; &amp;lt;cmd&amp;gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;or: rc-service [options] -e &amp;lt;service&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;or: rc-service [options] -l&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;or: rc-service [options] -r &amp;lt;service&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Options: [ ce:ilr:INChqVv ]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-e, --exists &amp;lt;arg&amp;gt;                tests if the service exists or not&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-c, --ifcrashed                   if the service is crashed then run the command&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-i, --ifexists                    if the service exists then run the command&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-I, --ifinactive                  if the service is inactive then run the command&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-N, --ifnotstarted                if the service is not started then run the command&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-l, --list                        list all available services&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-r, --resolve &amp;lt;arg&amp;gt;               resolve the service name to an init script&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-h, --help                        Display this help output&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-C, --nocolor                     Disable color output&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-V, --version                     Display software version&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-v, --verbose                     Run verbosely&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-q, --quiet                       Run quietly (repeat to suppress errors)&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5.openrc&lt;a href=&quot;#5openrc&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;openrc主要用于管理不同的运行级。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;alpine:~# openrc --help&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Usage: openrc [options] [&amp;lt;runlevel&amp;gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Options: [ a:no:s:SChqVv ]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-n, --no-stop                     do not stop any services&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-o, --override &amp;lt;arg&amp;gt;              override the next runlevel to change into&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;when leaving single user or boot runlevels&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-s, --service &amp;lt;arg&amp;gt;               runs the service specified with the rest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;of the arguments&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-S, --sys                         output the RC system type, if any&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-h, --help                        Display this help output&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-C, --nocolor                     Disable color output&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-V, --version                     Display software version&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-v, --verbose                     Run verbosely&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-q, --quiet                       Run quietly (repeat to suppress errors)&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6.我常用的RC系列命令&lt;a href=&quot;#6我常用的rc系列命令&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;1.增加服务到系统启动时运行，下例为docker&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rc-update add docker boot&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;2.重启网络服务&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rc-service networking restart&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;3.列出所有服务&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rc-status -a&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ reboot #重启系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ poweroff #关机&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;Alpine 官网：&lt;a href=&quot;http://alpinelinux.org/&quot; target=&quot;_blank&quot;&gt;http://alpinelinux.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Alpine 官方仓库：&lt;a href=&quot;https://github.com/alpinelinux&quot; target=&quot;_blank&quot;&gt;https://github.com/alpinelinux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Alpine 官方镜像：&lt;a href=&quot;https://hub.docker.com/_/alpine/&quot; target=&quot;_blank&quot;&gt;https://hub.docker.com/_/alpine/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Alpine 官方镜像仓库：&lt;a href=&quot;https://github.com/gliderlabs/docker-alpine&quot; target=&quot;_blank&quot;&gt;https://github.com/gliderlabs/docker-alpine&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>磁力聚合搜索平台magnetW安装教程</title><link>https://blog.moewah.com/posts/2112/</link><guid isPermaLink="true">https://blog.moewah.com/posts/2112/</guid><description>如何快速搭建磁力链接聚合搜索平台？本文详细讲解magnetW在Linux系统上的部署流程，涵盖Java环境、Tomcat配置及Web项目发布，助你实现多资源站一键检索，提升找资源效率。</description><pubDate>Thu, 20 Jun 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt; 找资源是一件非常痛苦的事情，拿一部正在追看的美剧来说，多个磁力站点数据更新程度各有不同，就需要打开多个站点来检索我们需要的结果，显然费时费力！** magnetW** 提供了磁力链接聚合搜索，在一个页面中就能轻松完成多个资源站的快速切换最终帮你找到你想要的。作者提供了一个&lt;a href=&quot;https://biedian.me/&quot; target=&quot;_blank&quot;&gt;DEMO&lt;/a&gt;页面，但页面访问速度较慢，并且很不稳定，这里就大概水一下具体搭建的步骤。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;项目地址：&lt;/strong&gt; &lt;a href=&quot;https://github.com/dengyuhan/magnetW&quot; target=&quot;_blank&quot;&gt;https://github.com/dengyuhan/magnetW&lt;/a&gt;&lt;/p&gt;
&lt;section&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;figure&gt;&lt;img alt=&quot;magnetW.gif&quot; loading=&quot;lazy&quot; width=&quot;951&quot; height=&quot;564&quot; src=&quot;/_astro/2112_353138926_4f86ba.BUYRwm0C_Z2cgwds.webp&quot; srcset=&quot;/_astro/2112_353138926_4f86ba.BUYRwm0C_ZBabvV.webp 640w, /_astro/2112_353138926_4f86ba.BUYRwm0C_Z1j3B3d.webp 750w, /_astro/2112_353138926_4f86ba.BUYRwm0C_Z1Y83QH.webp 828w, /_astro/2112_353138926_4f86ba.BUYRwm0C_Z2cgwds.webp 951w&quot; /&gt;&lt;figcaption&gt;magnetW.gif&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;安装部署&lt;a href=&quot;#安装部署&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;magnetW&lt;/strong&gt; 项目作者提供了 Windows/macOS 一键启动版 -&amp;gt; &lt;a href=&quot;https://github.com/dengyuhan/magnetW/releases&quot; target=&quot;_blank&quot;&gt;传送门&lt;/a&gt;，下载解压就可以使用，所以下面的内容主要介绍在linux系统上我们如何部署安装&lt;strong&gt;magnetW&lt;/strong&gt; 。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1、安装 JAVA&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果要安装 tomcat 8.x 那么需要满足&lt;code&gt;jdk&lt;/code&gt; 版本至少为 &lt;code&gt;1.7&lt;/code&gt;，可以查看命令为 &lt;code&gt;java -version&lt;/code&gt;，如果没安装可参考：&lt;a href=&quot;https://blog.moewah.com/posts/561/&quot;&gt;Linux/Windows 系统安装最新版 JAVA 教程&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2、安装 Tomcat&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#下载安装包&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget --no-check-certificate https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.42/bin/apache-tomcat-8.5.42.tar.gz&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#解压包文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tar zxvf apache-tomcat-8.5.42.tar.gz&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#进入目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd apache-tomcat-8.5.42&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#运行脚本&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;./bin/startup.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;配置 &lt;code&gt;iptables&lt;/code&gt; 放行&lt;code&gt;8080&lt;/code&gt;端口。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#如果打不开Web界面，就需要开启防火墙，一般CentOS系统出现情况最多&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#Centos 6系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iptables -I INPUT -p tcp --dport 8080 -j ACCEPT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service iptables save&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service iptables restart&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 7系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --zone=public --add-port=8080/tcp --permanent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --reload&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后在浏览器输入 &lt;code&gt;http://ip:8080&lt;/code&gt; 如果出现 tomcat 熟悉的欢迎界面，则说明安装成功了。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;tomcat-welcome.jpeg&quot; loading=&quot;lazy&quot; width=&quot;1112&quot; height=&quot;732&quot; src=&quot;/_astro/2112_627167965_edaa5c.CfCGEqTO_Z1FGqci.webp&quot; srcset=&quot;/_astro/2112_627167965_edaa5c.CfCGEqTO_enFLv.webp 640w, /_astro/2112_627167965_edaa5c.CfCGEqTO_1UgGL6.webp 750w, /_astro/2112_627167965_edaa5c.CfCGEqTO_12DmA1.webp 828w, /_astro/2112_627167965_edaa5c.CfCGEqTO_81T8z.webp 1080w, /_astro/2112_627167965_edaa5c.CfCGEqTO_Z1FGqci.webp 1112w&quot; /&gt;&lt;figcaption&gt;tomcat-welcome.jpeg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3、发布Web项目&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在 magnetW 项目页 &lt;a href=&quot;https://github.com/dengyuhan/magnetW/releases&quot; target=&quot;_blank&quot;&gt;Releases&lt;/a&gt; 下载编译好的war包，部署到 Tomcat 根目录中，参考文章 -&amp;gt; &lt;a href=&quot;https://blog.moewah.com/posts/2125/&quot;&gt;将应用部署到 Tomcat 根目录的三种方法&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#进入webapp目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd apache-tomcat-8.5.42/webapp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#下载war包文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget --no-check-certificate https://github.com/xiandanin/magnetW/releases/download/2.1.4/magnetw-2.1.4.war&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#删除ROOT目录下的所有文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm -rf ROOT/*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#移动magnetw目录下的所有文件到ROOT目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mv magnetw-2.1.4/* ROOT/&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;打开浏览器输入地址 &lt;code&gt;http://服务器ip:8080&lt;/code&gt; 即可。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;注意：若遇到404页面无法访问，可以执行 bin 目录中的 &lt;code&gt;shutdown.sh&lt;/code&gt; 脚本关闭tomcat服务，再执行一次 &lt;code&gt;startup.sh&lt;/code&gt; 来重新启动 tomcat 服务。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&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;&lt;strong&gt;1、安装Docker&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 6&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rpm -iUvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum update -y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum -y install docker-io&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service docker start&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig docker on&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 7、Debian、Ubuntu&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl -sSL https://get.docker.com/ | sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl start docker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl enable docker&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2、拉取镜像包&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker pull gowah/magnetw-web:latest&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;3、启动镜像&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker run --restart=always --name magnetw -d -p 8080:8080 gowah/magnetw-web:latest&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;默认API管理密码为：&lt;code&gt;admin&lt;/code&gt;&lt;/p&gt;&lt;p&gt;然后就可以打开&lt;code&gt;ip:8080&lt;/code&gt;开始访问了，如果想用域名访问，可以参考后面。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;先做好域名解析，Nginx 可以新建一个配置文件例如 &lt;code&gt;www.moewah.com.conf&lt;/code&gt; ，使用反向代理绑定域名，配置如下：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen 80;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name www.moewah.com;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;location / {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_pass http://127.0.0.1:8080; #反向代理&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header Host $host;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header X-Real-IP $remote_addr;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header X-Remote-Port $remote_port;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header X-Forwarded-Proto $scheme;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_redirect off;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;return 404;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;重启 Nginx&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/etc/init.d/nginx restart&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;All done！&lt;/strong&gt; 全部搞定，打开浏览器输入地址 &lt;code&gt;http://www.moewah.com&lt;/code&gt; 即可访问。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;高阶玩法（可选）&lt;a href=&quot;#高阶玩法可选&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&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;ROOT/WEB-INF/classes/config.properties&lt;/code&gt;修改配置后需要重新启动 Tomcat 服务。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;project.version=${project.version}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#管理密码 32位小写MD5值&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;admin.password.md5=&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#规则json文件地址（支持URL和本地路径）本地路径以main/resources为根目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#修改规则后 访问重载规则API可热刷新配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rule.json.uri=rule.json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;//rule.json.uri=https://raw.githubusercontent.com/dengyuhan/magnetW/master/src/main/resources/rule.json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#搜索框占位文字&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;search.placeholder=钢铁侠&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#版本号链接（点击版本号要跳转的链接）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;version.link=&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#是否开启预加载（开启后会异步缓存下一页，加快下一页的访问速度但会增加性能消耗）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;preload.enabled=true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#是否开启tracker服务器 开启后会在新增一列拼接了tracker服务器列表的磁力链接&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;trackers.enabled=true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#自动更新tracker列表的间隔时间（单位:小时）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#列表来自https://raw.githubusercontent.com/ngosang/trackerslist/master/trackers_all.txt&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;trackers.update.interval.hour=24&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#不蒜子统计&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#是否开启&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;busuanzi.enabled=false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#是否在页面上显示(当busuanzi.enabled=true生效)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;busuanzi.show=false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#是否忽略需要代理才能访问的源站&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;proxy.ignore=true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#HTTP代理服务器配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;proxy.enabled=false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;proxy.host=127.0.0.1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;proxy.port=1087&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;API&lt;a href=&quot;#api&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;管理API&lt;a href=&quot;#管理api&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;可以去&lt;a href=&quot;http://tool.chinaz.com/tools/md5.aspx&quot; target=&quot;_blank&quot;&gt;在线MD5&lt;/a&gt;将密码转成32位小写，然后在&lt;code&gt;config.properties&lt;/code&gt;中填入MD5，即可访问管理API&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;custom-config1.jpg&quot; loading=&quot;lazy&quot; width=&quot;1980&quot; height=&quot;458&quot; src=&quot;/_astro/2112_3452526662_a5bc02.DEXT9dKw_2jUJe1.webp&quot; srcset=&quot;/_astro/2112_3452526662_a5bc02.DEXT9dKw_Z1xo4M5.webp 640w, /_astro/2112_3452526662_a5bc02.DEXT9dKw_ZdwXkP.webp 750w, /_astro/2112_3452526662_a5bc02.DEXT9dKw_Z1YaVMc.webp 828w, /_astro/2112_3452526662_a5bc02.DEXT9dKw_Z2jWauP.webp 1080w, /_astro/2112_3452526662_a5bc02.DEXT9dKw_omv41.webp 1280w, /_astro/2112_3452526662_a5bc02.DEXT9dKw_Z2k4UVL.webp 1668w, /_astro/2112_3452526662_a5bc02.DEXT9dKw_2jUJe1.webp 1980w&quot; /&gt;&lt;figcaption&gt;custom-config1.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;admin.password.md5=529ca8050a00180790cf88b63468826a&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;custom-config2.jpg&quot; loading=&quot;lazy&quot; width=&quot;888&quot; height=&quot;262&quot; src=&quot;/_astro/2112_591099252_fab007.Cwk144NP_2hPpic.webp&quot; srcset=&quot;/_astro/2112_591099252_fab007.Cwk144NP_ZE2pOY.webp 640w, /_astro/2112_591099252_fab007.Cwk144NP_ZD7ic.webp 750w, /_astro/2112_591099252_fab007.Cwk144NP_ZSSixa.webp 828w, /_astro/2112_591099252_fab007.Cwk144NP_2hPpic.webp 888w&quot; /&gt;&lt;figcaption&gt;custom-config2.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;section&gt;&lt;h5&gt;重载规则&lt;a href=&quot;#重载规则&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/api/reload?p=[管理密码]&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h5&gt;清除缓存&lt;a href=&quot;#清除缓存&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/api/clear-cache?p=[管理密码]&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;数据API&lt;a href=&quot;#数据api&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;支持返回数据JSON，可以用来扩展其它平台&lt;/p&gt;&lt;section&gt;&lt;h5&gt;获取源站列表&lt;a href=&quot;#获取源站列表&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;api/source&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h5&gt;搜索&lt;a href=&quot;#搜索&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;api/search?source=[源站名称]&amp;amp;keyword=[关键字]&amp;amp;sort=[排序类型]&amp;amp;page=[页码]&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;更多自定义配置和规则的内容，可以查看 &lt;a href=&quot;https://github.com/dengyuhan/magnetW/blob/master/Config.md&quot; target=&quot;_blank&quot;&gt;Config.md&lt;/a&gt;文档。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>又一款好用的RSS阅读器：FreshRSS安装教程</title><link>https://blog.moewah.com/posts/1903/</link><guid isPermaLink="true">https://blog.moewah.com/posts/1903/</guid><description>如何快速搭建私有化RSS阅读器？本文详细讲解FreshRSS的LNMP和Docker安装方法，支持OPML导入导出、多用户管理及主题更换，助你高效阅读与信息管理。</description><pubDate>Wed, 12 Jun 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt;&lt;code&gt;FreshRSS&lt;/code&gt;阅读器，免费，界面很美观，支持导入/导出为&lt;code&gt;OPML&lt;/code&gt;文件，过滤、标记、搜索等，有助于轻松查找和阅读文章，也可以多用户使用，还可以安装很多拓展和更换不同的主题，而且查看&lt;code&gt;10&lt;/code&gt;万篇文章都不会卡，这里简单说下常规的&lt;code&gt;LNMP&lt;/code&gt;安装和&lt;code&gt;Docker&lt;/code&gt;教程。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;官方网站：&lt;/strong&gt; &lt;a href=&quot;https://freshrss.org/&quot; target=&quot;_blank&quot;&gt;https://freshrss.org&lt;/a&gt;
&lt;strong&gt;演示地址：&lt;/strong&gt; &lt;a href=&quot;https://demo.freshrss.org/&quot; target=&quot;_blank&quot;&gt;https://demo.freshrss.org&lt;/a&gt;&lt;/p&gt;
&lt;section&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;figure&gt;&lt;img alt=&quot;164241_NdEJ_2720166.png&quot; loading=&quot;lazy&quot; width=&quot;1387&quot; height=&quot;856&quot; src=&quot;/_astro/1903_1567931760_cce1a1.DwqY2PYI_Z1WQ9iy.webp&quot; srcset=&quot;/_astro/1903_1567931760_cce1a1.DwqY2PYI_Z1692BW.webp 640w, /_astro/1903_1567931760_cce1a1.DwqY2PYI_ZDJgSp.webp 750w, /_astro/1903_1567931760_cce1a1.DwqY2PYI_ZIvNp2.webp 828w, /_astro/1903_1567931760_cce1a1.DwqY2PYI_Z2t33Ja.webp 1080w, /_astro/1903_1567931760_cce1a1.DwqY2PYI_VvoAl.webp 1280w, /_astro/1903_1567931760_cce1a1.DwqY2PYI_Z1WQ9iy.webp 1387w&quot; /&gt;&lt;figcaption&gt;164241_NdEJ_2720166.png&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img alt=&quot;20190612120745.jpg&quot; loading=&quot;lazy&quot; width=&quot;1335&quot; height=&quot;646&quot; src=&quot;/_astro/1903_989857162_918f42.IF62pEGY_ZVW1cX.webp&quot; srcset=&quot;/_astro/1903_989857162_918f42.IF62pEGY_Z1dsuxC.webp 640w, /_astro/1903_989857162_918f42.IF62pEGY_Z2fYhel.webp 750w, /_astro/1903_989857162_918f42.IF62pEGY_s4M8w.webp 828w, /_astro/1903_989857162_918f42.IF62pEGY_pBlxK.webp 1080w, /_astro/1903_989857162_918f42.IF62pEGY_1PCB0F.webp 1280w, /_astro/1903_989857162_918f42.IF62pEGY_ZVW1cX.webp 1335w&quot; /&gt;&lt;figcaption&gt;20190612120745.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;LNMP安装&lt;a href=&quot;#lnmp安装&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;该方法属于常见的安装方法，不过有点慢，如果想快点安装的，使用下面的&lt;code&gt;Docker&lt;/code&gt;安装即可，不过&lt;code&gt;Docker&lt;/code&gt;不适用于&lt;code&gt;OVZ&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;环境要求：&lt;/strong&gt;&lt;code&gt;Nginx&lt;/code&gt;、&lt;code&gt;7.0 &amp;gt;= PHP &amp;gt;= 5.3&lt;/code&gt;、&lt;code&gt;MySQL &amp;gt;= 5.5&lt;/code&gt;，需要&lt;code&gt;Fileinfo&lt;/code&gt;组建支持。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1、安装宝塔&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#Centos系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum install -y wget &amp;amp;&amp;amp; wget -O install.sh http://download.bt.cn/install/install.sh &amp;amp;&amp;amp; sh install.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#Ubuntu系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget -O install.sh http://download.bt.cn/install/install-ubuntu.sh &amp;amp;&amp;amp; sudo bash install.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#Debian系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget -O install.sh http://download.bt.cn/install/install-ubuntu.sh &amp;amp;&amp;amp; bash install.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后进入后台再安装&lt;code&gt;PHP&lt;/code&gt;、&lt;code&gt;Nginx&lt;/code&gt;和&lt;code&gt;Mysql&lt;/code&gt;环境，再找到左侧软件管理-&lt;code&gt;PHP&lt;/code&gt;管理-设置-安装&lt;code&gt;Fileinfo&lt;/code&gt;拓展。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#如果Fileinfo拓展安装失败，就是内存太小，我们可以添加swap，不适用于ovz&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1、手动添加，方法查看：https://blog.moewah.com/posts/442/。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2、面板添加，找到左侧软件管理-系统工具-安装Linux工具箱，然后进入工具箱添加。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2、上传程序&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;安装好环境后解析并添加域名，然后下载源码：&lt;a href=&quot;https://github.com/FreshRSS/FreshRSS/archive/master.zip&quot; target=&quot;_blank&quot;&gt;FreshRSS&lt;/a&gt;，再放到站点根目录并解压。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#或者使用命令下载源码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#进入站点根目录，请修改为自己域名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd /www/wwwroot/xx.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#下载程序&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git clone https://github.com/FreshRSS/FreshRSS.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#移动到根目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mv FreshRSS/{,.}* ./&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#授权&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chown 755 ./*&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;提示&lt;code&gt;git&lt;/code&gt;命令不存在的运行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#Debian和Ubuntu系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt-get -y install git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum -y install git&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;3、新建数据库并安装（可选）&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;新建数据库，然后打开域名根据提示输入管理员账号、密码，数据库信息安装即可。&lt;/p&gt;&lt;p&gt;之所以标注为可选是因为 FreshRSS 除了支持 &lt;code&gt;mysql&lt;/code&gt;、&lt;code&gt;postgresql&lt;/code&gt; 外还支持&lt;code&gt; sqlite&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4、定时自动更新RSS&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;可以通过&lt;code&gt;crontab -e&lt;/code&gt;命令追加任务计划&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;*/30 * * * * php -f /www/wwwroot/xx.com/app/actualize_script.php &amp;gt; /tmp/FreshRSS.log 2&amp;gt;&amp;amp;1&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;最后，重启&lt;code&gt;crontab&lt;/code&gt;服务即可。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# CentOS7重启crontab服务&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl restart crond&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# CentOS6重启crontab服务&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service crond restart&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Ubuntu14重启crontab服务&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service cron restart&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Docker安装&lt;a href=&quot;#docker安装&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;1、安装Docker&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 安装 docker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl -sSL https://get.docker.com/ | sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 启动 docker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl start docker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 设置为开机启动&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl enable docker&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2、创建并启用容器&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker run -d \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--name=freshrss \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-e PUID=1024 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-e PGID=100 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-e TZ=Asia/Shanghai \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-p 8888:80 \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-v $PWD/freshrss:/config \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--restart=always \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;linuxserver/freshrss:latest&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;参数说明：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;PUID、PGID，请运行 &lt;code&gt;id [user]&lt;/code&gt; 查看，例如查看用户名为 &lt;code&gt;admin&lt;/code&gt; 的 PUID、UGID ，则运行 &lt;code&gt;id admin&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;参数 &lt;code&gt;-p 8888:80&lt;/code&gt; 表示容器中 &lt;code&gt;80&lt;/code&gt; 端口映射到宿主机的 &lt;code&gt;8888&lt;/code&gt; 端口；如需暴露主机的 &lt;code&gt;8080&lt;/code&gt; 端口，则修改为 &lt;code&gt;-p 8080:80&lt;/code&gt;，请确保防火墙开放相关端口。&lt;/li&gt;
&lt;li&gt;命令执行过程中会自动在当前路径下创建 &lt;code&gt;freshrss&lt;/code&gt; 目录存放配置文件。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;安装完成后，打开&lt;code&gt;http://IP:8888&lt;/code&gt;访问，如果你修改了端口，就用&lt;code&gt;IP:Port&lt;/code&gt;访问。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;IP&lt;/code&gt;访问的，直接无视该步骤。由于博主喜欢用&lt;code&gt;Caddy&lt;/code&gt;，所以这里使用&lt;code&gt;Caddy&lt;/code&gt;反代。请先解析一个域名到服务器上。&lt;/p&gt;&lt;p&gt;安装&lt;code&gt;Caddy&lt;/code&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/caddy_install.sh &amp;amp;&amp;amp; chmod +x caddy_install.sh &amp;amp;&amp;amp; bash caddy_install.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#备用地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget -N --no-check-certificate https://blog.moewah.com/source/caddy_install.sh &amp;amp;&amp;amp; chmod +x caddy_install.sh &amp;amp;&amp;amp; bash caddy_install.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;编辑配置文件&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#以下全部内容是一个整体，修改域名、IP、邮箱后一起复制到SSH运行！&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo &quot;https://xx.com {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tls admin@moewah.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy / 111.111.111.111:8080 {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;header_upstream Host {host}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;header_upstream X-Real-IP {remote}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;header_upstream X-Forwarded-For {remote}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;header_upstream X-Forwarded-Proto {scheme}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;log /var/log/caddy.log&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;gzip&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&quot; &amp;gt; /usr/local/caddy/Caddyfile&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;tls&lt;/code&gt;参数会自动帮你签发&lt;code&gt;ssl&lt;/code&gt;证书，如果你要使用自己的&lt;code&gt;ssl&lt;/code&gt;，改为&lt;code&gt;tls /root/xx.crt /root/xx.key&lt;/code&gt;即可。后面为&lt;code&gt;ssl&lt;/code&gt;证书路径。&lt;/p&gt;&lt;p&gt;启动&lt;code&gt;Caddy&lt;/code&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/etc/init.d/caddy restart&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;最后就可以通过域名&lt;code&gt;https&lt;/code&gt;访问了&lt;/p&gt;&lt;p&gt;&lt;code&gt;RSS&lt;/code&gt;阅读器可以配合&lt;code&gt;RSS&lt;/code&gt;生成器使用，查看：&lt;a href=&quot;https://blog.moewah.com/posts/1364/&quot;&gt;RSSHub：一个轻量、易于扩展的RSS生成器&lt;/a&gt;。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Docker入门简明教程：一篇文章快速上手</title><link>https://blog.moewah.com/posts/2133/</link><guid isPermaLink="true">https://blog.moewah.com/posts/2133/</guid><description>如何解决软件开发中的环境配置难题？本文详解Docker的原理与优势，提供从虚拟机到容器技术的对比分析及实战应用指南，帮助开发者高效部署和管理应用。</description><pubDate>Tue, 21 May 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;2013年发布至今， Docker 一直广受瞩目，被认为可能会改变软件行业。&lt;/p&gt;
&lt;p&gt;但是，许多人并不清楚 Docker 到底是什么，要解决什么问题，好处又在哪里？本文就来详细解释，帮助大家理解它，还带有简单易懂的实例，教你如何将它用于日常开发。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;docker1.jpg&quot; loading=&quot;lazy&quot; width=&quot;740&quot; height=&quot;345&quot; src=&quot;/_astro/2133_3658893883_5a18e9.DCAzO-or_Z2slcT3.webp&quot; srcset=&quot;/_astro/2133_3658893883_5a18e9.DCAzO-or_ZK9HuF.webp 640w, /_astro/2133_3658893883_5a18e9.DCAzO-or_Z2slcT3.webp 740w&quot; /&gt;&lt;figcaption&gt;docker1.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;&lt;strong&gt;一、环境配置的难题&lt;/strong&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;用户必须保证两件事：操作系统的设置，各种库和组件的安装。只有它们都正确，软件才能运行。举例来说，安装一个 Python 应用，计算机必须有 Python 引擎，还必须有各种依赖，可能还要配置环境变量。&lt;/p&gt;&lt;p&gt;如果某些老旧的模块与当前环境不兼容，那就麻烦了。开发者常常会说：“它在我的机器可以跑了”（It works on my machine），言下之意就是，其他机器很可能跑不了。&lt;/p&gt;&lt;p&gt;环境配置如此麻烦，换一台机器，就要重来一次，旷日费时。很多人想到，能不能从根本上解决问题，软件可以带环境安装？也就是说，安装的时候，把原始环境一模一样地复制过来。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;&lt;strong&gt;二、虚拟机&lt;/strong&gt;&lt;a href=&quot;#二虚拟机&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;虚拟机（virtual machine）就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统，比如在 Windows 系统里面运行 Linux 系统。应用程序对此毫无感知，因为虚拟机看上去跟真实系统一模一样，而对于底层系统来说，虚拟机就是一个普通文件，不需要了就删掉，对其他部分毫无影响。&lt;/p&gt;&lt;p&gt;虽然用户可以通过虚拟机还原软件的原始环境。但是，这个方案有几个缺点。&lt;/p&gt;&lt;p&gt;&lt;em&gt;（1）资源占用多&lt;/em&gt;&lt;/p&gt;&lt;p&gt;虚拟机会独占一部分内存和硬盘空间。它运行的时候，其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序，真正使用的内存只有 1MB，虚拟机依然需要几百 MB 的内存才能运行。&lt;/p&gt;&lt;p&gt;&lt;em&gt;（2）冗余步骤多&lt;/em&gt;&lt;/p&gt;&lt;p&gt;虚拟机是完整的操作系统，一些系统级别的操作步骤，往往无法跳过，比如用户登录。&lt;/p&gt;&lt;p&gt;&lt;em&gt;（3）启动慢&lt;/em&gt;&lt;/p&gt;&lt;p&gt;启动操作系统需要多久，启动虚拟机就需要多久。可能要等几分钟，应用程序才能真正运行。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;&lt;strong&gt;三、Linux 容器&lt;/strong&gt;&lt;a href=&quot;#三linux-容器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;由于虚拟机存在这些缺点，Linux 发展出了另一种虚拟化技术：Linux 容器（Linux Containers，缩写为 LXC）。&lt;/p&gt;&lt;p&gt;*Linux 容器不是模拟一个完整的操作系统，而是对进程进行隔离。*或者说，在正常进程的外面套了一个保护层。对于容器里面的进程来说，它接触到的各种资源都是虚拟的，从而实现与底层系统的隔离。&lt;/p&gt;&lt;p&gt;由于容器是进程级别的，相比虚拟机有很多优势。&lt;/p&gt;&lt;p&gt;&lt;em&gt;（1）启动快&lt;/em&gt;&lt;/p&gt;&lt;p&gt;容器里面的应用，直接就是底层系统的一个进程，而不是虚拟机内部的进程。所以，启动容器相当于启动本机的一个进程，而不是启动一个操作系统，速度就快很多。&lt;/p&gt;&lt;p&gt;&lt;em&gt;（2）资源占用少&lt;/em&gt;&lt;/p&gt;&lt;p&gt;容器只占用需要的资源，不占用那些没有用到的资源；虚拟机由于是完整的操作系统，不可避免要占用所有资源。另外，多个容器可以共享资源，虚拟机都是独享资源。&lt;/p&gt;&lt;p&gt;&lt;em&gt;（3）体积小&lt;/em&gt;&lt;/p&gt;&lt;p&gt;容器只要包含用到的组件即可，而虚拟机是整个操作系统的打包，所以容器文件比虚拟机文件要小很多。&lt;/p&gt;&lt;p&gt;总之，容器有点像轻量级的虚拟机，能够提供虚拟化的环境，但是成本开销小得多。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;&lt;strong&gt;四、Docker 是什么？&lt;/strong&gt;&lt;a href=&quot;#四docker-是什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;*Docker 属于 Linux 容器的一种封装，提供简单易用的容器使用接口。*它是目前最流行的 Linux 容器解决方案。&lt;/p&gt;&lt;p&gt;Docker 将应用程序与该程序的依赖，打包在一个文件里面。运行这个文件，就会生成一个虚拟容器。程序在这个虚拟容器里运行，就好像在真实的物理机上运行一样。有了 Docker，就不用担心环境问题。&lt;/p&gt;&lt;p&gt;总体来说，Docker 的接口相当简单，用户可以方便地创建和使用容器，把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改，就像管理普通的代码一样。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;&lt;strong&gt;五、Docker 的用途&lt;/strong&gt;&lt;a href=&quot;#五docker-的用途&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Docker 的主要用途，目前有三大类。&lt;/p&gt;&lt;p&gt;（1）*提供一次性的环境。*比如，本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。&lt;/p&gt;&lt;p&gt;（2）*提供弹性的云服务。*因为 Docker 容器可以随开随关，很适合动态扩容和缩容。&lt;/p&gt;&lt;p&gt;（3）*组建微服务架构。*通过多个容器，一台机器可以跑多个服务，因此在本机就可以模拟出微服务架构。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;&lt;strong&gt;六、Docker 的安装&lt;/strong&gt;&lt;a href=&quot;#六docker-的安装&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Docker 是一个开源的商业产品，有两个版本：社区版（Community Edition，缩写为 CE）和企业版（Enterprise Edition，缩写为 EE）。企业版包含了一些收费服务，个人开发者一般用不到。下面的介绍都针对社区版。&lt;/p&gt;&lt;p&gt;Docker CE 的安装请参考教程 -&amp;gt; &lt;a href=&quot;https://blog.moewah.com/posts/1467/&quot;&gt;《Linux/VPS 安装 Docker 和 Docker Compose》&lt;/a&gt; 或者官方文档：&lt;a href=&quot;https://docs.docker.com/install/%E3%80%82&quot; target=&quot;_blank&quot;&gt;https://docs.docker.com/install/。&lt;/a&gt;&lt;/p&gt;&lt;p&gt;安装完成后，运行下面的命令，验证是否安装成功。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker version&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 或者&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker info&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;Docker 需要用户具有 sudo 权限，为了避免每次命令都输入sudo，可以把用户加入 Docker 用户组（官方文档）。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ sudo usermod -aG docker $USER&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;Docker 是服务器----客户端架构。命令行运行 docker 命令的时候，需要本机有 Docker 服务。如果这项服务没有启动，可以用下面的命令启动（官方文档）。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# service 命令的用法&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ sudo service docker start&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# systemctl 命令的用法&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ sudo systemctl start docker&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;&lt;strong&gt;七、image 文件&lt;/strong&gt;&lt;a href=&quot;#七image-文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Docker 把应用程序及其依赖，打包在&lt;code&gt;image&lt;/code&gt;文件里面。只有通过这个文件，才能生成 Docker 容器。&lt;code&gt;image&lt;/code&gt; 文件可以看作是容器的模板。Docker 根据 &lt;code&gt;image &lt;/code&gt;文件生成容器的实例。同一个 &lt;code&gt;image&lt;/code&gt; 文件，可以生成多个同时运行的容器实例。&lt;/p&gt;&lt;p&gt;image 是二进制文件。实际开发中，一个 image 文件往往通过继承另一个 image 文件，加上一些个性化设置而生成。举例来说，你可以在 Ubuntu 的 image 基础上，往里面加入 Apache 服务器，形成你的 image。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 列出本机的所有 image 文件。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker image ls&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 删除 image 文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker image rm [imageName]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 一键删除所有none镜像&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker rmi `docker images | grep  &quot;&amp;lt;none&amp;gt;&quot; | awk &apos;{print $3}&apos;`&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;image&lt;/code&gt; 文件是通用的，一台机器的&lt;code&gt; image&lt;/code&gt; 文件拷贝到另一台机器，照样可以使用。一般来说，为了节省时间，我们应该尽量使用别人制作好的&lt;code&gt; image&lt;/code&gt; 文件，而不是自己制作。即使要定制，也应该基于别人的 &lt;code&gt;image&lt;/code&gt; 文件进行加工，而不是从零开始制作。&lt;/p&gt;&lt;p&gt;为了方便共享，&lt;code&gt;image&lt;/code&gt; 文件制作完成后，可以上传到网上的仓库。Docker 的官方仓库 Docker Hub 是最重要、最常用的 &lt;code&gt;image&lt;/code&gt; 仓库。此外，出售自己制作的 &lt;code&gt;image&lt;/code&gt; 文件也是可以的。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;&lt;strong&gt;八、实例：hello world&lt;/strong&gt;&lt;a href=&quot;#八实例hello-world&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;下面，我们通过最简单的&lt;code&gt; image&lt;/code&gt; 文件 “hello world”，感受一下 Docker。&lt;/p&gt;&lt;p&gt;首先，运行下面的命令，将 &lt;code&gt;image&lt;/code&gt; 文件从仓库抓取到本地。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker image pull library/hello-world&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;上面代码中，&lt;code&gt;docker image pull&lt;/code&gt; 是抓取&lt;code&gt; image&lt;/code&gt; 文件的命令。&lt;code&gt;library/hello-world&lt;/code&gt;  是&lt;code&gt; image&lt;/code&gt; 文件在仓库里面的位置，其中&lt;code&gt; library&lt;/code&gt; 是 &lt;code&gt;image&lt;/code&gt; 文件所在的组，hello-world 是 &lt;code&gt;image &lt;/code&gt;文件的名字。&lt;/p&gt;&lt;p&gt;由于 Docker 官方提供的&lt;code&gt; image&lt;/code&gt; 文件，都放在 library 组里面，所以它的是默认组，可以省略。因此，上面的命令可以写成下面这样。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker image pull hello-world&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;抓取成功以后，就可以在本机看到这个 &lt;code&gt;image&lt;/code&gt; 文件了。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker image ls&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;现在，运行这个&lt;code&gt; image&lt;/code&gt; 文件。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker container run hello-world&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;docker container run&lt;/code&gt; 命令会从&lt;code&gt;image&lt;/code&gt;文件，生成一个正在运行的容器实例。&lt;/p&gt;&lt;p&gt;注意，&lt;code&gt;docker container run&lt;/code&gt; 命令具有自动抓取&lt;code&gt; image&lt;/code&gt; 文件的功能。如果发现本地没有指定的 image 文件，就会从仓库自动抓取。因此，前面的 &lt;code&gt;docker image pull&lt;/code&gt; 命令并不是必需的步骤。&lt;/p&gt;&lt;p&gt;如果运行成功，你会在屏幕上读到下面的输出。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker container run hello-world&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Hello from Docker!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;This message shows that your installation appears to be working correctly&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;.... ...&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;输出这段提示以后，hello world 就会停止运行，容器自动终止。&lt;/p&gt;&lt;p&gt;有些容器不会自动终止，因为提供的是服务。比如，安装运行 Ubuntu 的 image，就可以在命令行体验 Ubuntu 系统。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker container run -it ubuntu bash&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;对于那些不会自动终止的容器，必须使用 docker container kill  命令手动终止。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker container kill [containID]&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;&lt;strong&gt;九、容器文件&lt;/strong&gt;&lt;a href=&quot;#九容器文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;*image 文件生成的容器实例，本身也是一个文件，称为容器文件。*也就是说，一旦容器生成，就会同时存在两个文件： image 文件和容器文件。而且关闭容器并不会删除容器文件，只是容器停止运行而已。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 列出本机正在运行的容器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker container ls -l&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 列出本机所有容器，包括终止运行的容器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker container ls --all&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;上面命令的输出结果之中，包括容器的 ID。很多地方都需要提供这个 ID，比如上一节终止容器运行的 &lt;code&gt;docker container kill &lt;/code&gt;命令。&lt;/p&gt;&lt;p&gt;终止运行的容器文件，依然会占据硬盘空间，可以使用 &lt;code&gt;docker container rm&lt;/code&gt; 命令删除。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker container rm [containerID]&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;运行上面的命令之后，再使用 &lt;code&gt;docker container ls --all&lt;/code&gt; 命令，就会发现被删除的容器文件已经消失了。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;&lt;strong&gt;十、Dockerfile 文件&lt;/strong&gt;&lt;a href=&quot;#十dockerfile-文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;学会使用 &lt;code&gt;image&lt;/code&gt; 文件以后，接下来的问题就是，如何可以生成&lt;code&gt; image&lt;/code&gt; 文件？如果你要推广自己的软件，势必要自己制作&lt;code&gt; image&lt;/code&gt; 文件。&lt;/p&gt;&lt;p&gt;这就需要用到&lt;code&gt; Dockerfile&lt;/code&gt; 文件。它是一个文本文件，用来配置&lt;code&gt; image&lt;/code&gt;。Docker 根据该文件生成二进制的 image 文件。&lt;/p&gt;&lt;p&gt;下面通过一个实例，演示如何编写 &lt;code&gt;Dockerfile&lt;/code&gt; 文件。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;&lt;strong&gt;十一、实例：制作自己的 Docker 容器&lt;/strong&gt;&lt;a href=&quot;#十一实例制作自己的-docker-容器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;下面我以 koa-demos 项目为例，介绍怎么写&lt;code&gt; Dockerfile&lt;/code&gt; 文件，实现让用户在 Docker 容器里面运行 Koa 框架。&lt;/p&gt;&lt;p&gt;作为准备工作，请先下载源码。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ git clone https://github.com/ruanyf/koa-demos.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ cd koa-demos&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;section&gt;&lt;h3&gt;11.1 编写 Dockerfile 文件&lt;a href=&quot;#111-编写-dockerfile-文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;首先，在项目的根目录下，新建一个文本文件.dockerignore，写入下面的内容。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;node_modules&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm-debug.log&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;上面代码表示，这三个路径要排除，不要打包进入 image 文件。如果你没有路径要排除，这个文件可以不新建。&lt;/p&gt;&lt;p&gt;然后，在项目的根目录下，新建一个文本文件 Dockerfile，写入下面的内容。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;FROM node:8.4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;COPY . /app&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;WORKDIR /app&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;RUN npm install --registry=https://registry.npm.taobao.org&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;EXPOSE 3000&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;上面代码一共五行，含义如下。&lt;/p&gt;&lt;blockquote&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;FROM node:8.4&lt;/code&gt;：该 image 文件继承官方的 &lt;code&gt;node image&lt;/code&gt;，冒号表示标签，这里标签是8.4，即8.4版本的 node。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;COPY . /app&lt;/code&gt;：将当前目录下的所有文件（除了&lt;code&gt;.dockerignore&lt;/code&gt;排除的路径），都拷贝进入 &lt;code&gt;image&lt;/code&gt; 文件的&lt;code&gt;/app&lt;/code&gt;目录。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WORKDIR /app&lt;/code&gt;：指定接下来的工作路径为/app。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RUN npm install&lt;/code&gt;：在&lt;code&gt;/app&lt;/code&gt;目录下，运行&lt;code&gt;npm install&lt;/code&gt;命令安装依赖。注意，安装后所有的依赖，都将打包进入 &lt;code&gt;image&lt;/code&gt; 文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;EXPOSE 3000&lt;/code&gt;：将容器 3000 端口暴露出来， 允许外部连接这个端口。&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;&lt;a href=&quot;#-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;11.2 创建 image 文件&lt;a href=&quot;#112-创建-image-文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;有了 Dockerfile 文件以后，就可以使用 docker image build 命令创建 image 文件了。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker image build -t koa-demo .&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 或者&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker image build -t koa-demo:0.0.1 .&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;上面代码中，-t 参数用来指定 image 文件的名字，后面还可以用冒号指定标签。如果不指定，默认的标签就是 latest。最后的那个点表示 Dockerfile 文件所在的路径，上例是当前路径，所以是一个点。&lt;/p&gt;&lt;p&gt;如果运行成功，就可以看到新生成的 image 文件 koa-demo 了。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker image ls&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;11.3 生成容器&lt;a href=&quot;#113-生成容器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;docker container run&lt;/code&gt; 命令会从&lt;code&gt; image&lt;/code&gt; 文件生成容器。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker container run -p 8000:3000 -it koa-demo /bin/bash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 或者&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker container run -p 8000:3000 -it koa-demo:0.0.1 /bin/bash&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;上面命令的各个参数含义如下：&lt;/p&gt;&lt;blockquote&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-p&lt;/code&gt;参数：容器的 3000 端口映射到本机的 8000 端口。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-it&lt;/code&gt;参数：容器的 Shell 映射到当前的 Shell，然后你在本机窗口输入的命令，就会传入容器。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;koa-demo:0.0.1&lt;/code&gt;：image 文件的名字（如果有标签，还需要提供标签，默认是 latest 标签）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/bin/bash&lt;/code&gt;：容器启动以后，内部第一个执行的命令。这里是启动 Bash，保证用户可以使用 Shell。&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;p&gt;如果一切正常，运行上面的命令以后，就会返回一个命令行提示符。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;root@66d80f4aaf1e:/app#&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这表示你已经在容器里面了，返回的提示符就是容器内部的 Shell 提示符。执行下面的命令。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;root@66d80f4aaf1e:/app# node demos/01.js&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这时，Koa 框架已经运行起来了。打开本机的浏览器，访问&lt;code&gt; http://127.0.0.1:8000&lt;/code&gt;，网页显示”Not Found”，这是因为这个 demo 没有写路由。&lt;/p&gt;&lt;p&gt;这个例子中，Node 进程运行在 Docker 容器的虚拟环境里面，进程接触到的文件系统和网络接口都是虚拟的，与本机的文件系统和网络接口是隔离的，因此需要定义容器与物理机的端口映射（map）。&lt;/p&gt;&lt;p&gt;现在，在容器的命令行，按下 &lt;code&gt;Ctrl + c&lt;/code&gt; 停止 Node 进程，然后按下 &lt;code&gt;Ctrl + d&lt;/code&gt; （或者输入 &lt;code&gt;exit&lt;/code&gt;）退出容器。此外，也可以用&lt;code&gt; docker container kill&lt;/code&gt; 终止容器运行。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 在本机的另一个终端窗口，查出容器的 ID&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker container ls&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 停止指定的容器运行&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker container kill [containerID]&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;容器停止运行之后，并不会消失，用下面的命令删除容器文件。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 查出容器的 ID&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker container ls --all&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 删除指定的容器文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker container rm [containerID]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#删除已经退出运行的容器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker ps -a | grep &quot;Exited&quot; | awk &apos;{print $1 }&apos;|xargs docker rm&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;也可以使用 &lt;code&gt;docker container run&lt;/code&gt; 命令的 &lt;code&gt;--rm&lt;/code&gt; 参数，在容器终止运行后自动删除容器文件。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker container run --rm -p 8000:3000 -it koa-demo /bin/bash&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;&lt;a href=&quot;#-2&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;11.4 CMD 命令&lt;a href=&quot;#114-cmd-命令&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;上一节的例子里面，容器启动以后，需要手动输入命令 &lt;code&gt;node demos/01.js&lt;/code&gt;。我们可以把这个命令写在 &lt;code&gt;Dockerfile&lt;/code&gt; 里面，这样容器启动以后，这个命令就已经执行了，不用再手动输入了。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;FROM node:8.4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;COPY . /app&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;WORKDIR /app&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;RUN npm install --registry=https://registry.npm.taobao.org&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;EXPOSE 3000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;CMD node demos/01.js&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;上面的 &lt;code&gt;Dockerfil&lt;/code&gt;e 里面，多了最后一行 &lt;code&gt;CMD node demos/01.js&lt;/code&gt;，它表示容器启动后自动执行 &lt;code&gt;node demos/01.js&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;你可能会问，RUN 命令与 CMD 命令的区别在哪里？简单说，&lt;code&gt;RUN&lt;/code&gt; 命令在&lt;code&gt; image&lt;/code&gt; 文件的构建阶段执行，执行结果都会打包进入 &lt;code&gt;image&lt;/code&gt; 文件；CMD 命令则是在容器启动后执行。另外，一个&lt;code&gt;Dockerfile&lt;/code&gt;可以包含多个 &lt;code&gt;RUN&lt;/code&gt; 命令，但是只能有一个 CMD 命令。&lt;/p&gt;&lt;p&gt;注意，指定了 CMD 命令以后，&lt;code&gt;docker container run&lt;/code&gt; 命令就不能附加命令了（比如前面的 /bin/bash），否则它会覆盖 CMD 命令。现在，启动容器可以使用下面的命令。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker container run --rm -p 8000:3000 -it koa-demo:0.0.1&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;&lt;a href=&quot;#-3&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;11.5 发布 image 文件&lt;a href=&quot;#115-发布-image-文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;容器运行成功后，就确认了&lt;code&gt; image&lt;/code&gt; 文件的有效性。这时，我们就可以考虑把 image 文件分享到网上，让其他人使用。&lt;/p&gt;&lt;p&gt;首先，去 &lt;code&gt;hub.docker.com&lt;/code&gt; 或 &lt;code&gt;cloud.docker.com&lt;/code&gt; 注册一个账户。然后，用下面的命令登录。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker login&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;接着，为本地的 &lt;code&gt;image&lt;/code&gt; 标注用户名和版本。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker image tag [imageName] [username]/[repository]:[tag]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 实例&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker image tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;也可以不标注用户名，重新构建一下&lt;code&gt; image&lt;/code&gt; 文件。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker image build -t [username]/[repository]:[tag] .&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;最后，发布 &lt;code&gt;image&lt;/code&gt; 文件。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker image push [username]/[repository]:[tag]&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;发布成功以后，登录 &lt;code&gt;hub.docker.com&lt;/code&gt;，就可以看到已经发布的&lt;code&gt; image&lt;/code&gt; 文件。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;&lt;a href=&quot;#-4&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;&lt;strong&gt;十二、其他有用的命令&lt;/strong&gt;&lt;a href=&quot;#十二其他有用的命令&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;docker 的主要用法就是上面这些，此外还有几个命令，也非常有用。&lt;/p&gt;&lt;p&gt;&lt;em&gt;（1）docker container start&lt;/em&gt;&lt;/p&gt;&lt;p&gt;前面的 docker container run 命令是新建容器，每运行一次，就会新建一个容器。同样的命令运行两次，就会生成两个一模一样的容器文件。如果希望重复使用容器，就要使用 docker container start 命令，它用来启动已经生成、已经停止运行的容器文件。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker container start [containerID]&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;（2）docker container stop&lt;/em&gt;&lt;/p&gt;&lt;p&gt;前面的 docker container kill 命令终止容器运行，相当于向容器里面的主进程发出 SIGKILL 信号。而 docker container stop 命令也是用来终止容器运行，相当于向容器里面的主进程发出 SIGTERM 信号，然后过一段时间再发出 SIGKILL 信号。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker container stop [containerID]&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这两个信号的差别是，应用程序收到 SIGTERM 信号以后，可以自行进行收尾清理工作，但也可以不理会这个信号。如果收到 SIGKILL 信号，就会强行立即终止，那些正在进行中的操作会全部丢失。&lt;/p&gt;&lt;p&gt;&lt;em&gt;（3）docker container logs&lt;/em&gt;&lt;/p&gt;&lt;p&gt;docker container logs 命令用来查看 docker 容器的输出，即容器里面 Shell 的标准输出。如果 docker run 命令运行容器的时候，没有使用 -it 参数，就要用这个命令查看输出。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker container logs [containerID]&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;（4）docker container exec&lt;/em&gt;&lt;/p&gt;&lt;p&gt;docker container exec 命令用于进入一个正在运行的 docker 容器。如果 docker run 命令运行容器的时候，没有使用 -it 参数，就要用这个命令进入容器。一旦进入了容器，就可以在容器的 Shell 执行命令了。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker container exec -it [containerID] /bin/bash&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;（5）docker container cp&lt;/em&gt;&lt;/p&gt;&lt;p&gt;docker container cp 命令用于从正在运行的 Docker 容器里面，将文件拷贝到本机。下面是拷贝到当前目录的写法。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$ docker container cp [containID]:[/path/to/file] .&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded></item><item><title>Linux VPS 技巧：让进程在后台稳定运行的 4 种方法</title><link>https://blog.moewah.com/posts/1678/</link><guid isPermaLink="true">https://blog.moewah.com/posts/1678/</guid><description>SSH连接中断导致Linux VPS后台进程挂掉？本文提供4种实用方法：nohup、setsid、screen和tmux，确保任务持续稳定运行。掌握这些技巧，避免数据丢失和工作中断！</description><pubDate>Mon, 06 May 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;SSH 连上远程服务器跑个任务，结果网断了，任务也跟着挂。这种经历太常见。&lt;/p&gt;
&lt;p&gt;Unix 早期，终端通过 modem 连接系统，用户 logout 时 modem 挂断电话，终端收到 hangup 信号，关闭所有子进程。现在网络不稳定，照样触发这个信号。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; width=&quot;646&quot; height=&quot;258&quot; src=&quot;/_astro/1678_3775829728.BCeeUZiP_Z1ChkJO.webp&quot; srcset=&quot;/_astro/1678_3775829728.BCeeUZiP_2a0C0X.webp 640w, /_astro/1678_3775829728.BCeeUZiP_Z1ChkJO.webp 646w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;那么，怎么让命令提交后不受终端关闭的影响？几种方案各有适用场景。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;1. nohup - 最简单的临时方案&lt;a href=&quot;#1-nohup---最简单的临时方案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;nohup&lt;/code&gt; 让程序忽略 hangup 信号。输出默认写到 &lt;code&gt;nohup.out&lt;/code&gt;，当前目录写不下就写到 &lt;code&gt;$HOME/nohup.out&lt;/code&gt;。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nohup python train.py &amp;gt; output.log 2&amp;gt;&amp;amp;1 &amp;amp;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;需要后台稳定跑个脚本，这个够用。输出重定向到 &lt;code&gt;output.log&lt;/code&gt;，&lt;code&gt;2&amp;gt;&amp;amp;1&lt;/code&gt; 把标准错误也合并进去。末尾的 &lt;code&gt;&amp;amp;&lt;/code&gt; 让程序立即放后台。&lt;/p&gt;&lt;p&gt;缺点也很明显：&lt;strong&gt;只能忽略 hangup 信号，如果脚本本身需要交互就不行&lt;/strong&gt;。没有会话管理功能，只能通过 ps 和 kill 来管理进程。&lt;/p&gt;&lt;p&gt;nohup 是系统自带工具，所有 Linux 发行版都内置。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;2. setsid - 创建独立会话&lt;a href=&quot;#2-setsid---创建独立会话&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;setsid&lt;/code&gt; 创建新会话，进程的父进程变成 init（pid 1），不再属于当前终端。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;setsid python server.py &amp;gt; server.log 2&amp;gt;&amp;amp;1 &amp;amp;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;比 nohup 更彻底，整个会话都脱离了终端。ps -ef 查看会发现 ppid 是 1。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;注意输出必须手动重定向，setsid 不会帮你处理&lt;/strong&gt;。适合那些不需要终端交互、纯后台运行的服务。&lt;/p&gt;&lt;p&gt;setsid 也是系统自带工具，无需安装。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;3. screen - 经典终端复用器&lt;a href=&quot;#3-screen---经典终端复用器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;screen 比 nohup/setsid 强大得多。它创建虚拟终端，里面可以跑多个窗口，网络断了也能恢复会话。&lt;/p&gt;&lt;section&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;Debian/Ubuntu：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;screen&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;CentOS/RHEL：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yum&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;screen&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 或 CentOS 8/RHEL 8+&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dnf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;screen&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;screen -S training&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;在 screen 里面正常执行命令。需要临时离开：&lt;/p&gt;&lt;p&gt;&lt;code&gt;Ctrl+A&lt;/code&gt; 然后 &lt;code&gt;D&lt;/code&gt;&lt;/p&gt;&lt;p&gt;会话脱离，程序继续在后台跑。&lt;/p&gt;&lt;p&gt;查看所有会话：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;screen -ls&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;重新连接：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;screen -r training&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果忘了会话名称，&lt;code&gt;screen -ls&lt;/code&gt; 会列出所有，用 PID 或名字都能恢复。&lt;/p&gt;&lt;p&gt;关闭会话：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;exit&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;或者先 detach 再用 &lt;code&gt;screen -X -S training quit&lt;/code&gt; 杀掉。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;screen 最适合需要交互式命令的场景&lt;/strong&gt;。训练模型、编译代码、跑测试，用 screen 可以随时离开回来，不用任务管理。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;4. tmux - 现代终端复用器&lt;a href=&quot;#4-tmux---现代终端复用器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;tmux 是 screen 的现代替代品，功能更丰富，配置更灵活。窗口、窗格、会话三级管理，操作更直观。&lt;/p&gt;&lt;section&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;strong&gt;Debian/Ubuntu：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;CentOS/RHEL：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yum&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 或 CentOS 8/RHEL 8+&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dnf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tmux&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tmux new -s training&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;tmux 的快捷键是 &lt;code&gt;Ctrl+B&lt;/code&gt;（和 screen 的 &lt;code&gt;Ctrl+A&lt;/code&gt; 类似）。&lt;/p&gt;&lt;p&gt;脱离会话：
&lt;code&gt;Ctrl+B&lt;/code&gt; 然后 &lt;code&gt;D&lt;/code&gt;&lt;/p&gt;&lt;p&gt;查看会话列表：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tmux ls&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;恢复会话：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tmux attach -t training&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;tmux 支持水平/垂直分屏：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ctrl+B&lt;/code&gt; 然后 &lt;code&gt;%&lt;/code&gt;（垂直分屏）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Ctrl+B&lt;/code&gt; 然后 &lt;code&gt;&quot;&lt;/code&gt;（水平分屏）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Ctrl+B&lt;/code&gt; 然后 &lt;code&gt;方向键&lt;/code&gt;（切换窗格）&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;滚动查看历史输出：
&lt;code&gt;Ctrl+B&lt;/code&gt; 然后 &lt;code&gt;[&lt;/code&gt; 进入复制模式，用方向键或 PgUp/PgDn 浏览，&lt;code&gt;q&lt;/code&gt; 退出。&lt;/p&gt;&lt;p&gt;关闭会话：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;exit&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;或者：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tmux kill-session -t training&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;tmux 适合需要多窗口多任务协作的场景&lt;/strong&gt;。一边看日志，一边执行命令，还能分屏监控多个进程。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;nohup&lt;/strong&gt;
脱离终端就行，不需要管理 → &lt;strong&gt;setsid&lt;/strong&gt;
需要交互、随时恢复 → &lt;strong&gt;screen&lt;/strong&gt;
现代工具、多窗口协作 → &lt;strong&gt;tmux&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我个人常用 tmux，分屏查看日志特别方便。服务器上跑长时间任务，直接新建个 tmux 会话，网断了随时重连。&lt;strong&gt;生产环境的服务管理，推荐用 systemd 或 supervisor&lt;/strong&gt;，但那是另一个话题了。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>群晖NAS安装Emby媒体服务器避坑指南</title><link>https://blog.moewah.com/posts/1579/</link><guid isPermaLink="true">https://blog.moewah.com/posts/1579/</guid><description>群晖NAS安装Emby无法启动怎么办？本文详细解决黑群晖用户在套件中心安装Emby时因CPU型号不匹配导致的启动失败问题，提供官方解决方案和套件来源修改方法，助你顺利部署媒体服务器。</description><pubDate>Tue, 23 Apr 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt; 对于媒体服务器程序这块，博主目前用的是 &lt;code&gt;Jellyfin&lt;/code&gt;，有兴趣的话可以翻看之前的文章 &lt;a href=&quot;https://blog.moewah.com/posts/1552/&quot;&gt;《群晖NAS使用Docker安装Jellyfin媒体服务器》&lt;/a&gt; ，工具不嫌多，所以今天把 &lt;strong&gt;Jellyfin&lt;/strong&gt; 的老祖宗 &lt;strong&gt;Emby&lt;/strong&gt; 的安装使用教程也补充一下，供大家选择。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Emby-Server-Release-featured.jpg&quot; loading=&quot;lazy&quot; width=&quot;740&quot; height=&quot;400&quot; src=&quot;/_astro/1579_3495569815_99bf39.CN-eojFd_1jCoas.webp&quot; srcset=&quot;/_astro/1579_3495569815_99bf39.CN-eojFd_2uOx81.webp 640w, /_astro/1579_3495569815_99bf39.CN-eojFd_1jCoas.webp 740w&quot; /&gt;&lt;figcaption&gt;Emby-Server-Release-featured.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&gt;&lt;h3&gt;Emby Server服务端安装&lt;a href=&quot;#emby-server服务端安装&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;首先在&lt;strong&gt;套件中心&lt;/strong&gt; 的设置中，&lt;strong&gt;新增套件来源&lt;/strong&gt; ，这里要注意&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;黑群晖用户使用：https://synology.emby.media/?package_repository=360efc6e-de72-4073-b603-2bfbd7001586&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;白群晖可以直接用：https://synology.emby.media/&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;1.新增套件来源.png&quot; loading=&quot;lazy&quot; width=&quot;2087&quot; height=&quot;1168&quot; src=&quot;/_astro/1579_3661447771_9493aa.CHmIXVn7_Z1hhFSi.webp&quot; srcset=&quot;/_astro/1579_3661447771_9493aa.CHmIXVn7_Z2d1dU2.webp 640w, /_astro/1579_3661447771_9493aa.CHmIXVn7_Z1FXPwT.webp 750w, /_astro/1579_3661447771_9493aa.CHmIXVn7_ZH61UG.webp 828w, /_astro/1579_3661447771_9493aa.CHmIXVn7_1X1U8N.webp 1080w, /_astro/1579_3661447771_9493aa.CHmIXVn7_qIaV9.webp 1280w, /_astro/1579_3661447771_9493aa.CHmIXVn7_IqBJG.webp 1668w, /_astro/1579_3661447771_9493aa.CHmIXVn7_Z2lnrEO.webp 2048w, /_astro/1579_3661447771_9493aa.CHmIXVn7_Z1hhFSi.webp 2087w&quot; /&gt;&lt;figcaption&gt;1.新增套件来源.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;新增完成后就可以在套件中心的社群里找到&lt;code&gt;Emby Server&lt;/code&gt;来安装套件；&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;2.安装套件.png&quot; loading=&quot;lazy&quot; width=&quot;2072&quot; height=&quot;1162&quot; src=&quot;/_astro/1579_1942777443_ab00db.DOK_oQGX_1iwIj0.webp&quot; srcset=&quot;/_astro/1579_1942777443_ab00db.DOK_oQGX_1eMoTA.webp 640w, /_astro/1579_1942777443_ab00db.DOK_oQGX_1KOMhI.webp 750w, /_astro/1579_1942777443_ab00db.DOK_oQGX_Z2ktwU0.webp 828w, /_astro/1579_1942777443_ab00db.DOK_oQGX_Z1Dn57N.webp 1080w, /_astro/1579_1942777443_ab00db.DOK_oQGX_1Tvjtt.webp 1280w, /_astro/1579_1942777443_ab00db.DOK_oQGX_14tjhn.webp 1668w, /_astro/1579_1942777443_ab00db.DOK_oQGX_f97S9.webp 2048w, /_astro/1579_1942777443_ab00db.DOK_oQGX_1iwIj0.webp 2072w&quot; /&gt;&lt;figcaption&gt;2.安装套件.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;这里我遇到一个问题，&lt;code&gt;Emby Sever&lt;/code&gt;无法启动，如果你没有遇到这个问题可以跳过这一步；（一般新一点的CPU都不会遇到这个问题，而且搜不太到中文的解决方案，所以我来发一下）&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;3.遇到一个问题，无法启动.png&quot; loading=&quot;lazy&quot; width=&quot;389&quot; height=&quot;747&quot; src=&quot;/_astro/1579_4292316695_d1eb42.CvUBGNnG_1jPP7n.webp&quot; srcset=&quot;/_astro/1579_4292316695_d1eb42.CvUBGNnG_1jPP7n.webp 389w&quot; /&gt;&lt;figcaption&gt;3.遇到一个问题，无法启动.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;这里有官方对黑群晖使用说明 -&amp;gt; &lt;a href=&quot;https://emby.media/community/index.php?/topic/40411-xpenology-users-read-me/&quot; target=&quot;_blank&quot;&gt;点击了解&lt;/a&gt;，里面有提到无法启动的情况，简单的说就是黑群晖为了伪装，它在运行的时候报告的CPU型号是不对的，由于不同CPU架构支持的指令集和功能不同，所以才会导致无法启动；&lt;/p&gt;&lt;p&gt;&lt;strong&gt;那么怎么解决呢？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;简单的说就是你需要找到你对应CPU型号的包，可以在官网查询获得 -&amp;gt; &lt;a href=&quot;https://www.synology.com/zh-tw/knowledgebase/DSM/tutorial/Compatibility_Peripherals/What_kind_of_CPU_does_my_NAS_have&quot; target=&quot;_blank&quot;&gt;群晖CPU型号对照查询&lt;/a&gt;，比如我的CPU实际是AMD的T56N， -&amp;gt; &lt;a href=&quot;https://github.com/MediaBrowser/Wiki/wiki/Synology-:-Custom-Package-Architectures-for-XPEnology&quot; target=&quot;_blank&quot;&gt;参考官方说明&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;4.参考CPU型号.png&quot; loading=&quot;lazy&quot; width=&quot;1521&quot; height=&quot;955&quot; src=&quot;/_astro/1579_3064453245_0b0116.D9R6reWb_4pDbB.webp&quot; srcset=&quot;/_astro/1579_3064453245_0b0116.D9R6reWb_wszqp.webp 640w, /_astro/1579_3064453245_0b0116.D9R6reWb_Z6j6el.webp 750w, /_astro/1579_3064453245_0b0116.D9R6reWb_Z28Lhf6.webp 828w, /_astro/1579_3064453245_0b0116.D9R6reWb_Z8F5iu.webp 1080w, /_astro/1579_3064453245_0b0116.D9R6reWb_27cVGd.webp 1280w, /_astro/1579_3064453245_0b0116.D9R6reWb_4pDbB.webp 1521w&quot; /&gt;&lt;figcaption&gt;4.参考CPU型号.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;修改&lt;strong&gt;套件来源&lt;/strong&gt; 为（修改最后一段package_architecture=）&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;https://synology.emby.media/?package_repository=360efc6e-de72-4073-b603-2bfbd7001586&amp;amp;package_architecture=xpen-barcelona&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后重新安装，就搞定啦。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;5.启动成功.png&quot; loading=&quot;lazy&quot; width=&quot;376&quot; height=&quot;682&quot; src=&quot;/_astro/1579_3342408960_61f45f.Cc46eFUn_Z2gvId0.webp&quot; srcset=&quot;/_astro/1579_3342408960_61f45f.Cc46eFUn_Z2gvId0.webp 376w&quot; /&gt;&lt;figcaption&gt;5.启动成功.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;点击菜单里的&lt;code&gt;Emby Server&lt;/code&gt;图标进入服务设置，第一步是选择语言，然而并不知道为啥这个时候没有生效；&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;6.选择语言.png&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;979&quot; src=&quot;/_astro/1579_2969788377_dda299.D1FtQfNq_Z94Ddw.webp&quot; srcset=&quot;/_astro/1579_2969788377_dda299.D1FtQfNq_Z2nKKKb.webp 640w, /_astro/1579_2969788377_dda299.D1FtQfNq_E7Tc6.webp 750w, /_astro/1579_2969788377_dda299.D1FtQfNq_1kIStQ.webp 828w, /_astro/1579_2969788377_dda299.D1FtQfNq_Z1SdH0F.webp 1080w, /_astro/1579_2969788377_dda299.D1FtQfNq_Z1x8mNw.webp 1280w, /_astro/1579_2969788377_dda299.D1FtQfNq_1czhqO.webp 1668w, /_astro/1579_2969788377_dda299.D1FtQfNq_R1Di4.webp 2048w, /_astro/1579_2969788377_dda299.D1FtQfNq_Z94Ddw.webp 2560w&quot; /&gt;&lt;figcaption&gt;6.选择语言.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;给服务起个名字并关联Emby账号;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;#注册地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;https://emby.media/community/index.php?app=core&amp;amp;module=global§ion=register&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;7.起名关联账号.png&quot; loading=&quot;lazy&quot; width=&quot;768&quot; height=&quot;395&quot; src=&quot;/_astro/1579_1342595_ae33bf.CR7C0-gB_1Xptxw.webp&quot; srcset=&quot;/_astro/1579_1342595_ae33bf.CR7C0-gB_1YsQBb.webp 640w, /_astro/1579_1342595_ae33bf.CR7C0-gB_Z1tMKht.webp 750w, /_astro/1579_1342595_ae33bf.CR7C0-gB_1Xptxw.webp 768w&quot; /&gt;&lt;figcaption&gt;7.起名关联账号.png&lt;/figcaption&gt;&lt;/figure&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;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;8.添加媒体库.png&quot; loading=&quot;lazy&quot; width=&quot;768&quot; height=&quot;395&quot; src=&quot;/_astro/1579_3944454067_28aa7d.DIrcb7qR_1dDzX5.webp&quot; srcset=&quot;/_astro/1579_3944454067_28aa7d.DIrcb7qR_Z1lmnVY.webp 640w, /_astro/1579_3944454067_28aa7d.DIrcb7qR_BLaJ4.webp 750w, /_astro/1579_3944454067_28aa7d.DIrcb7qR_1dDzX5.webp 768w&quot; /&gt;&lt;figcaption&gt;8.添加媒体库.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;这里是选择媒体库默认设置国家和语言；&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;9.选择国家语言-1.png&quot; loading=&quot;lazy&quot; width=&quot;768&quot; height=&quot;395&quot; src=&quot;/_astro/1579_2484680848_22df0b.DIaxiese_ThGOn.webp&quot; srcset=&quot;/_astro/1579_2484680848_22df0b.DIaxiese_Z1EIh5G.webp 640w, /_astro/1579_2484680848_22df0b.DIaxiese_iphAm.webp 750w, /_astro/1579_2484680848_22df0b.DIaxiese_ThGOn.webp 768w&quot; /&gt;&lt;figcaption&gt;9.选择国家语言-1.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;这里有两个设置，第一个是是否允许远程连接你的服务，比如&lt;code&gt;APP&lt;/code&gt;啊，第二个是是否自动设置端口转发，这个需要路由器支持&lt;code&gt;UPnP&lt;/code&gt;，而且你要有公网端口；&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;10.两个设置.png&quot; loading=&quot;lazy&quot; width=&quot;768&quot; height=&quot;395&quot; src=&quot;/_astro/1579_3340359094_cb21d4.DgcOnxYk_Z2susqW.webp&quot; srcset=&quot;/_astro/1579_3340359094_cb21d4.DgcOnxYk_2FGrU.webp 640w, /_astro/1579_3340359094_cb21d4.DgcOnxYk_20Og8X.webp 750w, /_astro/1579_3340359094_cb21d4.DgcOnxYk_Z2susqW.webp 768w&quot; /&gt;&lt;figcaption&gt;10.两个设置.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;同意就好了；&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;11.同意.png&quot; loading=&quot;lazy&quot; width=&quot;768&quot; height=&quot;395&quot; src=&quot;/_astro/1579_2009430214_a43aee.CrN5WgG__1Qy1mv.webp&quot; srcset=&quot;/_astro/1579_2009430214_a43aee.CrN5WgG__ZHrWxy.webp 640w, /_astro/1579_2009430214_a43aee.CrN5WgG__1fFB8u.webp 750w, /_astro/1579_2009430214_a43aee.CrN5WgG__1Qy1mv.webp 768w&quot; /&gt;&lt;figcaption&gt;11.同意.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;设置完就进入服务器了，但是还是英文的，这里进入设置重新保存下语言设置就可以变成中文了。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;12.设置语言.png&quot; loading=&quot;lazy&quot; width=&quot;768&quot; height=&quot;395&quot; src=&quot;/_astro/1579_2355301486_aaee52.DyOwuXKI_ZUWFYg.webp&quot; srcset=&quot;/_astro/1579_2355301486_aaee52.DyOwuXKI_1zdsTB.webp 640w, /_astro/1579_2355301486_aaee52.DyOwuXKI_Z1wP6dh.webp 750w, /_astro/1579_2355301486_aaee52.DyOwuXKI_ZUWFYg.webp 768w&quot; /&gt;&lt;figcaption&gt;12.设置语言.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;搞定，教程到此结束。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>免费开源媒体服务器Jellyfin安装教程（Emby替代）</title><link>https://blog.moewah.com/posts/1545/</link><guid isPermaLink="true">https://blog.moewah.com/posts/1545/</guid><description>如何搭建免费开源的个人媒体服务器？本文详细讲解Jellyfin安装流程，替代Emby和Plex，支持跨平台使用，提供从Linux系统到Docker的完整部署方案，助你轻松搭建私有化媒体中心。</description><pubDate>Mon, 22 Apr 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt; 目前比较火的个人媒体服务器差不多是&lt;code&gt;Plex&lt;/code&gt;和&lt;code&gt;Emby&lt;/code&gt;，两款都挺强大的，现在再说个最近才出来的一个媒体服务器&lt;code&gt;Jellyfin&lt;/code&gt;，功能上是和&lt;code&gt;Emby&lt;/code&gt;差不多的。按照官方的说法是，由于&lt;code&gt;Emby 3.6&lt;/code&gt;开始闭源后，引起了一些核心开发人员的不满，所以最近在&lt;code&gt;Emby&lt;/code&gt;的基础上单独开发了&lt;code&gt;Jellyfin&lt;/code&gt;媒体服务器，致力于让所有用户都能访问最好的媒体系统。并且可以将&lt;code&gt;Emby&lt;/code&gt;版本&lt;code&gt;3.5.2&lt;/code&gt;及之前的数据无缝迁移过来。前景是很不错的，这里就发下搭建教程。&lt;/p&gt;
&lt;section&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;Jellyfin&lt;/code&gt;是一个自由软件媒体系统，可让您控制媒体的管理和流媒体。它是专有的&lt;code&gt;Emby&lt;/code&gt;和&lt;code&gt;Plex&lt;/code&gt;的替代品，可通过多个应用程序从专用服务器向终端用户设备提供媒体。&lt;code&gt;Jellyfin&lt;/code&gt;是&lt;code&gt;Emby 3.5.2&lt;/code&gt;版本的后代，移植到&lt;code&gt;.NET Core&lt;/code&gt;框架以支持完整的跨平台支持。没有任何附加条件，只是一个团队想要更好地构建更好的东西并共同努力实现它，致力于让所有用户都能访问最好的媒体系统。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;img alt=&quot;17.png&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;938&quot; src=&quot;/_astro/1545_3075366208_868bb9.5L3pMBCM_1ucY8D.webp&quot; srcset=&quot;/_astro/1545_3075366208_868bb9.5L3pMBCM_1dbxID.webp 640w, /_astro/1545_3075366208_868bb9.5L3pMBCM_2uCeGV.webp 750w, /_astro/1545_3075366208_868bb9.5L3pMBCM_fVob2.webp 828w, /_astro/1545_3075366208_868bb9.5L3pMBCM_Z19BH4a.webp 1080w, /_astro/1545_3075366208_868bb9.5L3pMBCM_ZjnTHY.webp 1280w, /_astro/1545_3075366208_868bb9.5L3pMBCM_1n3uFr.webp 1668w, /_astro/1545_3075366208_868bb9.5L3pMBCM_1ucY8D.webp 1920w&quot; /&gt;&lt;figcaption&gt;17.png&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img alt=&quot;20.png&quot; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;492&quot; src=&quot;/_astro/1545_2172870696_b35624.DHeBRB94_LpLyR.webp&quot; srcset=&quot;/_astro/1545_2172870696_b35624.DHeBRB94_1dQYu3.webp 640w, /_astro/1545_2172870696_b35624.DHeBRB94_xC1Xd.webp 750w, /_astro/1545_2172870696_b35624.DHeBRB94_gBOVr.webp 828w, /_astro/1545_2172870696_b35624.DHeBRB94_LpLyR.webp 1000w&quot; /&gt;&lt;figcaption&gt;20.png&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img alt=&quot;19-1.png&quot; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;492&quot; src=&quot;/_astro/1545_566748763_021a7e.BIQ7peja_NetEf.webp&quot; srcset=&quot;/_astro/1545_566748763_021a7e.BIQ7peja_HcSgF.webp 640w, /_astro/1545_566748763_021a7e.BIQ7peja_2dUR9A.webp 750w, /_astro/1545_566748763_021a7e.BIQ7peja_Z8ccht.webp 828w, /_astro/1545_566748763_021a7e.BIQ7peja_NetEf.webp 1000w&quot; /&gt;&lt;figcaption&gt;19-1.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&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;Github地址：&lt;/strong&gt; &lt;a href=&quot;https://github.com/jellyfin/jellyfin&quot; target=&quot;_blank&quot;&gt;https://github.com/jellyfin/jellyfin&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Jellyfin客户端：&lt;/strong&gt; &lt;a href=&quot;https://jellyfin.org/docs/general/clients/index.html&quot; target=&quot;_blank&quot;&gt;https://jellyfin.org/docs/general/clients/index.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;这里主要说&lt;code&gt;Linux&lt;/code&gt;系统的安装方法；&lt;code&gt;Windows&lt;/code&gt;系统直接下载文件就行了，下载地址→&lt;a href=&quot;https://repo.jellyfin.org/releases/server/windows/&quot; target=&quot;_blank&quot;&gt;传送门&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;&lt;code&gt;Linux&lt;/code&gt;系统的安装方法有&lt;code&gt;3&lt;/code&gt;种，使用软件库、软件包、&lt;code&gt;Docker&lt;/code&gt;安装。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1、使用软件库安装&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;该方法适用于&lt;code&gt;Debian 9+&lt;/code&gt;和&lt;code&gt;Debian 10+&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;导入&lt;code&gt;GPG&lt;/code&gt;签名密钥：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo apt install apt-transport-https&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget -O - https://repo.jellyfin.org/debian/jellyfin_team.gpg.key | sudo apt-key add -&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;配置存储库：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo &quot;deb [arch=$( dpkg --print-architecture )] https://repo.jellyfin.org/debian $( lsb_release -c -s ) main&quot; | sudo tee /etc/apt/sources.list.d/jellyfin.list&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;最后安装&lt;code&gt;Jellyfin&lt;/code&gt;:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#更新存储库&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt update&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#安装jellyfin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo apt install jellyfin&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后就可以通过&lt;code&gt;ip:8096&lt;/code&gt;访问该媒体库了。端口可以在面板里自行修改。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#相关使用命令&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;重启程序：sudo systemctl restart jellyfin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;查看状态：sudo service jellyfin status&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;开机自启：systemctl enable jellyfin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;停止程序：sudo /etc/init.d/jellyfin stop&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2、使用软件包安装&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;首先下载软件包，下载地址→&lt;a href=&quot;https://repo.jellyfin.org/releases/server/&quot; target=&quot;_blank&quot;&gt;传送门&lt;/a&gt;，目前支持系统有&lt;code&gt;Win&lt;/code&gt;、&lt;code&gt;Mac&lt;/code&gt;、&lt;code&gt;Arch&lt;/code&gt;等&lt;code&gt;Linux&lt;/code&gt;，然后根据自己的系统进行选择，下面以版本&lt;code&gt;10.4.3&lt;/code&gt;为例，如果软件包地址&lt;code&gt;404&lt;/code&gt;，可以向博主反馈更新。&lt;/p&gt;&lt;p&gt;&lt;code&gt;CentOS&lt;/code&gt;系统：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#安装依赖&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum install libicu fontconfig -y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#安装软件包&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rpm -Uvh --nodeps https://github.com/jellyfin/jellyfin/releases/download/v10.4.3/jellyfin-10.4.3-1.el7.x86_64.rpm&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#启动jellyfin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service jellyfin start&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#查看状态&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service jellyfin status&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 6开机自启&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig jellyfin on&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 7开机自启&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl enable jellyfin&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Debian 8+&lt;/code&gt;和&lt;code&gt;Ubuntu 14.04+&lt;/code&gt;系统：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#Debian下载软件包&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget https://github.com/jellyfin/jellyfin/releases/download/v10.4.3/jellyfin_10.4.3-1_debian-amd64.deb&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#Ubuntu下载软件包&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget https://github.com/jellyfin/jellyfin/releases/download/v10.4.3/jellyfin_10.4.3-1_ubuntu-amd64.deb&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#更新系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt update&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#安装依赖&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt install at libsqlite3-0 libfontconfig1 libfreetype6 libssl1 -y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#安装软件包&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;dpkg -i jellyfin_*.deb&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#如果报错，再自动修复并安装下依赖和软件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt -f install -y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#查看状态&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service jellyfin status&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#开机自启&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl enable jellyfin&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;然后就可以通过&lt;code&gt;ip:8096&lt;/code&gt;访问该媒体库了。程序管理命令参考上面的就行了。&lt;/p&gt;&lt;p&gt;一般&lt;code&gt;CentOS&lt;/code&gt;和&lt;code&gt;Ubuntu&lt;/code&gt;是没安装&lt;code&gt;ffmpeg&lt;/code&gt;的，先使用命令&lt;code&gt;ffmpeg -version&lt;/code&gt;检查下&lt;code&gt;ffmpeg&lt;/code&gt;是否存在，不存在的使用命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#下载ffmpeg二进制&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget https://blog.moewah.com/source/ffmpeg-git-$(getconf LONG_BIT)bit-static.tar.xz&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#解压文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tar xvf ffmpeg-git-*-static.tar.xz&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#移动ffmpeg可执行文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mv ffmpeg-git-*/ffmpeg ffmpeg-git-*/ffprobe /usr/bin/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#删除文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm -rf ffmpeg-git-*&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;3、使用Docker安装&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;安装&lt;code&gt;Docker&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 6&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rpm -iUvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum update -y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum -y install docker-io&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service docker start&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chkconfig docker on&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 7、Debian、Ubuntu&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl -sSL https://get.docker.com/ | sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl start docker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl enable docker.service&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;再拉取镜像：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker run -d -p 8096:8096 -v /jellyfin/config:/config -v /jellyfin/media:/media jellyfin/jellyfin&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;以上命令默认的程序访问地址为&lt;code&gt;ip:8096&lt;/code&gt;，配置文件夹为&lt;code&gt;/jellyfin/config&lt;/code&gt;，媒体库文件夹为&lt;code&gt;/jellyfin/media&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;如果你想修改上面的端口和路径的话，直接修改&lt;code&gt;-p&lt;/code&gt;和&lt;code&gt;-v&lt;/code&gt;所指的前面的参数即可，照葫芦画瓢就行了。&lt;/p&gt;&lt;p&gt;如果你是&lt;code&gt;CentOS&lt;/code&gt;系统，打不开媒体界面的话，还需要开启防火墙端口，使用命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 6&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iptables -I INPUT -p tcp --dport 8096 -j ACCEPT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service iptables save&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service iptables restart&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 7&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --zone=public --add-port=8096/tcp --permanent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --reload&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果你开了端口还不能打开，可能还需要去服务商后台开启对应的端口。&lt;/p&gt;&lt;p&gt;最后安装好了，就自行去后台设置，转码那里还需要你填上&lt;code&gt;ffmpeg&lt;/code&gt;路径，一般为&lt;code&gt;/usr/bin&lt;/code&gt;，可使用&lt;code&gt;which ffmpeg&lt;/code&gt;查看路径，然后其它的就自行折腾下。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>ZeroTier内网穿透P2P高效传输全攻略</title><link>https://blog.moewah.com/posts/1474/</link><guid isPermaLink="true">https://blog.moewah.com/posts/1474/</guid><description>如何在无公网IP环境下实现内网穿透？本文详解ZeroTier的注册、网络创建与设备接入全流程，提供P2P高效传输解决方案，助你轻松打通跨地域访问障碍。</description><pubDate>Thu, 18 Apr 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;之前介绍过&lt;a href=&quot;https://blog.moewah.com/posts/226/&quot;&gt;FRPS&lt;/a&gt;、&lt;a href=&quot;https://blog.moewah.com/posts/563/&quot;&gt;LanProxy&lt;/a&gt;、&lt;a href=&quot;https://blog.moewah.com/posts/842/&quot;&gt;NPS&lt;/a&gt;等内网穿透工具，今天来介绍另一款内网穿透工具 —— ZeroTier。ZeroTier是一个分布式网络虚拟机管理程序，建立在加密安全的全球对等网络之上。它提供与企业 SDN 交换机同等的高级网络虚拟化和管理功能，而且可以跨本地和广域网并连接几乎任何类型的应用程序或设备。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;web-p2p.jpg&quot; loading=&quot;lazy&quot; width=&quot;960&quot; height=&quot;540&quot; src=&quot;/_astro/1474_227737530_d12ac2.DHvYO7nP_ZaGlqg.webp&quot; srcset=&quot;/_astro/1474_227737530_d12ac2.DHvYO7nP_yvWyD.webp 640w, /_astro/1474_227737530_d12ac2.DHvYO7nP_1JAirO.webp 750w, /_astro/1474_227737530_d12ac2.DHvYO7nP_1WHhYG.webp 828w, /_astro/1474_227737530_d12ac2.DHvYO7nP_ZaGlqg.webp 960w&quot; /&gt;&lt;figcaption&gt;web-p2p.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;例如，我在路由器上装了 ZeroTier，路由器挂了一个硬盘，而现在我在外边想要访问这个硬盘，那么只需要运行电脑上的 ZeroTier，就能通过 Samba、FTP 等方式访问硬盘，而且看起来就像我就在家里一样。&lt;/em&gt;&lt;/p&gt;
&lt;section&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;ZeroTier 支持 Windows、macOS、Linux 三大主流平台，iOS、Android 两大移动平台，以及 QNAP（威连通）、Synology（群晖）、Western Digital MyCloud NAS（西部数据）三个 NAS 平台，还支持 LEDE 开源路由器项目，支持客户端真的很多。下载地址：&lt;a href=&quot;https://www.zerotier.com/download.shtml&quot; target=&quot;_blank&quot;&gt;传送门&lt;/a&gt;&lt;/p&gt;&lt;p&gt;路由器推荐安装 Entware 后使用 &lt;code&gt;opkg install zerotier&lt;/code&gt; 命令安装&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;ZeroTier使用教程&lt;a href=&quot;#zerotier使用教程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;因为我们没有自己创建 Moons 服务器，现在就先使用 ZeroTier 提供的服务&lt;/p&gt;&lt;section&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;a href=&quot;https://my.zerotier.com/&quot; target=&quot;_blank&quot;&gt;https://my.zerotier.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;create-account.jpg&quot; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;600&quot; src=&quot;/_astro/1474_202225042_53f07d.JlGDrXpR_Z1Qop6G.webp&quot; srcset=&quot;/_astro/1474_202225042_53f07d.JlGDrXpR_JY3Lz.webp 640w, /_astro/1474_202225042_53f07d.JlGDrXpR_Z2jxdpq.webp 750w, /_astro/1474_202225042_53f07d.JlGDrXpR_Z1rxycc.webp 828w, /_astro/1474_202225042_53f07d.JlGDrXpR_Z1Qop6G.webp 1000w&quot; /&gt;&lt;figcaption&gt;create-account.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;注册之后是这样的，保持默认就好，免费套餐能连接 100 个设备，一般人够用了&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;account.jpg&quot; loading=&quot;lazy&quot; width=&quot;1500&quot; height=&quot;817&quot; src=&quot;/_astro/1474_2158687476_b2620d.B733rKwa_2b9W2B.webp&quot; srcset=&quot;/_astro/1474_2158687476_b2620d.B733rKwa_ZHAhzO.webp 640w, /_astro/1474_2158687476_b2620d.B733rKwa_GpEsf.webp 750w, /_astro/1474_2158687476_b2620d.B733rKwa_Z1Ymdry.webp 828w, /_astro/1474_2158687476_b2620d.B733rKwa_2blhOQ.webp 1080w, /_astro/1474_2158687476_b2620d.B733rKwa_ZwqhAX.webp 1280w, /_astro/1474_2158687476_b2620d.B733rKwa_2b9W2B.webp 1500w&quot; /&gt;&lt;figcaption&gt;account.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&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;/p&gt;&lt;figure&gt;&lt;img alt=&quot;create-network.jpg&quot; loading=&quot;lazy&quot; width=&quot;1565&quot; height=&quot;350&quot; src=&quot;/_astro/1474_4179032150_5fe8a9.9HHT2nqt_ZXMovx.webp&quot; srcset=&quot;/_astro/1474_4179032150_5fe8a9.9HHT2nqt_Z2uEuQ6.webp 640w, /_astro/1474_4179032150_5fe8a9.9HHT2nqt_ZE3Wzz.webp 750w, /_astro/1474_4179032150_5fe8a9.9HHT2nqt_1uElWk.webp 828w, /_astro/1474_4179032150_5fe8a9.9HHT2nqt_Z19hl4l.webp 1080w, /_astro/1474_4179032150_5fe8a9.9HHT2nqt_1aA0td.webp 1280w, /_astro/1474_4179032150_5fe8a9.9HHT2nqt_ZXMovx.webp 1565w&quot; /&gt;&lt;figcaption&gt;create-network.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;创建一个新的网络之后，我们得到一个 Network ID，这个在后面的设备连接时需要用到，点击刚刚创建的网络我们可以设置更多选项&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;network-setting.jpg&quot; loading=&quot;lazy&quot; width=&quot;1500&quot; height=&quot;1875&quot; src=&quot;/_astro/1474_3074969608_0f9878.CEMGvYqB_ZERbSj.webp&quot; srcset=&quot;/_astro/1474_3074969608_0f9878.CEMGvYqB_ZwcTQR.webp 640w, /_astro/1474_3074969608_0f9878.CEMGvYqB_ZcvwSp.webp 750w, /_astro/1474_3074969608_0f9878.CEMGvYqB_Z1YhiET.webp 828w, /_astro/1474_3074969608_0f9878.CEMGvYqB_SUDKj.webp 1080w, /_astro/1474_3074969608_0f9878.CEMGvYqB_MVcns.webp 1280w, /_astro/1474_3074969608_0f9878.CEMGvYqB_ZERbSj.webp 1500w&quot; /&gt;&lt;figcaption&gt;network-setting.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;默认的设置就可以用了，右边 IPv4 的设置就是分配设备内网 IP 网段，其他的设置可以在 Setting help 里看到说明，不了解的不建议乱设置，如果不小心把自己的网络暴露在外部，会相当危险&lt;/p&gt;&lt;/section&gt;&lt;section&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;p&gt;直接在客户端输入刚才创建的 Network ID&lt;/p&gt;&lt;p&gt;&lt;strong&gt;电脑&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;macos-join.jpg&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;297&quot; src=&quot;/_astro/1474_1221439581_1681c4.DMHCgCfI_Z1dmd40.webp&quot; srcset=&quot;/_astro/1474_1221439581_1681c4.DMHCgCfI_Z23eKLe.webp 640w, /_astro/1474_1221439581_1681c4.DMHCgCfI_Z1werYr.webp 750w, /_astro/1474_1221439581_1681c4.DMHCgCfI_TOvhi.webp 828w, /_astro/1474_1221439581_1681c4.DMHCgCfI_Z1l3q2z.webp 1080w, /_astro/1474_1221439581_1681c4.DMHCgCfI_Z1dmd40.webp 1200w&quot; /&gt;&lt;figcaption&gt;macos-join.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;路由器&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我这里使用的是安装了 Entware 的 LEDE&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 启动&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;zerotier-one -d&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 获取地址和服务状态&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;zerotier-cli status&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 加入、离开、列出网络&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;zerotier-cli join &amp;lt;Network ID&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;zerotier-cli leave &amp;lt;Network ID&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;zerotier-cli listnetworks&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;群晖NAS&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;群晖NAS安装&lt;code&gt;zerotier&lt;/code&gt; 后直接打开一直提示&lt;code&gt;OFFLINE&lt;/code&gt;无法加入网络，只能在命令行用&lt;code&gt;sudo zerotier-cli join &amp;lt;Network ID&amp;gt;&lt;/code&gt;命令来手工加入网络。&lt;/p&gt;&lt;/section&gt;&lt;section&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;后台设置默认是需要 Auth 才能连接的，在客户端申请加入网络后，需要在后台允许一下&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;members.jpg&quot; loading=&quot;lazy&quot; width=&quot;1500&quot; height=&quot;605&quot; src=&quot;/_astro/1474_2129601137_36b2ed.dm32UNRl_ZbnsTH.webp&quot; srcset=&quot;/_astro/1474_2129601137_36b2ed.dm32UNRl_Z13JcyL.webp 640w, /_astro/1474_2129601137_36b2ed.dm32UNRl_ZcUXc4.webp 750w, /_astro/1474_2129601137_36b2ed.dm32UNRl_ZBvqiB.webp 828w, /_astro/1474_2129601137_36b2ed.dm32UNRl_Zgh2JN.webp 1080w, /_astro/1474_2129601137_36b2ed.dm32UNRl_Z14R8Ss.webp 1280w, /_astro/1474_2129601137_36b2ed.dm32UNRl_ZbnsTH.webp 1500w&quot; /&gt;&lt;figcaption&gt;members.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5.测试连接&lt;a href=&quot;#5测试连接&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;为了测试不同网络访问，我添加了一台安卓手机，在移动网络下直接使用分配给路由器的 IP，连接了 ssh 和 onmp 创建的 PHP 探针页面，而且速度还算不错，宽带是电信的，手机是联通的，下文件时能有个 800k/s，不知道瓶颈在哪&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;android-test.jpg&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;576&quot; src=&quot;/_astro/1474_28082548_c2f24f.06weoUwR_1KmFYI.webp&quot; srcset=&quot;/_astro/1474_28082548_c2f24f.06weoUwR_Z1tUVuK.webp 640w, /_astro/1474_28082548_c2f24f.06weoUwR_2oV5SI.webp 750w, /_astro/1474_28082548_c2f24f.06weoUwR_Z1O9qxv.webp 828w, /_astro/1474_28082548_c2f24f.06weoUwR_1yGCRo.webp 1080w, /_astro/1474_28082548_c2f24f.06weoUwR_1KmFYI.webp 1200w&quot; /&gt;&lt;figcaption&gt;android-test.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;目前 IPv6 还没得到普及，虽然我这里已经能有 IPv6 地址并且能 IPv6 站点了，奈何不是固定 IP，也不知道哪时才能人手一个固定 IP。就目前情况来看，使用 ZeroTier 来做内网穿透还是不错的，使用门槛较低，可用性也还行，值得一试。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>梅林路由器安装Entware完整指南</title><link>https://blog.moewah.com/posts/1513/</link><guid isPermaLink="true">https://blog.moewah.com/posts/1513/</guid><description>如何在梅林路由器上安装并使用Entware？本文详细讲解从U盘格式化、挂载到Entware安装的全流程，帮助用户扩展路由器功能，解决存储不足问题，实现软件包自由管理。</description><pubDate>Thu, 11 Apr 2019 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;Entware 是一个适用于嵌入式系统的软件包库，使用 opkg 包管理系统进行管理，现在在官方的源上已经有超过 2000 个软件包了，可以说是非常的丰富&lt;/p&gt;&lt;p&gt;官方地址：&lt;a href=&quot;https://entware.net/&quot; target=&quot;_blank&quot;&gt;Entware&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;U盘、硬盘格式化（可选）&lt;a href=&quot;#u盘硬盘格式化可选&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我们的设备本身的储存较少，而且如果哪天崩了，数据还有找不回的风险，所以我们一般把软件包和程序安装到U盘之类的外置设备上，所以需要对它格式化为 ext4，NTFS 格式不推荐使用&lt;/p&gt;&lt;p&gt;格式化教程：&lt;a href=&quot;https://blog.moewah.com/posts/1512/&quot;&gt;《如何在路由器上格式化U盘、硬盘》&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;U盘挂载（可选）&lt;a href=&quot;#u盘挂载可选&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir /mnt/sda1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mount -t ext4 /dev/sda1 /mnt/sda1/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 这样就挂载上了&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;df -h&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Filesystem                Size      Used Available Use% Mounted on&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/dev/sda1               975.5M      2.5M    906.6M   0% /tmp/mnt/sda1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 可以看到已经挂载&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;安装和使用 Entware&lt;a href=&quot;#安装和使用-entware&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;梅林内置了一个安装命令很方便&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;entware-setup.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 然后会提示你选择哪个分区，就选择刚才挂载的那个&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;···省略&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Info:  Looking for available partitions...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[1] --&amp;gt; /tmp/mnt/sda1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;=&amp;gt;  Please enter partition number or 0 to exit&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;···省略&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 跑完之后只要不提示错误，就是安装成功了&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;经过以上步骤，已经可以从 Entware 上进行下载安装包并安装到U盘上&lt;/p&gt;&lt;p&gt;这下可以享受丰富的软件包，还不占用内部储存空间&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>MinIO客户端实时同步备份文件全攻略</title><link>https://blog.moewah.com/posts/2886/</link><guid isPermaLink="true">https://blog.moewah.com/posts/2886/</guid><description>如何实现文件夹的自动实时同步与备份？本文详解MinIO Client客户端的安装配置及使用方法，支持MinIO、Amazon S3和Google云存储，轻松实现跨平台数据同步与灾备解决方案。</description><pubDate>Tue, 02 Apr 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt; 文章&lt;a href=&quot;https://blog.moewah.com/posts/2877/&quot;&gt;《通过 MinIO Server搭建私有化对象存储服务》&lt;/a&gt;对&lt;code&gt;MinIO&lt;/code&gt;服务器搭建做了简单的介绍。&lt;code&gt;MinIO&lt;/code&gt;是一个开源的轻量级对象存储服务，服务器部署简单。而接下来要介绍的其实是&lt;code&gt;MinIO&lt;/code&gt;一个客户端&lt;code&gt;MinIO Client&lt;/code&gt;，主要的功能就是可以自动监听文件夹，然后实时同步到远程的&lt;code&gt;MinIO&lt;/code&gt;服务器，也支持同步到&lt;code&gt;Amazon S3&lt;/code&gt;、&lt;code&gt;Google&lt;/code&gt;云存储，同样的安装十分简单，我们可以拿它作为数据同步、数据备份使用。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;minio.png&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;391&quot; src=&quot;/_astro/2886_708916209_944a84.QZcrN22M_Z23sLMM.webp&quot; srcset=&quot;/_astro/2886_708916209_944a84.QZcrN22M_WCnIl.webp 640w, /_astro/2886_708916209_944a84.QZcrN22M_ZFrv1S.webp 750w, /_astro/2886_708916209_944a84.QZcrN22M_Z12BxEt.webp 828w, /_astro/2886_708916209_944a84.QZcrN22M_Z23sLMM.webp 1024w&quot; /&gt;&lt;figcaption&gt;minio.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&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;a href=&quot;https://docs.min.io/&quot; target=&quot;_blank&quot;&gt;https://docs.min.io/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;基本上&lt;code&gt;MinIO&lt;/code&gt;服务器和客户端支持在很多系统上安装，比如&lt;code&gt;Windows&lt;/code&gt;、&lt;code&gt;macOS&lt;/code&gt;等，这里主要说&lt;code&gt;Linux&lt;/code&gt;系统。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1、安装MinIO Client&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget https://dl.min.io/client/mc/release/linux-amd64/mc -P /usr/local/bin/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod +x /usr/local/bin/mc&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2、添加云存储&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如需添加 MinIO云存储，则需要在另一台服务器安装MinIO服务，教程查看 -&amp;gt;&lt;a href=&quot;https://blog.moewah.com/posts/2877/&quot;&gt;传送门&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#MinIO云存储&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mc config host add minio &amp;lt;Endpoint&amp;gt; &amp;lt;AccessKey&amp;gt; &amp;lt;SecretKey&amp;gt; S3v4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#Amazon S3云存储&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mc config host add s3 https://s3.amazonaws.com &amp;lt;ALIAS&amp;gt; &amp;lt;Endpoint&amp;gt; &amp;lt;AccessKeyID&amp;gt; &amp;lt;SecretAccessKey&amp;gt; S3v4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#Google云存储&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mc config host add gcs  https://storage.googleapis.com &amp;lt;AccessKeyID&amp;gt; &amp;lt;SecretAccessKey&amp;gt; S3v2&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这里只说&lt;code&gt;MinIO&lt;/code&gt;云存储，&lt;code&gt;Amazon S3&lt;/code&gt;云存储参数获取查看→&lt;a href=&quot;http://docs.aws.amazon.com/general/latest/gr/aws-security-credentials.html&quot; target=&quot;_blank&quot;&gt;传送门&lt;/a&gt;，Google云存储参数获取查看→&lt;a href=&quot;https://cloud.google.com/storage/docs/migrating?hl=en#keys&quot; target=&quot;_blank&quot;&gt;传送门&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;基本上这里配置好了后，我们可以使用很多命令远程操作云存储上的文件了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3、开始同步&lt;/strong&gt;
先创建一个桶，名称为&lt;code&gt;moewah&lt;/code&gt;，可自行修改，使用命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mc mb minio/moewah&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;接下来开始同步：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#比如我要同步网站根目录/www/wwwroot/www.moewah.com，目录自行修改&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mc mirror -w /www/wwwroot/www.moewah.com minio/moewah&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后你会发现远程&lt;code&gt;MinIO&lt;/code&gt;云存储里的&lt;code&gt;MOEWAH&lt;/code&gt;就会出现你网站根目录所有文件了，以后根目录新增文件都会实时同步进去。&lt;/p&gt;&lt;p&gt;当然这里我们也可以同时实时备份多个文件夹到多个存储桶，自行修改名称就行了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4、开机自启&lt;/strong&gt;
新建&lt;code&gt;systemd&lt;/code&gt;配置文件，适用&lt;code&gt;CentOS 7&lt;/code&gt;、&lt;code&gt;Debian 8+&lt;/code&gt;、&lt;code&gt;Ubuntu 16+&lt;/code&gt;。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#修改成你需要实时同步备份的文件夹&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;backup=&quot;/www/wwwroot/www.moewah.com&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#修改成你要备份到的存储桶&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;bucket=&quot;moewah&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#将以下代码一起复制到SSH运行&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat &amp;gt; /etc/systemd/system/minioc.service &amp;lt;&amp;lt;EOF&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[Unit]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Description=minioc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;After=network.target&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[Service]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Type=simple&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ExecStart=$(command -v mc) mirror -w ${backup} minio/${bucket}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Restart=on-failure&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[Install]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;WantedBy=multi-user.target&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;EOF&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;启动并设置开机自启：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl start minioc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl enable minioc&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;该存储只会实时监听文件变化，并将新增文件同步到远程，如果你有删除文件操作，则互相不会受到影响。&lt;/p&gt;&lt;p&gt;最后&lt;code&gt;MinIO Client&lt;/code&gt;客户端的功能其实挺多的，想了解更多的可以查看文档→&lt;a href=&quot;https://docs.min.io/cn/minio-client-quickstart-guide.html&quot; target=&quot;_blank&quot;&gt;传送门&lt;/a&gt;。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Nginx反向代理缓存加速Frp HTTP/HTTPS实战指南</title><link>https://blog.moewah.com/posts/1266/</link><guid isPermaLink="true">https://blog.moewah.com/posts/1266/</guid><description>本文详细阐述使用Nginx反向代理缓存加速Frp的frp缓存方案，帮助运维人员提升网络响应速度，掌握虚拟化运维中的缓存加速技巧与最佳实践并提供配置示例。本文提供完整配置步骤和性能对比，帮助快速落地。</description><pubDate>Sat, 30 Mar 2019 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;由于frp的&lt;code&gt;http&lt;/code&gt;和&lt;code&gt;https&lt;/code&gt;，都是从用户的服务中完整输出数据的，这对于一些使用&lt;code&gt;frp&lt;/code&gt;的用户，网络比较差/上传低，打开自己的这些服务，要加载大半天的。&lt;/p&gt;&lt;p&gt;我们可以使用&lt;code&gt;nginx&lt;/code&gt;的反代缓存，把&lt;code&gt;frp&lt;/code&gt;用户的&lt;code&gt;http&lt;/code&gt;和&lt;code&gt;https&lt;/code&gt;中的静态资源缓存到服务器本地，从而减少&lt;code&gt;frp&lt;/code&gt;用户本身的网络资源请求访问，直接略过大部分，从而在服务器加速。效果是拔群的！&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;nginx反向代理缓存配置&lt;a href=&quot;#nginx反向代理缓存配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;1、新建缓存目录&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir -pv /home/nginx/cache&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;2、赋予权限&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod -R 777 /home/nginx/cache&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;3、在&lt;code&gt;nginx.conf&lt;/code&gt;中&lt;code&gt;http{}&lt;/code&gt;里添加以下参数&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;proxy_cache_path /home/nginx/cache levels=1:2 keys_zone=frp_cache:100m max_size=5g inactive=30d;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen       80;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name moewah.com;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;#charset koi8-r;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;#access_log  /var/log/nginx/host.access.log  main;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;location / {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_pass http://127.0.0.1:8680; #反代http用127.0.0.1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header X-Real-IP $remote_addr;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header Host $host;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;location ~* \.(jpg|jpeg|gif|png|svg|css|scss|js|ico|xml|woff|woff2|ttf|otf|eot)$ {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_pass http://127.0.0.1:8680; #反代http用127.0.0.1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header X-Real-IP $remote_addr;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header Host $host;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_cache frp_cache;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_cache_key $uri$is_args$args;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_cache_valid 200 206 301 302 304 3d;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;expires 30d;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;#缓存成功 X-Cache-STatus 就是HIT，读取数据没缓存就是 MISS&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;add_header X-Cache &apos;$upstream_cache_status from $host&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;server{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;listen 443 ssl;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;server_name *.moewah.com;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_certificate /root/.acme.sh/moewah.com/fullchain.cer;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_certificate_key  /root/.acme.sh/moewah.com/moewah.com.key;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ssl_trusted_certificate /root/.acme.sh/moewah.com/ca.cer;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;location / {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_ssl_server_name on;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header X-Real-IP $remote_addr;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header X-Forwarded-Proto $scheme;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header Host $host;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_pass https://$host:8643; #反代https通过域名访问frp服务&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;location ~* \.(jpg|jpeg|gif|png|svg|css|scss|js|ico|xml|woff|woff2|ttf|otf|eot)$ {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_ssl_server_name on;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_pass https://$host:8643; #反代https通过域名访问frp服务&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_redirect https://$host/ https://$http_host/;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;51&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header X-Real-IP $remote_addr;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;52&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;53&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header Host $host;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;54&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header X-Forwarded-proto https;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;55&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_cache frp_cache;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;56&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_cache_key $uri$is_args$args;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;57&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_cache_valid 200 206 301 302 304 3d;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;58&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;expires 30d;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;59&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;#缓存成功 X-Cache-STatus 就是HIT，读取数据没缓存就是 MISS&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;60&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;add_header X-Cache &apos;$upstream_cache_status from $host&apos;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;61&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;62&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;(jpg|jpeg|gif|png|svg|css|scss|js|ico|xml|woff|woff2|ttf|otf|eot)&lt;/code&gt;为需要进行缓存的静态资源，你可以添加或者修改。&lt;/p&gt;&lt;p&gt;&lt;code&gt;proxy_cache_valid&lt;/code&gt;为服务器缓存，其中&lt;code&gt;200 206 301 302 304&lt;/code&gt;为HTTP状态码，表示针对状态码缓存，而最后面的 &lt;code&gt;30d &lt;/code&gt;为缓存过期时间，当用户没有在这个有效时间内访问到这个资源，则会过期清除，直到用户重新访问到这个资源则重新缓存。&lt;code&gt;expires&lt;/code&gt; 为访问用户本地缓存，&lt;code&gt;d &lt;/code&gt;天数 &lt;code&gt;h&lt;/code&gt; 小时 &lt;code&gt;m&lt;/code&gt; 分钟 &lt;code&gt;s&lt;/code&gt; 秒。&lt;/p&gt;&lt;p&gt;&lt;code&gt;http://127.0.0.1:8680;&lt;/code&gt;的&lt;code&gt;8080&lt;/code&gt;端口为你&lt;code&gt;frp.ini&lt;/code&gt;配置文件&lt;code&gt;vhost_http_port = 8680&lt;/code&gt;端口
&lt;code&gt;https://$host:8643;&lt;/code&gt;的&lt;code&gt;8443&lt;/code&gt;端口为你&lt;code&gt;frp.ini&lt;/code&gt;配置文件&lt;code&gt;vhost_https_port = 8643&lt;/code&gt;端口&lt;/p&gt;&lt;p&gt;对应的&lt;code&gt;frps.ini&lt;/code&gt;配置如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# if you want to support virtual host, you must set the http port for listening (optional)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Note: http port and https port can be same with bind_port&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vhost_http_port = 8680&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vhost_https_port = 8643&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 端口可根据自己的需要修改。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;配置成功后，并且访问目标网站，让&lt;code&gt;nginx&lt;/code&gt;进行缓存，在&lt;code&gt;/home/nginx/cache&lt;/code&gt;目录里会生成多个缓存目录和文件。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;对于nginx https代理frp https的理解&lt;a href=&quot;#对于nginx-https代理frp-https的理解&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;我的理解是这样的：&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;如果使用了自定义域名，&lt;code&gt;frp&lt;/code&gt;是根据&lt;code&gt;$host&lt;/code&gt;值判断该往哪个内网服务转发请求的，因此转给frp的请求中一定要包含&lt;code&gt;$host&lt;/code&gt;，否则&lt;code&gt;frp&lt;/code&gt;无法正常处理请求报502错误。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;因此以下2个配置很重要：&lt;/p&gt;&lt;p&gt;&lt;em&gt;举个栗子：&lt;/em&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;proxy_ssl_server_name on;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;proxy_pass https://$host:8643; #通过域名访问frp服务&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;proxy_pass&lt;/code&gt;中不能写成IP的形式。&lt;/p&gt;&lt;p&gt;&lt;em&gt;举一个我的栗子：&lt;/em&gt;&lt;/p&gt;&lt;p&gt;假如我内网服务器&lt;code&gt;192.168.2.99&lt;/code&gt;上部署着2个服务，&lt;code&gt;elasticsearch&lt;/code&gt;和&lt;code&gt;kibana&lt;/code&gt;，端口分别是&lt;code&gt;9200&lt;/code&gt;和&lt;code&gt;5601&lt;/code&gt;，我现在想要把这2个服务穿透出去，并配置成&lt;code&gt;https&lt;/code&gt;。我的&lt;code&gt;frps.ini&lt;/code&gt;中的主要配置如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[common]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# A literal address or host name for IPv6 must be enclosed&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# in square brackets, as in &quot;[::1]:80&quot;, &quot;[ipv6-host]:http&quot; or &quot;[ipv6-host%zone]:80&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;bind_addr = 0.0.0.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;bind_port = 7000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;……&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# if you want to support virtual host, you must set the http port for listening (optional)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Note: http port and https port can be same with bind_port&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vhost_http_port = 8680&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vhost_https_port = 8643&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后通过上边配置的&lt;code&gt;nginx&lt;/code&gt;进行代理转发请求到&lt;code&gt;frp&lt;/code&gt;上。&lt;/p&gt;&lt;p&gt;&lt;code&gt;frpc.ini&lt;/code&gt;的配置如下：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[es]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;type=https&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;custom_domains=es.moewah.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;local_ip=192.168.2.99&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;local_port=9200&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;use_encryption=true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;use_compression=true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[kb]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;type=https&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;custom_domains=kb.moewah.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;local_ip=192.168.2.99&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;local_port=5601&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;use_encryption=true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;use_compression=true&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;如果502错误问题依旧，请直接将&lt;code&gt;$host&lt;/code&gt;用域名写死，例如将&lt;code&gt;proxy_pass https://$host:8643;&lt;/code&gt;写成&lt;code&gt;proxy_pass https://abc.com:8643;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;文章参考：&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.nat.ee/98.html&quot; target=&quot;_blank&quot;&gt;frps利用nginx反代缓存，http加速&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Syncthing 文件同步工具使用教程（Resilio Sync 替代品）</title><link>https://blog.moewah.com/posts/1127/</link><guid isPermaLink="true">https://blog.moewah.com/posts/1127/</guid><description>如何在不同设备间实现安全的文件实时同步？本文详细讲解Syncthing的安装配置与使用方法，支持多平台跨系统数据同步，无需依赖第三方服务器，保障隐私安全。</description><pubDate>Fri, 22 Mar 2019 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;Syncthing&lt;/code&gt;是一个开源免费的数据同步神器，被称为 &lt;code&gt;Resilio Sync&lt;/code&gt; 的替代品，支持&lt;code&gt;Android&lt;/code&gt;、&lt;code&gt;Linux&lt;/code&gt;、&lt;code&gt;Windows&lt;/code&gt;、&lt;code&gt;Mac OS X&lt;/code&gt;等系统，可以使我们在&lt;code&gt;2&lt;/code&gt;台任何系统任何设备之间，实现文件实时同步，很强大。而且数据很安全，不会存储在你的设备以外的其他地方。所有通信都使用&lt;code&gt;TLS&lt;/code&gt;进行保护。所使用的加密包括完美的前向保密，以防止窃听者获得对您的数据的访问权限。很适合我们用来搭建私有同步网盘。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;syncthing.png&quot; loading=&quot;lazy&quot; width=&quot;860&quot; height=&quot;400&quot; src=&quot;/_astro/1127_1883868225_9725c2.DYRs8CFm_Z19CeI3.webp&quot; srcset=&quot;/_astro/1127_1883868225_9725c2.DYRs8CFm_ZSBBNr.webp 640w, /_astro/1127_1883868225_9725c2.DYRs8CFm_Z2uadCM.webp 750w, /_astro/1127_1883868225_9725c2.DYRs8CFm_HlTf1.webp 828w, /_astro/1127_1883868225_9725c2.DYRs8CFm_Z19CeI3.webp 860w&quot; /&gt;&lt;figcaption&gt;syncthing.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&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;Linux VPS&lt;/code&gt;服务器与&lt;code&gt;Windows&lt;/code&gt;电脑之间的同步安装及演示操作。&lt;code&gt;Syncthing&lt;/code&gt;官网：&lt;a href=&quot;https://syncthing.net/&quot; target=&quot;_blank&quot;&gt;点击进入&lt;/a&gt;，软件自行下载最新版本即可。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1、VPS安装Syncthing&lt;/strong&gt;
安装&lt;code&gt;Syncthing&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#目前最新版v1.2.0，日后自行修改版本号&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget https://github.com/syncthing/syncthing/releases/download/v1.2.0/syncthing-linux-amd64-v1.2.0.tar.gz&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tar xzvf syncthing-linux-amd64-v1.2.0.tar.gz&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cp syncthing-linux-amd64-v1.2.0/syncthing /usr/local/bin&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;开放端口&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Syncthing 默认监听以下几个端口&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;22000 (TCP)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;8384 (TCP)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;21027 (UDP)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;44647 (UDP)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;37269 (UDP)&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这里我是个人使用，所以只开放 22000 (TCP) 与 8384 (TCP)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;端口说明:&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;8384 是Web访问控制端口&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;22000 是节点访问端口&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;开启&lt;code&gt;Syncthing&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;syncthing&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;第一次启动会生成配置，然后给的内网地址我们是进不去的，这时候需要修改成外网地址才行（没有外网地址？ -&amp;gt; &lt;a href=&quot;https://blog.moewah.com/posts/563/&quot;&gt;LanProxy端口映射&lt;/a&gt;了解一下），先使用&lt;code&gt;Ctrl+C&lt;/code&gt;退出。然后编辑&lt;code&gt;/root/.config/syncthing/config.xml&lt;/code&gt;文件，将&lt;code&gt;127.0.0.1:8384&lt;/code&gt;改成&lt;code&gt;0.0.0.0:8384&lt;/code&gt;即可，可以直接使用命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sed -i &apos;s/127.0.0.1/0.0.0.0/g&apos; &apos;/root/.config/syncthing/config.xml&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;再次启动&lt;code&gt;Syncthing&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;syncthing&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后在浏览器访问&lt;code&gt;http://IP:8384&lt;/code&gt;，就可以进入&lt;code&gt;Syncthing&lt;/code&gt;界面，如果打不开请自行开放&lt;code&gt;8384&lt;/code&gt;端口。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 例如放行8384端口，防火墙设置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/sbin/iptables -I INPUT -p tcp --dport 8384 -j ACCEPT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/etc/init.d/iptables save&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service iptables restart&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;1.jpg&quot; loading=&quot;lazy&quot; width=&quot;1338&quot; height=&quot;649&quot; src=&quot;/_astro/1127_1857458766_599687.XQ9DelM4_1G9Yyd.webp&quot; srcset=&quot;/_astro/1127_1857458766_599687.XQ9DelM4_ZPM4A.webp 640w, /_astro/1127_1857458766_599687.XQ9DelM4_ZG5JAq.webp 750w, /_astro/1127_1857458766_599687.XQ9DelM4_ZX5VCc.webp 828w, /_astro/1127_1857458766_599687.XQ9DelM4_1bycW3.webp 1080w, /_astro/1127_1857458766_599687.XQ9DelM4_21M0ie.webp 1280w, /_astro/1127_1857458766_599687.XQ9DelM4_1G9Yyd.webp 1338w&quot; /&gt;&lt;figcaption&gt;1.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;然后我们点设置，填好管理用户、密码及其它参数再重启&lt;code&gt;Syncthing&lt;/code&gt;即可。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;2.jpg&quot; loading=&quot;lazy&quot; width=&quot;1354&quot; height=&quot;652&quot; src=&quot;/_astro/1127_2404473417_064639.BYtZsrtA_ZaS0MN.webp&quot; srcset=&quot;/_astro/1127_2404473417_064639.BYtZsrtA_1JSJIV.webp 640w, /_astro/1127_2404473417_064639.BYtZsrtA_2vzYRW.webp 750w, /_astro/1127_2404473417_064639.BYtZsrtA_Z1rmH2D.webp 828w, /_astro/1127_2404473417_064639.BYtZsrtA_Z1gqe06.webp 1080w, /_astro/1127_2404473417_064639.BYtZsrtA_f45UL.webp 1280w, /_astro/1127_2404473417_064639.BYtZsrtA_ZaS0MN.webp 1354w&quot; /&gt;&lt;figcaption&gt;2.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;如果不需要&lt;code&gt;p2p&lt;/code&gt;进行分享，也就是不需要进行中转，那么可以将启用 &lt;code&gt;NAT遍历&lt;/code&gt; 和 &lt;code&gt;全球发现&lt;/code&gt; 进行关闭。但是在服务端与客户端之间，有一方的&lt;code&gt;ip&lt;/code&gt;必须是公网。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;syncthing_add.jpg&quot; loading=&quot;lazy&quot; width=&quot;890&quot; height=&quot;533&quot; src=&quot;/_astro/1127_1021194022_dfcc70.BwpwRIL3_Z1LDcEK.webp&quot; srcset=&quot;/_astro/1127_1021194022_dfcc70.BwpwRIL3_YxVj2.webp 640w, /_astro/1127_1021194022_dfcc70.BwpwRIL3_48dbS.webp 750w, /_astro/1127_1021194022_dfcc70.BwpwRIL3_Z1cXFEJ.webp 828w, /_astro/1127_1021194022_dfcc70.BwpwRIL3_Z1LDcEK.webp 890w&quot; /&gt;&lt;figcaption&gt;syncthing_add.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2、Windows安装Syncthing&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;Win&lt;/code&gt;系统安装&lt;code&gt;Syncthing&lt;/code&gt;是非常简单的，直接从&lt;a href=&quot;https://syncthing.net/&quot; target=&quot;_blank&quot;&gt;官方网站&lt;/a&gt;下载对应版本的&lt;code&gt;Syncthing&lt;/code&gt;程序，解压打开&lt;code&gt;syncthing.exe&lt;/code&gt;，然后会弹出一个窗口，浏览器再打开&lt;code&gt;http://127.0.0.1:8384&lt;/code&gt;就可以进入并使用&lt;code&gt;Syncthing&lt;/code&gt;了，默认文件夹路径为&lt;code&gt;C:\Users\Administrator\Sync&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;Syncthing&lt;/code&gt;界面，并点击右上角&lt;code&gt;操作&lt;/code&gt;-&lt;code&gt;显示ID&lt;/code&gt;获取设备&lt;code&gt;ID&lt;/code&gt;。再到另一个设备的&lt;code&gt;Syncthing&lt;/code&gt;界面，点击右下角&lt;code&gt;添加远程设备&lt;/code&gt;，输入需要同步的设备&lt;code&gt;ID&lt;/code&gt;和共享的文件夹。看个人需求决定是否要进行高级配置(选填)，如果是私人用，不想加入公共的节点，那么就点击高级 找到 地址列表 将 &lt;code&gt;dynamic&lt;/code&gt; 填写为 &lt;code&gt;tcp://服务器ip:22000&lt;/code&gt;（防火墙记得放行&lt;code&gt;22000&lt;/code&gt;端口）&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;3.jpg&quot; loading=&quot;lazy&quot; width=&quot;1334&quot; height=&quot;574&quot; src=&quot;/_astro/1127_2500668895_2d0c38.CUaKdAuE_Z1w2U3E.webp&quot; srcset=&quot;/_astro/1127_2500668895_2d0c38.CUaKdAuE_dqnGP.webp 640w, /_astro/1127_2500668895_2d0c38.CUaKdAuE_gnOp5.webp 750w, /_astro/1127_2500668895_2d0c38.CUaKdAuE_11Dd8d.webp 828w, /_astro/1127_2500668895_2d0c38.CUaKdAuE_iH0as.webp 1080w, /_astro/1127_2500668895_2d0c38.CUaKdAuE_Zb2j09.webp 1280w, /_astro/1127_2500668895_2d0c38.CUaKdAuE_Z1w2U3E.webp 1334w&quot; /&gt;&lt;figcaption&gt;3.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;这时候另一台设备会弹出一个窗口，点击添加设备即可。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;4.jpg&quot; loading=&quot;lazy&quot; width=&quot;1344&quot; height=&quot;648&quot; src=&quot;/_astro/1127_1092591968_689d88.TEs9Jlqx_ZvPN3l.webp&quot; srcset=&quot;/_astro/1127_1092591968_689d88.TEs9Jlqx_Z1vuGJU.webp 640w, /_astro/1127_1092591968_689d88.TEs9Jlqx_FecdI.webp 750w, /_astro/1127_1092591968_689d88.TEs9Jlqx_1ChpeV.webp 828w, /_astro/1127_1092591968_689d88.TEs9Jlqx_1tgpTS.webp 1080w, /_astro/1127_1092591968_689d88.TEs9Jlqx_1aUGEl.webp 1280w, /_astro/1127_1092591968_689d88.TEs9Jlqx_ZvPN3l.webp 1344w&quot; /&gt;&lt;figcaption&gt;4.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;此时设备添加完成，就可以开始同步文件夹了，也可以在其中一台设备新建/添加其它文件夹&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;5-1.jpg&quot; loading=&quot;lazy&quot; width=&quot;1357&quot; height=&quot;658&quot; src=&quot;/_astro/1127_3621797433_f9e888.BTSSUSCw_Z7uNkT.webp&quot; srcset=&quot;/_astro/1127_3621797433_f9e888.BTSSUSCw_Z1Tr5um.webp 640w, /_astro/1127_3621797433_f9e888.BTSSUSCw_2uv5MJ.webp 750w, /_astro/1127_3621797433_f9e888.BTSSUSCw_ZT0AxP.webp 828w, /_astro/1127_3621797433_f9e888.BTSSUSCw_Z1BGy8y.webp 1080w, /_astro/1127_3621797433_f9e888.BTSSUSCw_ZLsKMn.webp 1280w, /_astro/1127_3621797433_f9e888.BTSSUSCw_Z7uNkT.webp 1357w&quot; /&gt;&lt;figcaption&gt;5-1.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;进行必要的文件共享设置&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;5-2.jpg&quot; loading=&quot;lazy&quot; width=&quot;1359&quot; height=&quot;651&quot; src=&quot;/_astro/1127_2544874713_358f2f.BumPLOkP_Z1pHvMt.webp&quot; srcset=&quot;/_astro/1127_2544874713_358f2f.BumPLOkP_Z1SGIPp.webp 640w, /_astro/1127_2544874713_358f2f.BumPLOkP_1lpAC1.webp 750w, /_astro/1127_2544874713_358f2f.BumPLOkP_1VTAG5.webp 828w, /_astro/1127_2544874713_358f2f.BumPLOkP_Z22xcRF.webp 1080w, /_astro/1127_2544874713_358f2f.BumPLOkP_Z1ox52D.webp 1280w, /_astro/1127_2544874713_358f2f.BumPLOkP_Z1pHvMt.webp 1359w&quot; /&gt;&lt;figcaption&gt;5-2.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;然后同样的，另一台设备也会弹出一个窗口，点击同意添加即可。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;6.jpg&quot; loading=&quot;lazy&quot; width=&quot;1345&quot; height=&quot;579&quot; src=&quot;/_astro/1127_2415920307_f68e62.Dvzv8FV5_ZaVj9q.webp&quot; srcset=&quot;/_astro/1127_2415920307_f68e62.Dvzv8FV5_1nthk8.webp 640w, /_astro/1127_2415920307_f68e62.Dvzv8FV5_Z1G4Lhq.webp 750w, /_astro/1127_2415920307_f68e62.Dvzv8FV5_ZUOnyi.webp 828w, /_astro/1127_2415920307_f68e62.Dvzv8FV5_By5nU.webp 1080w, /_astro/1127_2415920307_f68e62.Dvzv8FV5_7NLdj.webp 1280w, /_astro/1127_2415920307_f68e62.Dvzv8FV5_ZaVj9q.webp 1345w&quot; /&gt;&lt;figcaption&gt;6.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;最后等待片刻，所添加的文件夹都会自动同步完成。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;7.jpg&quot; loading=&quot;lazy&quot; width=&quot;1347&quot; height=&quot;583&quot; src=&quot;/_astro/1127_2439408315_1af312.B-btMSqF_Z1iUDNe.webp&quot; srcset=&quot;/_astro/1127_2439408315_1af312.B-btMSqF_1FN9ui.webp 640w, /_astro/1127_2439408315_1af312.B-btMSqF_1IKAcx.webp 750w, /_astro/1127_2439408315_1af312.B-btMSqF_2u0XUF.webp 828w, /_astro/1127_2439408315_1af312.B-btMSqF_Z2vvyI.webp 1080w, /_astro/1127_2439408315_1af312.B-btMSqF_Zk2aeb.webp 1280w, /_astro/1127_2439408315_1af312.B-btMSqF_Z1iUDNe.webp 1347w&quot; /&gt;&lt;figcaption&gt;7.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;如果希望&lt;code&gt;Syncthing&lt;/code&gt;在后台运行可以使用&lt;code&gt;nohup&lt;/code&gt;命令来实现：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nohup syncthing &amp;amp;&amp;gt; /dev/null &amp;amp;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;更多功能请自行摸索，注意设备删掉&lt;code&gt;Syncthing&lt;/code&gt;后，同步的文件夹依然存在。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;此方法适用于任何发行版（Arch，Debian，Linux Mint，Ubuntu，openSUSE）,关于windows和macOS系统设置开机启动的方法，详见 -&amp;gt;&lt;a href=&quot;https://docs.syncthing.net/users/autostart.html&quot; target=&quot;_blank&quot;&gt;官方文档&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Debian/Ubuntu&lt;/strong&gt;
设置系统服务创建开机启动，此方法适用于 Debian9+/Ubuntu16.04+&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#从源包内复制&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cp syncthing-linux-amd64-v1.2.0/etc/linux-systemd/system/syncthing@.service /etc/systemd/system/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#设置以root用户执行，如有需要请自行修改，前提是必须是系统用户&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mv /etc/systemd/system/syncthing@.service /etc/systemd/system/syncthing@root.service&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;使用命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#添加开机启动&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl enable syncthing@root.service&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#启动syncthing服务&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl start syncthing@root.service&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;CentOS6/7&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;需要注意的是，Centos7下请使用原syncthing包内etc文件夹中的linux-systemd或者linux-upstart作为启动脚本，Centos6我建议使用supervisor作为运行控制：&lt;/p&gt;&lt;p&gt;安装Supervisor&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum install python-setuptools -y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;easy_install supervisor&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo_supervisord_conf &amp;gt; /etc/supervisord.conf&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo &quot;supervisord&quot; &amp;gt;&amp;gt; /etc/rc.local     //开机启动supervisor&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;在&lt;code&gt;/etc/supervisord.conf&lt;/code&gt; 最后添加如下内容，然后启动(运行supervisord)或者重启supervisor (supervisorctl reload)&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[program:syncthing]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;command=/usr/local/bin/syncthing&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;autostart=true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;autorestart=true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;user=root&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;redirect_stderr=true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;stdout_logfile=/var/log/syncthing.log&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded></item><item><title>群晖NAS使用Crontab任务计划完整指南</title><link>https://blog.moewah.com/posts/1112/</link><guid isPermaLink="true">https://blog.moewah.com/posts/1112/</guid><description>如何在群晖NAS上配置Crontab定时任务？本文详细讲解非root用户下切换身份、编辑crontab文件及重启服务的完整流程，解决群晖系统无法直接使用crontab命令的问题，助你高效自动化运维。</description><pubDate>Tue, 19 Mar 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;与其他类&lt;code&gt;Unix&lt;/code&gt;系统不同的是，群晖上面并不能直接 &lt;code&gt;crontab -e&lt;/code&gt; 来管理计划任务。默认群晖NAS是不允许&lt;code&gt;root&lt;/code&gt;直接登陆的，所以我们要先来切换用户身份到&lt;code&gt;root&lt;/code&gt;。&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;admin@DiskStation:~$ sudo -i&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Password:&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;切换到&lt;code&gt;root&lt;/code&gt;用户之后，我们就可以使用文本编辑工具(&lt;code&gt;vim&lt;/code&gt;或者&lt;code&gt;nano&lt;/code&gt;)来便捷&lt;code&gt;crontab&lt;/code&gt;的计划任务了。&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;root@DiskStation:~# vim /etc/crontab&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;MAILTO=&quot;&quot;PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/syno/sbin:/usr/syno/bin:/usr/local/sbin:/usr/local/bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#minute hour    mday    month   wday    who command0 0 * * * echo &quot;hello synology&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#例如：每隔一分钟往tmp目录写入一个以时间戳命名的文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;*/1 * * * *  root touch /tmp/$(date +\%Y\%m\%d\%H\%M\%S)&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;最后&lt;code&gt;restart&lt;/code&gt;一下&lt;code&gt;crontab&lt;/code&gt;服务就可以了，以下是 &lt;code&gt;DSM 6+&lt;/code&gt; 重启 crontab 的方式：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;root@DiskStation:~# synoservice --restart crond&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;
&lt;p&gt;如果是 &lt;code&gt;DSM 7+&lt;/code&gt; 系统则运行 &lt;code&gt;synosystemctl restart crond&lt;/code&gt; 命令来重启crontab&lt;/p&gt;</content:encoded></item><item><title>Linux VPS 限速神器：WonderShaper 实战指南</title><link>https://blog.moewah.com/posts/1650/</link><guid isPermaLink="true">https://blog.moewah.com/posts/1650/</guid><description>如何限制VPS服务器的上传下载带宽？本文详解使用WonderShaper工具通过tc和QoS实现网卡限速的完整流程，提供安装、配置及命令实操方案，助你精准控制网络流量。</description><pubDate>Mon, 11 Mar 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;**说明：**最近看有人问博主如何限制服务器的上传带宽，所以就分享下此前经常用的一个限速脚本&lt;code&gt;WonderShaper&lt;/code&gt;，原理的话，网上比较详细的解释是&lt;code&gt;WonderShaper&lt;/code&gt;使用&lt;code&gt;tc&lt;/code&gt;来定义流量调整命令，使用&lt;code&gt;QoS&lt;/code&gt;来处理特定的网络接口。外发流量通过放在不同优先级的队列中，达到限制传出流量速率的目的；而传入流量通过丢包的方式来达到速率限制的目的。用起来挺方便的，有需求的可以了解下。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Linux_WonderShaper.jpg&quot; loading=&quot;lazy&quot; width=&quot;940&quot; height=&quot;627&quot; src=&quot;/_astro/1650_898394736_7c864f.C8_-qEWH_2ogQjt.webp&quot; srcset=&quot;/_astro/1650_898394736_7c864f.C8_-qEWH_Z1TQ5Vd.webp 640w, /_astro/1650_898394736_7c864f.C8_-qEWH_Z7Neif.webp 750w, /_astro/1650_898394736_7c864f.C8_-qEWH_vnURh.webp 828w, /_astro/1650_898394736_7c864f.C8_-qEWH_2ogQjt.webp 940w&quot; /&gt;&lt;figcaption&gt;Linux_WonderShaper.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&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;Github地址：&lt;/strong&gt; &lt;a href=&quot;https://github.com/magnific0/wondershaper&quot; target=&quot;_blank&quot;&gt;https://github.com/magnific0/wondershaper&lt;/a&gt;&lt;/p&gt;&lt;p&gt;安装的话是可以直接用软件包安装，不过版本都不太新，所以这里直接从&lt;code&gt;Github&lt;/code&gt;拉取最新源码。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1、安装依赖&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#Debian/Ubuntu系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt install -y make git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum install make git -y&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2、安装WonderShaper&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git clone https://github.com/magnific0/wondershaper.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd wondershaper&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;make install&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;3、设置限速&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#使用命令&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;USAGE: wondershaper [-hcs] [-a &amp;lt;adapter&amp;gt;] [-d &amp;lt;rate&amp;gt;] [-u &amp;lt;rate&amp;gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;OPTIONS:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-h           Show this message&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-a &amp;lt;adapter&amp;gt; Set the adapter&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-d &amp;lt;rate&amp;gt;    Set maximum download rate (in Kbps) and/or&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-u &amp;lt;rate&amp;gt;    Set maximum upload rate (in Kbps)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-p           Use presets in /etc/conf.d/wondershaper.conf&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-c           Clear the limits from adapter&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-s           Show the current status of adapter&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-v           Show the current version&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;首先查看网卡：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#这里提供三个可以查看网卡的命令，建议使用第一个&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ifconfig&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ip addr&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;route&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;比如我要限制&lt;code&gt;eth0&lt;/code&gt;网卡速度，使用命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#限制上传带宽为10M&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wondershaper -a eth0 -u 10240&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#限制下载带宽为10M&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wondershaper -a eth0 -d 10240&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#限制上传和上传均10M&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wondershaper -a eth0 -d 10240 -u 10240&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#清除网卡限速规则&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wondershaper -c -a eth0&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后我们可以测一下速，使用命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget -O speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod +x speedtest-cli&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;./speedtest-cli&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这是没限速前的测速：
&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;1.jpg&quot; loading=&quot;lazy&quot; width=&quot;877&quot; height=&quot;166&quot; src=&quot;/_astro/1650_3203444521_bd8a53.DI2ZYmp0_E4uhA.webp&quot; srcset=&quot;/_astro/1650_3203444521_bd8a53.DI2ZYmp0_Z1q4wcl.webp 640w, /_astro/1650_3203444521_bd8a53.DI2ZYmp0_Z1H1SwW.webp 750w, /_astro/1650_3203444521_bd8a53.DI2ZYmp0_Z4sNXB.webp 828w, /_astro/1650_3203444521_bd8a53.DI2ZYmp0_E4uhA.webp 877w&quot; /&gt;&lt;figcaption&gt;1.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;上传/下载限速&lt;code&gt;10M&lt;/code&gt;后的测速：
&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;2.jpg&quot; loading=&quot;lazy&quot; width=&quot;879&quot; height=&quot;154&quot; src=&quot;/_astro/1650_3770244228_4a700c.DiV5732V_ZyrrWF.webp&quot; srcset=&quot;/_astro/1650_3770244228_4a700c.DiV5732V_Z3csW0.webp 640w, /_astro/1650_3770244228_4a700c.DiV5732V_ZmrdAW.webp 750w, /_astro/1650_3770244228_4a700c.DiV5732V_Z1i7TBf.webp 828w, /_astro/1650_3770244228_4a700c.DiV5732V_ZyrrWF.webp 879w&quot; /&gt;&lt;figcaption&gt;2.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&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;2&lt;/code&gt;种方法。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1、使用rc.local&lt;/strong&gt;
这是最简单的设置自启方法，不过&lt;code&gt;Debian 9&lt;/code&gt;、&lt;code&gt;Ubuntu 17+&lt;/code&gt;是没有&lt;code&gt;rc.local&lt;/code&gt;文件的，所以使用该系统的需要先配置一下。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1、添加rc-local.service，以下为一整条命令，一起复制运行&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat &amp;gt; /etc/systemd/system/rc-local.service &amp;lt;&amp;lt;EOF&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[Unit]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Description=/etc/rc.local&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ConditionPathExists=/etc/rc.local&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[Service]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Type=forking&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ExecStart=/etc/rc.local start&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;TimeoutSec=0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;StandardOutput=tty&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;RemainAfterExit=yes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;SysVStartPriority=99&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[Install]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;WantedBy=multi-user.target&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;EOF&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2、新建rc-local文件，以下为一整条命令，一起复制运行&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat &amp;gt; /etc/rc.local &amp;lt;&amp;lt;EOF&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#!/bin/sh -e&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# rc.local&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# This script is executed at the end of each multiuser runlevel.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Make sure that the script will &quot;exit 0&quot; on success or any other&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# value on error.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# In order to enable or disable this script just change the execution&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# bits.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# By default this script does nothing.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;EOF&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3、添加权限并设置开机自启&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod +x /etc/rc.local&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl start rc-local&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl enable rc-local&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;最后将启动命令加入&lt;code&gt;rc.local&lt;/code&gt;文件，使用命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 7系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo &quot;wondershaper -a eth0 -d 10240 -u 10240&quot; &amp;gt;&amp;gt; /etc/rc.d/rc.local&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod +x /etc/rc.d/rc.local&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 6、Debian、Ubuntu系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo &quot;wondershaper -a eth0 -d 10240 -u 10240&quot; &amp;gt;&amp;gt; /etc/rc.local&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod +x /etc/rc.local&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这里限速命令自行修改。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2、使用Systemd&lt;/strong&gt;
由于安装的时候，&lt;code&gt;Systemd&lt;/code&gt;配置文件也给你了，所以就方便使用了，不过该方法只适用于&lt;code&gt;CentOS 7&lt;/code&gt;、&lt;code&gt;Debian 8+&lt;/code&gt;、&lt;code&gt;Ubuntu 16+&lt;/code&gt;等。&lt;/p&gt;&lt;p&gt;由于启动时，默认调用的配置文件为&lt;code&gt;/etc/conf.d/wondershaper.conf&lt;/code&gt;，所以先编辑该文件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nano /etc/conf.d/wondershaper.conf&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;大致如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[wondershaper]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Adapter&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;IFACE=&quot;eth0&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Download rate in Kbps&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;DSPEED=&quot;10240&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Upload rate in Kbps&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;USPEED=&quot;10240&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;参数依次为网卡、下载、上传限制，修改好了后，使用&lt;code&gt;Ctrl+x&lt;/code&gt;、&lt;code&gt;y&lt;/code&gt;保存退出。&lt;/p&gt;&lt;p&gt;再启动并开机自启：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl start wondershaper&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl enable wondershaper&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded></item><item><title>Haproxy一键安装脚本实现端口转发加速</title><link>https://blog.moewah.com/posts/967/</link><guid isPermaLink="true">https://blog.moewah.com/posts/967/</guid><description>海外服务器网络差？如何通过Haproxy一键脚本实现端口转发中转加速？本文提供从安装到管理的完整方案，解决连接慢、不稳定问题，提升网络传输效率。</description><pubDate>Thu, 07 Mar 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;**说明：**一般用海外服务器的都会遇到线路爆炸，网络不好的情况，网站一般会出现连接不上或者速度变慢的问题，为了改善这种状况，我们可以使用&lt;code&gt;haproxy&lt;/code&gt;转发端口进行中转加速，需要注意的是&lt;code&gt;haproxy&lt;/code&gt;不支持&lt;code&gt;udp&lt;/code&gt;协议的端口转发。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;haproxy.png&quot; loading=&quot;lazy&quot; width=&quot;761&quot; height=&quot;442&quot; src=&quot;/_astro/967_867283015_ef5237.4ZkbMblQ_12H6VF.webp&quot; srcset=&quot;/_astro/967_867283015_ef5237.4ZkbMblQ_yomys.webp 640w, /_astro/967_867283015_ef5237.4ZkbMblQ_2cXr8n.webp 750w, /_astro/967_867283015_ef5237.4ZkbMblQ_12H6VF.webp 761w&quot; /&gt;&lt;figcaption&gt;haproxy.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;假设你的本地电脑为&lt;code&gt;A&lt;/code&gt;，&lt;code&gt;haproxy&lt;/code&gt;服务器为&lt;code&gt;B&lt;/code&gt;，需要转发的服务器为&lt;code&gt;C&lt;/code&gt;。&lt;code&gt;A&lt;/code&gt;当然可以直接去连&lt;code&gt;C&lt;/code&gt;，但效果可能不会很理想。如果&lt;code&gt;B&lt;/code&gt;是一个对&lt;code&gt;C&lt;/code&gt;和&lt;code&gt;A&lt;/code&gt;连接效果都好的服务器。那么&lt;code&gt;A&lt;/code&gt;连接&lt;code&gt;C&lt;/code&gt;就等于&lt;code&gt;A&lt;/code&gt;连接&lt;code&gt;B&lt;/code&gt;，通过&lt;code&gt;B&lt;/code&gt;连接&lt;code&gt;C&lt;/code&gt;，这样一来，虽然成本有所上升，但却能明显改善网络带宽情况。&lt;/p&gt;
&lt;section&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;code&gt;CentOS&lt;/code&gt;，&lt;code&gt;Debian&lt;/code&gt;，&lt;code&gt;Ubuntu&lt;/code&gt;&lt;/p&gt;&lt;p&gt;使用&lt;code&gt;root&lt;/code&gt;登录做中转的那台服务器，执行下面的命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget --no-check-certificate https://soft.gaomingsong.com/haproxy/haproxy.sh &amp;amp;&amp;amp; bash haproxy.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#若上方资源地址不可用，可替换使用下方的备用地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;https://blog.moewah.com/source/haproxy.sh &amp;amp;&amp;amp; bash haproxy.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后会要求你依次输入起始端口、结束端口，需要中专的服务器&lt;code&gt;IP&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;卸载方法：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;Debian&lt;/code&gt;或&lt;code&gt;Ubuntu&lt;/code&gt;系统&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt-get -y remove haproxy&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;CentOS&lt;/code&gt;系统&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum -y remove haproxy&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后删掉&lt;code&gt;haproxy&lt;/code&gt;的配置文件目录&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm -rf /etc/haproxy&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;管理命令：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;启动：&lt;code&gt;/etc/init.d/haproxy start&lt;/code&gt;
停止：&lt;code&gt;/etc/init.d/haproxy stop&lt;/code&gt;
重启：&lt;code&gt;/etc/init.d/haproxy restart&lt;/code&gt;
状态：&lt;code&gt;/etc/init.d/haproxy status&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;脚本来源：&lt;/strong&gt; &lt;a href=&quot;https://www.gaomingsong.com/480.html&quot; target=&quot;_blank&quot;&gt;https://www.gaomingsong.com/480.html&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Rclone挂载谷歌云盘Dropbox全攻略</title><link>https://blog.moewah.com/posts/876/</link><guid isPermaLink="true">https://blog.moewah.com/posts/876/</guid><description>如何用Rclone轻松挂载管理谷歌云盘、Dropbox等网盘？本文详解安装配置全流程，解决跨平台数据同步难题，助你高效实现云存储自动化管理。</description><pubDate>Wed, 27 Feb 2019 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;Rclone 是一款的命令行工具，支持在不同对象存储、网盘间同步、上传、下载数据。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;官网网址：&lt;a href=&quot;https://rclone.org&quot; target=&quot;_blank&quot;&gt;https://rclone.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Github 项目：&lt;a href=&quot;https://github.com/ncw/rclone&quot; target=&quot;_blank&quot;&gt;https://github.com/ncw/rclone&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Rclone.png&quot; loading=&quot;lazy&quot; width=&quot;860&quot; height=&quot;400&quot; src=&quot;/_astro/876_552941094_45890e.DGkMZq-G_Z2GsDR.webp&quot; srcset=&quot;/_astro/876_552941094_45890e.DGkMZq-G_1HWk0L.webp 640w, /_astro/876_552941094_45890e.DGkMZq-G_1R8DIv.webp 750w, /_astro/876_552941094_45890e.DGkMZq-G_ZfMr9x.webp 828w, /_astro/876_552941094_45890e.DGkMZq-G_Z2GsDR.webp 860w&quot; /&gt;&lt;figcaption&gt;Rclone.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;支持的主流对象存储有：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Google Drive&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Amazon S3 #消息称Amazon单方面禁止了 rclone 在他家存储上使用。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Openstack Swift / Rackspace cloud files / Memset Memstore&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Dropbox&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Google Cloud Storage&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Amazon Drive&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Microsoft One Drive&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Hubic&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Backblaze B2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Yandex Disk&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;The local filesystem&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;Rclone 更完整的云存储支持列表 -&amp;gt; &lt;a href=&quot;https://rclone.org/overview/&quot; target=&quot;_blank&quot;&gt;查看完整列表&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&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;安装 EPEL 源：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum -y install epel-release&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;安装一些基本组件和依赖：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum -y install wget unzip screen fuse fuse-devel&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;下载 Rclone (amd64)解压然后进入目录（方法1）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget https://downloads.rclone.org/rclone-current-linux-amd64.zip&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;unzip rclone-current-linux-amd64.zip&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod 0755 ./rclone-*/rclone&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cp ./rclone-*/rclone /usr/bin/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm -rf ./rclone-*&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;下载 Rclone (amd64)解压然后进入目录（方法2）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl -O http://downloads.rclone.org/rclone-current-linux-amd64.zip&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;unzip rclone-current-linux-amd64.zip&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd rclone-*-linux-amd64&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cp rclone /usr/sbin/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chown root:root /usr/sbin/rclone&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod 0755 /usr/sbin/rclone&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;运行 Rclone 开始配置：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;./rclone config&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;第一步选择 &lt;code&gt;n&lt;/code&gt;，然后回车输入一个 &lt;code&gt;name&lt;/code&gt;，建议这个 &lt;code&gt;name&lt;/code&gt; 设置的简单好记一点，如图所示：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;1.png&quot; loading=&quot;lazy&quot; width=&quot;924&quot; height=&quot;137&quot; src=&quot;/_astro/876_2788314242_feca89.BeuK_9Tr_1FENg1.webp&quot; srcset=&quot;/_astro/876_2788314242_feca89.BeuK_9Tr_69ezM.webp 640w, /_astro/876_2788314242_feca89.BeuK_9Tr_Z1F99gp.webp 750w, /_astro/876_2788314242_feca89.BeuK_9Tr_Z16vJIz.webp 828w, /_astro/876_2788314242_feca89.BeuK_9Tr_1FENg1.webp 924w&quot; /&gt;&lt;figcaption&gt;1.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;然后选择我们要挂载的类型，这里选择 &lt;code&gt;11&lt;/code&gt;（当然要看最新的版本，所以要好好看哈），切记要选对了：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;2018032103404234.png&quot; loading=&quot;lazy&quot; width=&quot;464&quot; height=&quot;147&quot; src=&quot;/_astro/876_2641332372_b3cbc7.QPYXrYYW_Z1b0i31.webp&quot; srcset=&quot;/_astro/876_2641332372_b3cbc7.QPYXrYYW_Z1b0i31.webp 464w&quot; /&gt;&lt;figcaption&gt;2018032103404234.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;接着 &lt;code&gt;client_id&lt;/code&gt;、&lt;code&gt;client_secret&lt;/code&gt;、&lt;code&gt;service_account_file&lt;/code&gt; 都留空直接回车，看到提示权限的时候选择第一个： Full access all files, Excluding Application Data Folder 就可以了&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;2018032103404234-1.png&quot; loading=&quot;lazy&quot; width=&quot;569&quot; height=&quot;233&quot; src=&quot;/_astro/876_2297159770_dd276e.BjFW4V0o_Z1uIhev.webp&quot; srcset=&quot;/_astro/876_2297159770_dd276e.BjFW4V0o_Z1uIhev.webp 569w&quot; /&gt;&lt;figcaption&gt;2018032103404234-1.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Use auto config? 这里我们选择 &lt;code&gt;n&lt;/code&gt;，如图所示：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;2018032103424153.png&quot; loading=&quot;lazy&quot; width=&quot;616&quot; height=&quot;227&quot; src=&quot;/_astro/876_2337355310_fab2ef.nFSENvln_Z9YyHM.webp&quot; srcset=&quot;/_astro/876_2337355310_fab2ef.nFSENvln_Z9YyHM.webp 616w&quot; /&gt;&lt;figcaption&gt;2018032103424153.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;现在 rclone 会在终端内给我们回显一个 GoogleDrive 的授权登录地址，如图所示：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;2018032103424153-1.png&quot; loading=&quot;lazy&quot; width=&quot;629&quot; height=&quot;213&quot; src=&quot;/_astro/876_2487943519_7970be.cgvxOZ8J_Z1RiTuq.webp&quot; srcset=&quot;/_astro/876_2487943519_7970be.cgvxOZ8J_Z1RiTuq.webp 629w&quot; /&gt;&lt;figcaption&gt;2018032103424153-1.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;我们复制这个地址然后用本地电脑的浏览器打开并登录（需翻墙），然后点击允许按钮，接着复制如下图所示的授权代码，回到终端内粘贴授权代码然后回车，继续按如下图操作，依次输入 &lt;code&gt;n&lt;/code&gt;、&lt;code&gt;y&lt;/code&gt;、&lt;code&gt;q&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;2.png&quot; loading=&quot;lazy&quot; width=&quot;429&quot; height=&quot;670&quot; src=&quot;/_astro/876_3531818394_8ce335.DLvnsEGz_ZTX3br.webp&quot; srcset=&quot;/_astro/876_3531818394_8ce335.DLvnsEGz_ZTX3br.webp 429w&quot; /&gt;&lt;figcaption&gt;2.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;全部完成后，现在新建一个你要挂载的目录：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir -p /home/gdrive&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;用 &lt;code&gt;screen&lt;/code&gt; 创建一个新的会话：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;screen -S rclone&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;执行如下命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;./rclone mount guge: /home/gdrive --allow-other --allow-non-empty --vfs-cache-mode writes&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;上面的&lt;code&gt;guge&lt;/code&gt;指的是你自己设定的名称&lt;/em&gt;&lt;/p&gt;&lt;p&gt;不出意外的话，就挂载成功了！重启后自动挂载可以看如下操作&lt;/p&gt;&lt;p&gt;先把&lt;code&gt;rclone&lt;/code&gt;的可执行文件复制到&lt;code&gt;/usr/bin&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cp /root/rclone-v1.42-linux-amd64/rclone /usr/bin/rclone&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;新建一个rclone.service文件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;vi /usr/lib/systemd/system/rclone.service&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;写入：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[Unit]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Description=rclone&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[Service]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;User=root&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ExecStart=/usr/bin/rclone mount guge: /home/gdrive --allow-other --allow-non-empty --vfs-cache-mode writes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Restart=on-abort&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[Install]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;WantedBy=multi-user.target&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;重载&lt;code&gt;daemon&lt;/code&gt;，让新的服务文件生效：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl daemon-reload&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;现在就可以用&lt;code&gt;systemctl&lt;/code&gt;来启动&lt;code&gt;rclone&lt;/code&gt;了：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl start rclone&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;设置开机启动：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl enable rclone&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;停止、查看状态可以用：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl stop rclone&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl status rclone&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;重启你的&lt;code&gt;VPS&lt;/code&gt;，然后查看一下&lt;code&gt;rclone&lt;/code&gt;的服务起来没，接着查看一下盘子挂上去没：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;reboot&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl status rclone&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;df -h&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;rclone 命令的语法格式：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Syntax: [options] subcommand &amp;lt;parameters&amp;gt; &amp;lt;parameters...&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;常用的 rclone 命令有：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone config - 以控制会话的形式添加rclone的配置，配置保存在.rclone.conf文件中。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone copy - 将文件从源复制到目的地址，跳过已复制完成的。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone sync - 将源数据同步到目的地址，只更新目的地址的数据。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone move - 将源数据移动到目的地址。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone delete - 删除指定路径下的文件内容。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone purge - 清空指定路径下所有文件数据。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone mkdir - 创建一个新目录。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone rmdir - 删除空目录。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone check - 检查源和目的地址数据是否匹配。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone ls - 列出指定路径下所有的文件以及文件大小和路径。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone lsd - 列出指定路径下所有的目录/容器/桶。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone lsl - 列出指定路径下所有文件以及修改时间、文件大小和路径。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone md5sum - 为指定路径下的所有文件产生一个md5sum文件。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone sha1sum - 为指定路径下的所有文件产生一个sha1sum文件。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone size - 获取指定路径下，文件内容的总大小。.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone version - 查看当前版本。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone cleanup - 清空remote。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone dedupe - 交互式查找重复文件，进行删除/重命名操作。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;section&gt;&lt;h3&gt;rclone config&lt;a href=&quot;#rclone-config&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;开启一个交互式的配置会话。命令格式如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone config&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;rclone copy&lt;a href=&quot;#rclone-copy&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;将文件从源复制到目的地址，跳过已复制完成的。命令格式如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone copy source:sourcepath dest:destpsth&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&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;rclone copy&lt;/code&gt; 复制总是指定路径下的数据；而不是当前目录。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;–no-traverse&lt;/code&gt; 标志用于控制是否列出目的地址目录。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;rclone sync&lt;a href=&quot;#rclone-sync&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone sync source:path dest:path&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;同步数据时，可能会删除目的地址的数据；建议先使用–dry-run 标志来检查要复制、删除的数据。&lt;/li&gt;
&lt;li&gt;同步数据出错时，不会删除任何目的地址的数据。&lt;/li&gt;
&lt;li&gt;rclone sync 同步的始终是 path 目录下的数据，而不是 path 目录。（空目录将不会被同步）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;rclone move&lt;a href=&quot;#rclone-move&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone move source:path dest:path&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;说明：同步数据时，可能会删除目的地址的数据；建议先使用–dry-run 标志来检查要复制、删除的数据。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;rclone purge&lt;a href=&quot;#rclone-purge&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;清空 path 目录和数据。命令格式如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone purge remote:path&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;说明：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;此命令，&lt;code&gt;include/exclude&lt;/code&gt; 过滤器失效。&lt;/li&gt;
&lt;li&gt;删除 &lt;code&gt;path&lt;/code&gt; 目录下部分数据，请使用 &lt;code&gt;rclone delete&lt;/code&gt; 命令&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;rclone mkdir&lt;a href=&quot;#rclone-mkdir&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;创建 path 目录。命令格式如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone mkdir remote:path&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;rclone rmdir&lt;a href=&quot;#rclone-rmdir&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;删除一个空目录。命令格式如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone rmdir remote:path&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;说明：不能删除非空的目录，删除非空目录请使用 &lt;code&gt;rclone purge&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;rclone check&lt;a href=&quot;#rclone-check&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;检查源和目标地址文件是否匹配。命令格式如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone check source:path dest:path&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;说明：&lt;code&gt;–size-only&lt;/code&gt; 标志用于指定，只比较大小，不比较 &lt;code&gt;MD5SUMs&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;rclone ls&lt;a href=&quot;#rclone-ls&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;列出指定 &lt;code&gt;path&lt;/code&gt; 下，所有的文件以及文件大小和路径。命令格式如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone ls remote:path&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;rclone lsd&lt;a href=&quot;#rclone-lsd&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;列出指定 &lt;code&gt;path&lt;/code&gt; 下，所有目录、容器、桶。命令格式如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone lsd remote:path&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;rclone delete&lt;a href=&quot;#rclone-delete&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;删除指定目录的内容。命令格式如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone delete remote:path&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;说明：不同于 &lt;code&gt;rclone purge&lt;/code&gt;，&lt;code&gt;rclone delete&lt;/code&gt; 可使用 &lt;code&gt;include/exclude&lt;/code&gt; 过滤器选择删除文件内容。&lt;/p&gt;&lt;section&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;删除文件大小大于 100M 的文件&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 先检查哪些文件将被删除&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone --min-size 100M lsl remote:path                  # 使用rclone lsl 列出大于100M的文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone --dry-run --min-size 100M delete remote:path    # 使用--dry-run 检查将要被删除的文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 使用 rclone delete 进行文件删除&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone --min-size 100M delete remote:path&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;rclone size&lt;a href=&quot;#rclone-size&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;获取指定 path 下所有数据文件的总大小。命令格式如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rclone size remote:path&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;更多 rclone 命令，详见 &lt;a href=&quot;http://rclone.org/commands&quot; target=&quot;_blank&quot;&gt;http://rclone.org/commands&lt;/a&gt; 。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>NPS内网穿透工具安装使用教程</title><link>https://blog.moewah.com/posts/842/</link><guid isPermaLink="true">https://blog.moewah.com/posts/842/</guid><description>如何快速部署NPS内网穿透？本文详细讲解NPS（原easyProxy）的安装配置、服务端与客户端部署流程，支持TCP/UDP转发和Web管理面板，解决内网穿透中的常见问题。</description><pubDate>Mon, 25 Feb 2019 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;Frp&lt;/code&gt;、&lt;code&gt;lanproxy&lt;/code&gt;、&lt;code&gt;Holer&lt;/code&gt;等，现在再介绍个带&lt;code&gt;Web&lt;/code&gt;面板的&lt;code&gt;nps&lt;/code&gt;内网穿透工具，之前叫&lt;code&gt;easyProxy&lt;/code&gt;，只是改名了而已，该工具是一款使用&lt;code&gt;go&lt;/code&gt;语言编写的轻量级、功能强大的内网穿透服务器。支持&lt;code&gt;tcp&lt;/code&gt;、&lt;code&gt;udp&lt;/code&gt;流量转发，支持内网&lt;code&gt;http&lt;/code&gt;、&lt;code&gt;socks5&lt;/code&gt;代理，同时支持&lt;code&gt;snappy&lt;/code&gt;压缩(节省带宽和流量)、站点保护、加密传输、多路复用、&lt;code&gt;header&lt;/code&gt;修改等。同时还支持&lt;code&gt;web&lt;/code&gt;图形化管理。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;img alt=&quot;nps_ct(1).png&quot; loading=&quot;lazy&quot; width=&quot;1346&quot; height=&quot;640&quot; src=&quot;/_astro/842_3495723833_e23a73.BSdduY4k_Zj1ivE.webp&quot; srcset=&quot;/_astro/842_3495723833_e23a73.BSdduY4k_Z1FgNc7.webp 640w, /_astro/842_3495723833_e23a73.BSdduY4k_2moxV6.webp 750w, /_astro/842_3495723833_e23a73.BSdduY4k_Z22dPfk.webp 828w, /_astro/842_3495723833_e23a73.BSdduY4k_2l06AL.webp 1080w, /_astro/842_3495723833_e23a73.BSdduY4k_DuQIS.webp 1280w, /_astro/842_3495723833_e23a73.BSdduY4k_Zj1ivE.webp 1346w&quot; /&gt;&lt;figcaption&gt;nps_ct(1).png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;nps_ct(2).png&quot; loading=&quot;lazy&quot; width=&quot;1366&quot; height=&quot;652&quot; src=&quot;/_astro/842_2097396991_287105.DKsR5E-j_qdvPT.webp&quot; srcset=&quot;/_astro/842_2097396991_287105.DKsR5E-j_Z2fv21S.webp 640w, /_astro/842_2097396991_287105.DKsR5E-j_1Mak6k.webp 750w, /_astro/842_2097396991_287105.DKsR5E-j_2sJ4IP.webp 828w, /_astro/842_2097396991_287105.DKsR5E-j_ZiCtJj.webp 1080w, /_astro/842_2097396991_287105.DKsR5E-j_ADjSk.webp 1280w, /_astro/842_2097396991_287105.DKsR5E-j_qdvPT.webp 1366w&quot; /&gt;&lt;figcaption&gt;nps_ct(2).png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&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;Github地址：&lt;/strong&gt; &lt;a href=&quot;https://github.com/cnlh/nps&quot; target=&quot;_blank&quot;&gt;https://github.com/cnlh/nps&lt;/a&gt;&lt;/p&gt;&lt;p&gt;通常内网穿透工具都有服务端和客户端，安装要求如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;服务端：需要安装在一个有公网IP的服务器上，系统为Linux/Windows/Mac均可。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;客户端：一般安装在一个内网的VPS服务器或Windows/Mac电脑上使用。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;1、编译安装&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;提示：编译安装主要讲的Linux系统，其它系统(Win/Mac，也包括Linux)建议直接使用作者编译好的文件即可。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;安装&lt;code&gt;Go&lt;/code&gt;语言：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#Debian/Ubuntu系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt-get -y install golang&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#创建目录并定义GOPATH环境变量指向该目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir ~/workspace&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo &apos;export GOPATH=&quot;$HOME/workspace&quot;&apos; &amp;gt;&amp;gt; ~/.bashrc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;source ~/.bashrc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS/RHEL系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum -y install golang&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#创建目录并定义GOPATH环境变量指向该目录。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir ~/workspace&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo &apos;export GOPATH=&quot;$HOME/workspace&quot;&apos; &amp;gt;&amp;gt; ~/.bashrc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;source ~/.bashrc&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;安装&lt;code&gt;git&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#Debian/Ubuntu系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt-get -y install git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS/RHEL系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum -y install git&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;安装源码：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;go get github.com/cnlh/nps&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;编译服务端和客户端：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#进入指定目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd ~/workspace/src/github.com/cnlh/nps&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#编译服务端&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;go build cmd/nps/nps.go&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#编译客户端&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;go build cmd/npc/npc.go&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;编译好了后，就会在当前目录生成&lt;code&gt;npc&lt;/code&gt;或&lt;code&gt;nps&lt;/code&gt;二进制文件了，就可以直接拿来用了。&lt;/p&gt;&lt;p&gt;编译的时候可能出现的问题解决方法：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#只拿一种常见的错误做例子，有时候可能会出现很多种这样的提示&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lib/kcp/crypt.go:14:2: cannot find package &quot;golang.org/x/crypto/pbkdf2&quot; in any of:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;/usr/lib/go-1.7/src/golang.org/x/crypto/pbkdf2 (from $GOROOT)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;/root/workspace/src/golang.org/x/crypto/pbkdf2 (from $GOPATH)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#意思是缺少这种包，然后记住提示的地址，比如上面的golang.org/x/crypto/pbkdf2，有时候也会提示的github地址。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;然后再使用命令 go get golang.org/x/crypto/pbkdf2 命令安装一下就行了。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2、直接安装&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;除了自己编译外，作者也直接提供了编译好的文件给你使用，文件下载地址：&lt;a href=&quot;https://github.com/cnlh/nps/releases&quot; target=&quot;_blank&quot;&gt;点击进去&lt;/a&gt;，然后再根据自己的系统架构下载对应的最新版服务端和客户端。&lt;/p&gt;&lt;p&gt;如果对于&lt;code&gt;Linux&lt;/code&gt;服务器还是不知道怎么选择的，这里拿&lt;code&gt;Vultr&lt;/code&gt;、搬瓦工大多数&lt;code&gt;VPS&lt;/code&gt;为例。先使用命令&lt;code&gt;getconf LONG_BIT&lt;/code&gt;获取系统版本，&lt;code&gt;32&lt;/code&gt;位就选&lt;code&gt;386&lt;/code&gt;，&lt;code&gt;64&lt;/code&gt;就选&lt;code&gt;amd64&lt;/code&gt;，具体还是以实际情况为准。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;NPS内网穿透服务器部署&lt;a href=&quot;#nps内网穿透服务器部署&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这里博主使用的是&lt;code&gt;Vultr Linux x64&lt;/code&gt;服务器，直接使用命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#记得复制前先将下面链接替换成当前最新版地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd ~&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#下载并解压服务端&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget https://github.com/ehang-io/nps/releases/download/v0.26.10/linux_amd64_server.tar.gz &amp;amp;&amp;amp; tar zxvf  linux_amd64_server.tar.gz&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#编辑配置文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd nps&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod +x nps&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#新版中app.conf已更名为nps.conf&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nano conf/app.conf&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;配置文件参数如下：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#web管理端口&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;httpport&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#web界面管理密码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;password&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#服务端客户端通信端口&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;bridePort&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#ssl certFile绝对路径&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pemPath&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#ssl keyFile绝对路径&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;keyPath&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#域名代理https代理监听端口&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;httpsProxyPort&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#域名代理http代理监听端口&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;httpProxyPort&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#web api免验证IP地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;authip&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#客户端与服务端连接方式kcp或tcp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;bridgeType&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;**注意：**若服务器已占用&lt;code&gt;80/443&lt;/code&gt;端口，请将&lt;code&gt;httpsProxyPort&lt;/code&gt;&amp;amp;&lt;code&gt;httpProxyPort&lt;/code&gt;更换为其它端口，否则端口冲突将导致面板无法开启。&lt;/p&gt;&lt;p&gt;然后启动服务端：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#重启/停止服务端&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;./nps stop|start|restart&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后打开地址&lt;code&gt;http://ip:8080&lt;/code&gt;访问管理界面，具体端口以自己修改的为准，再使用密码登录进去，默认为&lt;code&gt;123&lt;/code&gt;。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#如果打不开Web界面，就需要开启防火墙，一般CentOS系统出现情况最多&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#Centos 6系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iptables -I INPUT -p tcp --dport 8080 -j ACCEPT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service iptables save&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service iptables restart&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 7系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --zone=public --add-port=8080/tcp --permanent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --reload&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;对于有些服务器，比如阿里云，谷歌云等，还需要在服务器管理面板上开放&lt;code&gt;Web&lt;/code&gt;端口才行。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;NPS内网穿透客户端使用&lt;a href=&quot;#nps内网穿透客户端使用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;1、Linux系统&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#比如下载的客户端文件在根目录，先进入根目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd ~&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#启动客户端，比如服务端公网IP为1.1.1.1，服务端配置文件中tcpport为8284&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;./npc -server=1.1.1.1:8284 -vkey=客户端的密钥&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2、Windows系统&lt;/strong&gt;
首先按住&lt;code&gt;Win+R&lt;/code&gt;，输入&lt;code&gt;cmd&lt;/code&gt;进入命令窗口，然后使用命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#比如下载的客户端文件在D盘，先进入到D盘&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd /d d:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#启动客户端，比如服务端公网IP为1.1.1.1，服务端配置文件中tcpport为8284&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npc.exe -server=1.1.1.1:8284 -vkey=客户端的密钥&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;至于&lt;code&gt;Mac&lt;/code&gt;系统启动参考上面就行。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;NPS内网穿透使用场景&lt;a href=&quot;#nps内网穿透使用场景&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;关于使用场景，&lt;code&gt;Github&lt;/code&gt;文档写的很清楚了，这里大概的说下。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1、tcp隧道模式&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;适用：想在外网通过ssh连接内网的机器，做云服务器到内网服务器端口的映射，或者做微信公众号开发、小程序开发等。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;详细教程→&lt;a href=&quot;https://github.com/cnlh/nps#tcp%E9%9A%A7%E9%81%93&quot; target=&quot;_blank&quot;&gt;点击查看&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2、udp隧道模式&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;适用：在非内网环境下使用内网dns，或者需要通过udp访问内网机器等。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;详细教程→&lt;a href=&quot;https://github.com/cnlh/nps#udp%E9%9A%A7%E9%81%93&quot; target=&quot;_blank&quot;&gt;点击查看&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3、http代理模式&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;适用：在外网使用HTTP代理访问内网站点。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;详细教程→&lt;a href=&quot;https://github.com/cnlh/nps#http%E6%AD%A3%E5%90%91%E4%BB%A3%E7%90%86&quot; target=&quot;_blank&quot;&gt;点击查看&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4、socks5代理模式&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;适用：搭建一个内网穿透55，在外网如同使用内网v皮n一样访问内网资源或者设备。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;详细教程→&lt;a href=&quot;https://github.com/cnlh/nps#socks5%E4%BB%A3%E7%90%86&quot; target=&quot;_blank&quot;&gt;点击查看&lt;/a&gt;。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;1、数据压缩支持&lt;/strong&gt;
由于是内网穿透，内网客户端与服务端之间的隧道存在大量的数据交换，为节省流量，加快传输速度，由此本程序支持&lt;code&gt;SNNAPY&lt;/code&gt;形式的压缩。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;所有模式均支持数据压缩，可以与加密同时使用&lt;/li&gt;
&lt;li&gt;开启此功能会增加&lt;code&gt;cpu&lt;/code&gt;和内存消耗&lt;/li&gt;
&lt;li&gt;在&lt;code&gt;server&lt;/code&gt;端加上参数&lt;code&gt;-compress=snappy&lt;/code&gt;(或在&lt;code&gt;web&lt;/code&gt;管理中设置)&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;2、加密传输&lt;/strong&gt;
如果公司内网防火墙对外网访问进行了流量识别与屏蔽，例如禁止了&lt;code&gt;ssh&lt;/code&gt;协议等，通过设置配置文件，将服务端与客户端之间的通信内容加密传输，将会有效防止流量被拦截。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;开启此功能会增加&lt;code&gt;cpu&lt;/code&gt;和内存消耗&lt;/li&gt;
&lt;li&gt;在&lt;code&gt;server&lt;/code&gt;端加上参数&lt;code&gt;-crypt=true&lt;/code&gt;(或在web管理中设置)&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;3、站点保护&lt;/strong&gt;
域名代理模式所有客户端共用一个&lt;code&gt;http&lt;/code&gt;服务端口，在知道域名后任何人都可访问，一些开发或者测试环境需要保密，所以可以设置用户名和密码，&lt;code&gt;nps&lt;/code&gt;将通过&lt;code&gt;Http Basic Auth&lt;/code&gt;来保护，访问时需要输入正确的用户名和密码。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;web&lt;/code&gt;管理中可配置&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;4、host修改&lt;/strong&gt;
由于内网站点需要的&lt;code&gt;host&lt;/code&gt;可能与公网域名不一致，域名代理支持&lt;code&gt;host&lt;/code&gt;修改功能，即修改&lt;code&gt;request&lt;/code&gt;的&lt;code&gt;header&lt;/code&gt;中的&lt;code&gt;host&lt;/code&gt;字段。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;在&lt;code&gt;web&lt;/code&gt;管理中设置&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;5、自定义header&lt;/strong&gt;
支持对&lt;code&gt;header&lt;/code&gt;进行新增或者修改，以配合服务的需要。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6、404页面配置&lt;/strong&gt;
支持域名解析模式的自定义&lt;code&gt;404&lt;/code&gt;页面，修改&lt;code&gt;/web/static/page/error.html&lt;/code&gt;中内容即可，暂不支持静态文件等内容。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;7、流量限制&lt;/strong&gt;
支持客户端级流量限制，当该客户端入口流量与出口流量达到设定的总量后会拒绝服务，域名代理会返回&lt;code&gt;404&lt;/code&gt;页面，其他会拒绝连接。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;8、带宽限制&lt;/strong&gt;
支持客户端级带宽限制，带宽计算方式为入口和出口总和，权重均衡。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;9、负载均衡&lt;/strong&gt;
本代理支持域名解析模式的负载均衡，在&lt;code&gt;web&lt;/code&gt;域名添加或者编辑中内网目标分行填写多个目标即可实现轮训级别的负载均衡。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;10、守护进程&lt;/strong&gt;
本代理支持守护进程，使用示例如下，服务端客户端所有模式通用，支持&lt;code&gt;linux&lt;/code&gt;、&lt;code&gt;darwin&lt;/code&gt;、&lt;code&gt;windows&lt;/code&gt;。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;./(nps|npc) start|stop|restart|status 若有其他参数可加其他参数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(nps|npc).exe start|stop|restart|status 若有其他参数可加其他参数&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;11、KCP协议支持&lt;/strong&gt;
&lt;code&gt;KCP&lt;/code&gt;是一个快速可靠协议，能以比&lt;code&gt;TCP&lt;/code&gt;浪费&lt;code&gt;10%-20%&lt;/code&gt;的带宽的代价，换取平均延迟降低&lt;code&gt;30%-40%&lt;/code&gt;，在弱网环境下对性能能有一定的提升。可在&lt;code&gt;app.conf&lt;/code&gt;中修改&lt;code&gt;bridgeType&lt;/code&gt;为&lt;code&gt;kcp&lt;/code&gt;。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;当服务端为&lt;code&gt;kcp&lt;/code&gt;时，客户端连接时也需要加上参数&lt;code&gt;-type=kcp&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;该工具很强大，更多的使用可以自行研究。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>梅林固件安装opkg包管理工具完整教程</title><link>https://blog.moewah.com/posts/1661/</link><guid isPermaLink="true">https://blog.moewah.com/posts/1661/</guid><description>如何在梅林固件中成功安装opkg？本文详细讲解从开启JFFS分区到配置自动挂载的完整流程，解决opkg安装路径选择与可靠性问题，助你轻松管理路由器软件包。</description><pubDate>Fri, 01 Feb 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本文主要记录一下，如何在梅林固件中安装opkg。装的时候可以根据自己的情况把Opkg装在其他地方，我是把Opkg装载jffs的，因为放在usb设备里不太可靠，挂了个硬盘盒平时碰一下可能就掉了。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;3.png&quot; loading=&quot;lazy&quot; width=&quot;522&quot; height=&quot;172&quot; src=&quot;/_astro/1661_4104772878_3cdcbd.r0djDLb__Z1dzYyc.webp&quot; srcset=&quot;/_astro/1661_4104772878_3cdcbd.r0djDLb__Z1dzYyc.webp 522w&quot; /&gt;&lt;figcaption&gt;3.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;装之前需要打开JFFS partition、打开ssh。&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;opkg安装教程&lt;a href=&quot;#opkg安装教程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;1、创建软件安装目录&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd /jffs&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir /jffs/opt&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ln -nsf /jffs/opt /tmp/opt&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;2、安装opkg&lt;/p&gt;&lt;p&gt;下载国外大神的脚本&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget http://qnapware.zyxmon.org/binaries-armv7/installer/entware_install_arm.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后运行脚本：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sh entware_install_arm.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;等待脚本运行完毕。&lt;/p&gt;&lt;p&gt;3、自动挂载opt分区&lt;/p&gt;&lt;p&gt;使用&lt;code&gt;touch&lt;/code&gt;命令在&lt;code&gt;/jffs/scripts&lt;/code&gt;位置建立名为&lt;code&gt;post-mount&lt;/code&gt;的脚本文件，脚本内容如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#!/bin/sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ln -nsf /jffs/opt /tmp/opt&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;最后获取脚本文件的权限，命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod a+rx /jffs/scripts/post-mount&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;至此opkg软件源安装完毕。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Searx自建搜索平台全攻略：私有化部署实战指南</title><link>https://blog.moewah.com/posts/796/</link><guid isPermaLink="true">https://blog.moewah.com/posts/796/</guid><description>想实现自建搜索平台吗？本文详解Searx私有化部署全流程，提供自建搜索配置与使用技巧，帮助你快速搭建Searx搜索平台，实现高效检索与私有化管理并提升用户体验和搜索精准度。</description><pubDate>Mon, 28 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近找到了个好项目&lt;code&gt;Searx&lt;/code&gt;，一个基于&lt;code&gt;Python&lt;/code&gt;的完全开源免费搜索引擎平台，为你提供来自&lt;code&gt;Google&lt;/code&gt;、&lt;code&gt;Bing&lt;/code&gt;、&lt;code&gt;Yahoo&lt;/code&gt;等&lt;code&gt;70&lt;/code&gt;多种各大视频、图片、搜索、磁力等网站结果展示，并对搜索结果进行优化，同时不会存储你的任何搜索信息，搭建也很方便，有兴趣的可以搭建给需要谷歌的同事或朋友用下。&lt;/p&gt;
&lt;section&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;figure&gt;&lt;img alt=&quot;Searx(1).png&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;921&quot; src=&quot;/_astro/796_1386448874_33b146.CvS11Dfz_Z1puT6I.webp&quot; srcset=&quot;/_astro/796_1386448874_33b146.CvS11Dfz_Z28iaGr.webp 640w, /_astro/796_1386448874_33b146.CvS11Dfz_ZeImD5.webp 750w, /_astro/796_1386448874_33b146.CvS11Dfz_Z2ufcJE.webp 828w, /_astro/796_1386448874_33b146.CvS11Dfz_1ods9h.webp 1080w, /_astro/796_1386448874_33b146.CvS11Dfz_2iugLU.webp 1280w, /_astro/796_1386448874_33b146.CvS11Dfz_15G52h.webp 1668w, /_astro/796_1386448874_33b146.CvS11Dfz_Z1puT6I.webp 1920w&quot; /&gt;&lt;figcaption&gt;Searx(1).png&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img alt=&quot;Searx(2).png&quot; loading=&quot;lazy&quot; width=&quot;1903&quot; height=&quot;919&quot; src=&quot;/_astro/796_4292097554_35aa72.B47xd9fl_Z2oPTX2.webp&quot; srcset=&quot;/_astro/796_4292097554_35aa72.B47xd9fl_Z1rxiNd.webp 640w, /_astro/796_4292097554_35aa72.B47xd9fl_r1uf9.webp 750w, /_astro/796_4292097554_35aa72.B47xd9fl_Z1U6zbU.webp 828w, /_astro/796_4292097554_35aa72.B47xd9fl_Z2amXmS.webp 1080w, /_astro/796_4292097554_35aa72.B47xd9fl_ZJlHTX.webp 1280w, /_astro/796_4292097554_35aa72.B47xd9fl_ZMk3OV.webp 1668w, /_astro/796_4292097554_35aa72.B47xd9fl_Z2oPTX2.webp 1903w&quot; /&gt;&lt;figcaption&gt;Searx(2).png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&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;a href=&quot;https://github.com/asciimoo/searx&quot; target=&quot;_blank&quot;&gt;https://github.com/asciimoo/searx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1、安装pip&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 6.x 32位&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum install -y python-pip&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 6.x 64位&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum install -y python-pip&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 7.x&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum install -y epel-release&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum install -y python-pip&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#如果CentOS 7安装出现No package python-pip available，可以用以下命令进行安装&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget https://bootstrap.pypa.io/get-pip.py&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;python get-pip.py&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#Debian/Ubuntu系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt-get -y update&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt-get -y install python-pip&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2、安装git&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#Debian/Ubuntu系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt-get -y install git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum -y install git&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;3、编辑Searx&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#拉取源码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git clone https://github.com/asciimoo/searx.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#安装依赖&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd searx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pip install -r requirements.txt&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#编辑配置文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nano searx/settings.yml&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;修改名称什么参数，应该都看的懂，自行设置，这里只说下&lt;code&gt;4&lt;/code&gt;种参数：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;language：为搜索语言，默认en-US，如果你的搜索以中文为主，那就改成zh-CN，当然这个语言在搜索界面也可以设置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;port：为监听端口，默认8888，可自行修改。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;bind_address：为监控地址，默认为127.0.0.1，如果需要让ip地址能被外网访问，就修改为0.0.0.0，这里建议默认，然后再用域名反代即可。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;secret_key：该参数为加密密匙，可自行设置，数值可以在ssh客户端使用openssl rand -hex 16命令生成。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;这里你也可以不用&lt;code&gt;nano&lt;/code&gt;编辑器，直接使用命令修改：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#修改language，默认为中文搜索结果&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sed -i &apos;s/language : &quot;en-US&quot;/language : &quot;zh-CN&quot;/g&apos; searx/settings.yml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#修改secret_key&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sed -i &quot;s/ultrasecretkey/`openssl rand -hex 16`/g&quot; searx/settings.yml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#修改bind_address，改了后就可以使用ip访问了，如果你使用域名的话，可以不修改&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sed -i &apos;s/bind_address : &quot;127.0.0.1&quot;/bind_address : &quot;0.0.0.0&quot;/g&apos; searx/settings.yml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#修改port，比如修改成8000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sed -i &quot;s/port : 8888/port : 8000/g&quot; searx/settings.yml&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;更多参数设置可以参考→&lt;a href=&quot;https://github.com/asciimoo/searx/wiki/settings.yml&quot; target=&quot;_blank&quot;&gt;传送门&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4、运行Searx&lt;/strong&gt;
安装&lt;code&gt;screen&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum install screen -y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#Debian/Ubuntu系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apt-get install screen -y&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;后台运行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;screen -dmS python searx/webapp.py&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后使用&lt;code&gt;ip:port&lt;/code&gt;访问，如果你的&lt;code&gt;bind_address&lt;/code&gt;地址没修改，可能浏览器会访问不了，就需要反代了，方法后面会说。&lt;/p&gt;&lt;p&gt;如果你修改了&lt;code&gt;bind_address&lt;/code&gt;地址为&lt;code&gt;0.0.0.0&lt;/code&gt;，还打不开媒体界面的话，还需要开启防火墙端口，使用命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 6&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iptables -I INPUT -p tcp --dport 8888 -j ACCEPT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service iptables save&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service iptables restart&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#CentOS 7&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --zone=public --add-port=8888/tcp --permanent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firewall-cmd --reload&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果你开了端口还不能打开，可能还需要去服务商后台开启对应的端口。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;Nginx&lt;/code&gt;、&lt;code&gt;Apache&lt;/code&gt;、&lt;code&gt;Caddy&lt;/code&gt;，这里只说&lt;code&gt;Nginx&lt;/code&gt;和&lt;code&gt;Caddy&lt;/code&gt;。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;Caddy&lt;a href=&quot;#caddy&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;安装&lt;code&gt;Caddy&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/caddy_install.sh &amp;amp;&amp;amp; chmod +x caddy_install.sh &amp;amp;&amp;amp; bash caddy_install.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#备用地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget -N --no-check-certificate https://blog.moewah.com/source/caddy_install.sh &amp;amp;&amp;amp; chmod +x caddy_install.sh &amp;amp;&amp;amp; bash caddy_install.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;配置&lt;code&gt;Caddy&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#以下全部内容是一个整体，请修改域名和邮箱后一起复制到SSH运行！&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#http访问，该配置不会自动签发SSL&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo &quot;www.moewah.com {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;gzip&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy / 127.0.0.1:8888 {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;header_upstream Host {host}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;header_upstream X-Real-IP {remote}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;header_upstream X-Forwarded-For {remote}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;header_upstream X-Forwarded-Proto {scheme}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&quot; &amp;gt; /usr/local/caddy/Caddyfile&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#https访问，该配置会自动签发SSL，请提前解析域名到VPS服务器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo &quot;www.moewah.com {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;gzip&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tls admin@moewah.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy / 127.0.0.1:8888 {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;header_upstream Host {host}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;header_upstream X-Real-IP {remote}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;header_upstream X-Forwarded-For {remote}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;header_upstream X-Forwarded-Proto {scheme}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&quot; &amp;gt; /usr/local/caddy/Caddyfile&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;tls&lt;/code&gt;参数会自动帮你签发&lt;code&gt;ssl&lt;/code&gt;证书，如果你要使用自己的&lt;code&gt;ssl&lt;/code&gt;，改为&lt;code&gt;tls /root/xx.crt /root/xx.key&lt;/code&gt;即可。后面为&lt;code&gt;ssl&lt;/code&gt;证书路径。&lt;/p&gt;&lt;p&gt;启动&lt;code&gt;Caddy&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/etc/init.d/caddy start&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;就可以打开域名进行访问了。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Nginx&lt;a href=&quot;#nginx&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果你使用其它的，这里就大概发个&lt;code&gt;Nginx&lt;/code&gt;反代配置，直接添加到配置文件即可，不然搜出来的结果可能不会让你满意。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#在配置文件里添加&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;location / {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_pass http://127.0.0.1:8888;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header        Host                 $host;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header        X-Real-IP            $remote_addr;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header        X-Forwarded-For      $proxy_add_x_forwarded_for;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header        X-Remote-Port        $remote_port;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_set_header        X-Forwarded-Proto    $scheme;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;proxy_redirect          off;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;最后使用的时候，记得在高级设置那里将搜索语言设置成你需要的就行了。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Docker-Compose自部署RSSHub，打造个人专属信息聚合系统</title><link>https://blog.moewah.com/posts/1364/</link><guid isPermaLink="true">https://blog.moewah.com/posts/1364/</guid><description>如何用Docker-Compose自建RSSHub服务？本文详细拆解从环境准备到配置优化的全流程，解决访问速度慢、内容质量差等问题，助你快速搭建属于自己的RSS信息流订阅系统，并提供从安装Docker到配置环境变量的完整指南，让你轻松掌握自建RSS信息流的方法。</description><pubDate>Mon, 14 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;说实话，最近几年我越来越依赖 RSS 订阅来获取信息了。你可能也有同感：刷各种 App 越来越浪费时间，信息流算法不断推送你不需要的内容，真正有价值的东西反而不容易看到。&lt;/p&gt;&lt;p&gt;&lt;img loading=&quot;lazy&quot; width=&quot;781&quot; height=&quot;412&quot; src=&quot;/_astro/1364_rsshub-cover.CxSbdu9J_12OLpe.webp&quot; srcset=&quot;/_astro/1364_rsshub-cover.CxSbdu9J_1HzqeX.webp 640w, /_astro/1364_rsshub-cover.CxSbdu9J_Z1PoG6m.webp 750w, /_astro/1364_rsshub-cover.CxSbdu9J_12OLpe.webp 781w&quot; /&gt;&lt;/p&gt;&lt;p&gt;刚开始接触 RSS 的时候，也被各种 RSS 阅读器搞得头大。但后来发现，真正的痛点不是阅读器，而是没有好用的 RSS 源。很多网站根本不提供 RSS 订阅功能，或者提供的 RSS 源内容质量很差。&lt;/p&gt;&lt;p&gt;直到我遇到了 &lt;strong&gt;RSSHub&lt;/strong&gt;。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;RSSHub 是什么？&lt;a href=&quot;#rsshub-是什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;RSSHub 是一个轻量、易于扩展的 RSS 生成器，项目地址：&lt;a href=&quot;https://github.com/DIYgod/RSSHub&quot; target=&quot;_blank&quot;&gt;https://github.com/DIYgod/RSSHub&lt;/a&gt;&lt;/p&gt;&lt;p&gt;简单来说，它可以给”任何”内容生成 RSS 订阅源。我用了这么久，真心觉得它的功能强大到令人惊讶。目前它支持：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;B 站&lt;/strong&gt;：番剧、UP 主投稿、UP 主动态、UP 主收藏夹、分区视频&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;：首页、7 日热门、30 日热门、专题、作者&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;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;pixiv&lt;/strong&gt;：用户收藏、用户动态、排行榜&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;远远不止这些，还有很多很多…&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;为什么要自己部署 RSSHub？&lt;a href=&quot;#为什么要自己部署-rsshub&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;你可能想问：官方不是有现成的 &lt;code&gt;rsshub.app&lt;/code&gt; 实例吗？为什么还要自己折腾？&lt;/p&gt;&lt;p&gt;自部署的两个主要原因：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;访问速度快&lt;/strong&gt;：官方实例可能会被墙，只要官方会继续镜像的更新和维护，那么自己部署使用会更稳妥一些。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可定制配置&lt;/strong&gt;：支持通过环境变量进行个性化配置。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&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;一台服务器（推荐 2GB 内存以上，阿里云/腾讯云 99 元/年的轻量服务器就够用）&lt;/li&gt;
&lt;li&gt;服务器上已安装 Docker 和 Docker Compose&lt;/li&gt;
&lt;/ul&gt;&lt;section&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;如果你还没安装 Docker，可以按照官方教程来安装：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 使用官方一键安装脚本&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-fsSL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://get.docker.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;sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 如果是非 Root 账户，将当前账户添加到 &quot;docker&quot; 组&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;usermod&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-aG&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;$USER&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;安装 Docker Compose&lt;a href=&quot;#安装-docker-compose&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 从 GitHub 下载到本地相应目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-L&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-&lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;uname&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-s&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;uname&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-m&lt;/span&gt;&lt;span&gt;)&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-o&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/usr/local/bin/docker-compose&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 赋予 Docker Compose 目录相应权限&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;chmod&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;/usr/local/bin/docker-compose&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;注意：上面命令中的 &lt;code&gt;v2.24.0&lt;/code&gt; 可以更换为你想要的任何版本，你可以去 &lt;a href=&quot;https://github.com/docker/compose/releases&quot; target=&quot;_blank&quot;&gt;Docker Compose Releases&lt;/a&gt; 查看最新版本。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;使用 Docker Compose 部署 RSSHub&lt;a href=&quot;#使用-docker-compose-部署-rsshub&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;之前折腾过很多部署方式，Docker Compose 真的是最简单、最稳定的方案。这里我就用官方提供的 &lt;a href=&quot;https://raw.githubusercontent.com/DIYgod/RSSHub/refs/heads/master/docker-compose.yml&quot; target=&quot;_blank&quot;&gt;docker-compose.yml&lt;/a&gt; 配置文件来进行部署。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;第 1 步：下载并配置 docker-compose.yml 文件&lt;a href=&quot;#第-1-步下载并配置-docker-composeyml-文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在服务器上创建一个目录来存放 RSSHub 的配置文件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/opt/rsshub&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/opt/rsshub&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后创建 docker-compose.yml 文件。我建议先在本地电脑上编辑好，再上传到服务器。下面是官方提供的配置文件（我做了一些必要的修改）：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;services&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;rsshub&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;diygod/rsshub&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;restart&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;always&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &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;&lt;/span&gt;&lt;span&gt;1200:1200&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;environment&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;NODE_ENV&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;production&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;CACHE_TYPE&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;redis&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;REDIS_URL&lt;/span&gt;&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;&lt;/span&gt;&lt;span&gt;redis://redis:6379/&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;PUPPETEER_WS_ENDPOINT&lt;/span&gt;&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;&lt;/span&gt;&lt;span&gt;ws://browserless:3000&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;# ACCESS_KEY: &apos;ILoveRSSHub&apos;  # 配置一个访问密钥，订阅源仅通过密钥访问，如 https://rsshub.app/qdaily/column/59?key=ILoveRSSHub&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;# PROXY_URI: http://192.168.0.10:7890  # 按需配置 http 代理&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;healthcheck&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;test&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&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;&lt;/span&gt;&lt;span&gt;CMD&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;-f&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;http://localhost:1200/healthz&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;interval&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;30s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;timeout&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;10s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;retries&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;depends_on&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;redis&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;browserless&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;browserless&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;browserless/chrome&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;restart&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;always&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;ulimits&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;core&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;hard&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;soft&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;healthcheck&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;test&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&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;&lt;/span&gt;&lt;span&gt;CMD&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;-f&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;http://localhost:3000/pressure&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;interval&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;30s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;timeout&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;10s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;retries&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;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;redis&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;redis:alpine&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;restart&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;always&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;redis-data:/data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;healthcheck&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;test&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&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;&lt;/span&gt;&lt;span&gt;CMD&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;redis-cli&lt;/span&gt;&lt;span&gt;&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;&apos;&lt;/span&gt;&lt;span&gt;ping&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;interval&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;30s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;timeout&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;10s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;retries&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;start_period&lt;/span&gt;&lt;span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;5s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;volumes&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;redis-data&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;把这个配置文件保存为 &lt;code&gt;docker-compose.yml&lt;/code&gt;，然后上传到服务器的 &lt;code&gt;/opt/rsshub&lt;/code&gt; 目录。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第 2 步：启动 RSSHub&lt;a href=&quot;#第-2-步启动-rsshub&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在 &lt;code&gt;/opt/rsshub&lt;/code&gt; 目录下执行下面命令会自动完成镜像拉取和容器启动：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker-compose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;up&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;p&gt;启动完成后，可以用以下命令检查服务运行状态：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker-compose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ps&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;你应该能看到三个服务都在运行：rsshub、browserless、redis。如果某个服务的状态不是 “Up”，可以用 &lt;code&gt;docker-compose logs&lt;/code&gt; 查看日志排查问题。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第 4 步：访问 RSSHub&lt;a href=&quot;#第-4-步访问-rsshub&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;打开浏览器，输入 &lt;code&gt;http://&amp;lt;你的服务器IP&amp;gt;:1200&lt;/code&gt;，如果你能看到 RSSHub 的欢迎页面，说明部署成功了！&lt;/p&gt;&lt;/section&gt;&lt;section&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;除了基础部署，RSSHub 还支持丰富的配置选项，比如：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;内容过滤&lt;/strong&gt;：通过正则表达式过滤 RSS 源内容&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;访问控制&lt;/strong&gt;：配置访问密钥保护你的 RSS 源&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缓存配置&lt;/strong&gt;：调整缓存策略和过期时间&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代理配置&lt;/strong&gt;：设置代理访问受限制的内容&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;图片处理&lt;/strong&gt;：配置图片代理和优化&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果你需要这些高级功能，可以访问 &lt;a href=&quot;https://docs.rsshub.app/zh/guide/parameters&quot; target=&quot;_blank&quot;&gt;RSSHub 官方文档 - 参数配置&lt;/a&gt; 了解详细使用方法。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;使用 Caddy 反向代理添加 SSL 证书&lt;a href=&quot;#使用-caddy-反向代理添加-ssl-证书&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;如果你有自己的域名，可以用 Caddy 配置反向代理并自动申请 SSL 证书，实现 HTTPS 访问。Caddy 的优势是配置简单、自动续期 SSL 证书，而且占用资源很小。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;安装 Caddy&lt;a href=&quot;#安装-caddy&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在服务器上执行以下命令安装 Caddy：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Ubuntu/Debian 系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;debian-keyring&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;debian-archive-keyring&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt-transport-https&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-1sLf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;https://dl.cloudsmith.io/public/caddy/stable/gpg.key&lt;/span&gt;&lt;span&gt;&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;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;gpg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--dearmor&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-o&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/usr/share/keyrings/caddy-stable-archive-keyring.gpg&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-1sLf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt&lt;/span&gt;&lt;span&gt;&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;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tee&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/apt/sources.list.d/caddy-stable.list&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;caddy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# CentOS/RHEL 系统&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yum&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yum-plugin-copr&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yum&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;copr&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;enable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@caddy/caddy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;yum&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;caddy&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;配置 Caddy&lt;a href=&quot;#配置-caddy&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;编辑 Caddy 配置文件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;vim&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/etc/caddy/Caddyfile&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;添加以下内容（修改域名、邮箱和 IP 地址）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;your-domain.com {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;reverse_proxy 127.0.0.1:1200&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 自动申请 Let&apos;s Encrypt SSL 证书&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tls your@email.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 日志配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;log {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;output file /var/log/caddy/access.log&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# Gzip 压缩&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;encode gzip&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&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;your-domain.com&lt;/code&gt;：替换为你的域名&lt;/li&gt;
&lt;li&gt;&lt;code&gt;127.0.0.1:1200&lt;/code&gt;：RSSHub 的监听地址和端口（如果是同一服务器，可以用 127.0.0.1；如果是其他服务器，填写实际 IP）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;your@email.com&lt;/code&gt;：替换为你的邮箱，用于 SSL 证书申请&lt;/li&gt;
&lt;li&gt;Caddy 会自动向 Let’s Encrypt 申请免费的 SSL 证书，并自动续期&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;启动 Caddy&lt;a href=&quot;#启动-caddy&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 启动 Caddy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;caddy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 设置开机自启&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;enable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;caddy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 检查状态&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;systemctl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;status&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;caddy&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&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;https://your-domain.com&lt;/code&gt; 访问你的 RSSHub 辣。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&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;最后推荐一下我现在的信息流获取的方式：RSSHub 生成各种 RSS 源 → &lt;a href=&quot;https://blog.moewah.com/posts/1903/&quot;&gt;FreshRSS&lt;/a&gt; 进行 RSS 订阅源聚合统一进行管理 → iOS / macOS 上使用免费的开源 RSS 客户端—&amp;gt; &lt;a href=&quot;https://netnewswire.com/&quot; target=&quot;_blank&quot;&gt;NetNewsWire&lt;/a&gt; 进行阅读。整个过程就像建立了一个属于自己的信息过滤系统，只让真正有价值的内容进来。&lt;/p&gt;&lt;p&gt;你可能会问：现在都 2026 年了，RSS 这种老掉牙的技术还有必要折腾吗？&lt;/p&gt;&lt;p&gt;我的答案是：&lt;strong&gt;非常有必要&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;在这个信息爆炸的时代，主动选择自己想要什么，比被动接受算法推送更重要。RSSHub 让我们能够把分散在各个平台的信息聚合到一处，按照自己的节奏阅读，这才是真正的信息自由。&lt;/p&gt;&lt;p&gt;如果你还没有尝试过 RSS，现在就是最好的时机。用这篇文章的方法，花 10 分钟时间部署一个属于自己的 RSSHub，开始构建属于你自己的信息流吧～&lt;/p&gt;&lt;/section&gt;
&lt;section&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;strong&gt;RSSHub 官方文档&lt;/strong&gt;：&lt;a href=&quot;https://docs.rsshub.app/zh/&quot; target=&quot;_blank&quot;&gt;https://docs.rsshub.app/zh/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RSSHub GitHub 项目&lt;/strong&gt;：&lt;a href=&quot;https://github.com/DIYgod/RSSHub&quot; target=&quot;_blank&quot;&gt;https://github.com/DIYgod/RSSHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RSSHub Radar 浏览器插件&lt;/strong&gt;：&lt;a href=&quot;https://github.com/DIYgod/RSSHub-Radar&quot; target=&quot;_blank&quot;&gt;https://github.com/DIYgod/RSSHub-Radar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ALL About RSS&lt;/strong&gt;：&lt;a href=&quot;https://github.com/AboutRSS/ALL-about-RSS&quot; target=&quot;_blank&quot;&gt;https://github.com/AboutRSS/ALL-about-RSS&lt;/a&gt; - RSS 相关内容的合集&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>Kcptun网络加速工具安装使用教程（服务端&amp;客户端）</title><link>https://blog.moewah.com/posts/1249/</link><guid isPermaLink="true">https://blog.moewah.com/posts/1249/</guid><description>如何用Kcptun提升网络传输速度？本文详解Kcptun服务端与客户端的安装配置，提供从环境准备到参数设置的完整教程，帮助用户快速实现TCP流量加速与低延迟传输。</description><pubDate>Tue, 01 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;Kcptun&lt;/code&gt;是一个非常简单和快速的，基于&lt;code&gt;KCP&lt;/code&gt;协议的&lt;code&gt;UDP&lt;/code&gt;隧道，它可以将&lt;code&gt;TCP&lt;/code&gt;流转换为&lt;code&gt;KCP+UDP&lt;/code&gt;流。而&lt;code&gt;KCP&lt;/code&gt;是一个快速可靠协议，能以比&lt;code&gt;TCP&lt;/code&gt;浪费10%-20%的带宽的代价，换取平均延迟降低30%-40%，且最大延迟降低三倍的传输效果。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;kcptun.png&quot; loading=&quot;lazy&quot; width=&quot;1402&quot; height=&quot;600&quot; src=&quot;/_astro/1249_3061833949_180974.ClqHLJ-H_Z3Oz3i.webp&quot; srcset=&quot;/_astro/1249_3061833949_180974.ClqHLJ-H_1btdrM.webp 640w, /_astro/1249_3061833949_180974.ClqHLJ-H_Z1S4P9L.webp 750w, /_astro/1249_3061833949_180974.ClqHLJ-H_Z17OrqD.webp 828w, /_astro/1249_3061833949_180974.ClqHLJ-H_ZAuooX.webp 1080w, /_astro/1249_3061833949_180974.ClqHLJ-H_ZcJvtJ.webp 1280w, /_astro/1249_3061833949_180974.ClqHLJ-H_Z3Oz3i.webp 1402w&quot; /&gt;&lt;figcaption&gt;kcptun.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;Kcptun&lt;/code&gt;是&lt;code&gt;KCP&lt;/code&gt;协议的一个简单应用，可以用于任意&lt;code&gt;TCP&lt;/code&gt;网络程序的传输承载，以提高网络流畅度，降低掉线情况。由于 &lt;code&gt;Kcptun&lt;/code&gt;使用&lt;code&gt;Go&lt;/code&gt;语言编写，内存占用低（经测试，在64M内存服务器上稳定运行），而且适用于所有平台，甚至&lt;code&gt;Arm&lt;/code&gt;平台。&lt;/p&gt;&lt;/section&gt;
&lt;section&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;/p&gt;&lt;p&gt;使用root用户登录，运行以下命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget --no-check-certificate https://github.com/kuoruan/shell-scripts/raw/master/kcptun/kcptun.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod +x ./kcptun.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;./kcptun.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#脚本备份地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;https://blog.moewah.com/source/kcptun.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;设置 Kcptun 的服务端端口：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;请输入 Kcptun Server 端口 [1-65535]:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(默认: 29900):&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;请输入一个未被占用的端口，&lt;code&gt;Kcptun&lt;/code&gt;运行时将使用此端口。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;设置加速的 IP：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;请输入需要加速的 IP [0.0.0.0 ~ 255.255.255.255]:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(默认: 127.0.0.1):&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;填入上面获取到的加速 IP。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;设置需要加速的端口：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;请输入需要加速的端口 [1-65535]:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(默认: 12948):&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;填入上面获取到的加速端口。&lt;/p&gt;&lt;p&gt;程序会检查当前是不是有程序占用着此端口，如果你的&lt;code&gt;55&lt;/code&gt;没在运行，或者没有软件使用此端口，会弹出如下提示：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;当前没有软件使用此端口, 确定加速此端口?(y/n)&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;如果你确认&lt;code&gt;55&lt;/code&gt;运行时会使用此端口，那么输入&lt;code&gt;“y”&lt;/code&gt;回车即可。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;设置 Kcptun 密码：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;请输入 Kcptun 密码:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(如果不想使用密码请留空):&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;你可以为&lt;code&gt;Kcptun&lt;/code&gt;单独设置一个密码,与&lt;code&gt;55&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;请选择加密方式(crypt)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;强加密对 CPU 要求较高，&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;如果是在路由器上配置客户端，&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;请尽量选择弱加密或者不加密。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;该参数必须两端一致&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(1) aes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(2) aes-128&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(3) aes-192&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(4) salsa20&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(5) blowfish&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(6) twofish&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(7) cast5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(8) 3des&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(9) tea&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(10) xtea&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(11) xor&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(12) none&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(默认: aes) 请选择 [1~12]: 4&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;选择加速模式：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;请选择加速模式(mode)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;加速模式和发送窗口大小共同决定了流量的损耗大小&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;如果加速模式选择“手动(manual)”，&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;将进入手动档隐藏参数的设置。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(1) normal&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(2) fast&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(3) fast2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(4) fast3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(5) manual&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(默认: fast) 请选择 [1~5]: 2&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;禁用压缩：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;是否禁用数据压缩?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(默认: 不禁用) [y/n]:&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;恭喜! Kcptun 服务端安装成功。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;服务器IP:  33.44.55.66&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;端口:  29900&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;加速地址:  127.0.0.1:12948&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;key:  12345678&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;crypt:  salsa20&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mode:  fast&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mtu:  1350&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sndwnd:  512&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rcvwnd:  512&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;datashard:  10&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;parityshard:  3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;dscp:  0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nocomp:  true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;quiet:  true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;当前安装的 Kcptun 版本为: 20190325&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;可使用的客户端配置文件为:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;localaddr&quot;: &quot;:12948&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;remoteaddr&quot;: &quot;33.44.55.66:29900&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;key&quot;: &quot;12345678&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;crypt&quot;: &quot;salsa20&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;mode&quot;: &quot;fast&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;mtu&quot;: 1350,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;sndwnd&quot;: 512,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;rcvwnd&quot;: 512,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;datashard&quot;: 10,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;parityshard&quot;: 3,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;dscp&quot;: 0,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;nocomp&quot;: true,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;quiet&quot;: true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;手机端参数可以使用：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-autoexpire 60 -key &quot;123456&quot; -crypt &quot;salsa20&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;其他参数请自行计算或设置, 详细信息可以查看: https://github.com/xtaci/kcptun&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Kcptun 安装目录: /usr/share/kcptun&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Kcptun 日志文件目录: /var/log/kcptun/&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;常用命令：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;启动：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;supervisorctl start kcptun&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;停止：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;supervisorctl stop kcptun&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;重启：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;supervisorctl restart kcptun&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;状态：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;supervisorctl status kcptun&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;卸载：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;./kcptun.sh uninstall&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;KCPtun&lt;/code&gt;支持的平台较多，不便于一一讲解，这里就以&lt;code&gt;amd64&lt;/code&gt;架构的&lt;code&gt;Linux&lt;/code&gt;服务器为例，下载已编译的安装包（注意版本对应，对应服务端版本&lt;code&gt;20190325&lt;/code&gt;）&lt;/p&gt;&lt;p&gt;&lt;strong&gt;下载包：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd root&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget --no-check-certificate https://github.com/xtaci/kcptun/releases/download/v20190325/kcptun-linux-amd64-20190325.tar.gz&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;解压包&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tar -zxf kcptun-linux-amd64-20190325.tar.gz&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;解压后你将会得到两个文件，一个是&lt;code&gt;server_linux_amd64&lt;/code&gt;，另外一个是&lt;code&gt;client_linux_amd64&lt;/code&gt;。作为客户端，我们当然应该使用&lt;code&gt;client_linux_amd64&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;执行下面的命令可以获取到帮助文档&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;./client_linux_amd64 -h&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;上个步骤我们已经通过一键脚本完成了服务端的安装操作，相信有很多人已经注意到了在服务端安装结束后自动打印了&lt;code&gt;json&lt;/code&gt;格式的客户端配置信息，如下：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;localaddr&quot;: &quot;:12948&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;remoteaddr&quot;: &quot;33.44.55.66:29900&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;key&quot;: &quot;12345678&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;crypt&quot;: &quot;salsa20&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;mode&quot;: &quot;fast&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;mtu&quot;: 1350,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;sndwnd&quot;: 512,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;rcvwnd&quot;: 512,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;datashard&quot;: 10,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;parityshard&quot;: 3,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;dscp&quot;: 0,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;nocomp&quot;: true,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;quiet&quot;: true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;完整复制上面的配置信息，并保存为 &lt;code&gt;config.json&lt;/code&gt; 文件。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;客户端运行：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在终端执行下面的命令就可以运行kcptun服务&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd /root&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;./client_linux_amd64 -c ./config.json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 我是把json文件存放在与client_linux_amd64相同的路径下，如不同，则需要完整路径。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;后台运行：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;./client_linux_amd64 -c ./config.json 2&amp;gt;&amp;amp;1 &amp;amp;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;Kcptun 项目地址：&lt;a href=&quot;https://github.com/xtaci/kcptun%EF%BC%88%E5%8F%AF%E6%9F%A5%E8%AF%A2%E5%90%84%E5%8F%82%E6%95%B0%E8%AE%BE%E7%BD%AE%EF%BC%89&quot; target=&quot;_blank&quot;&gt;https://github.com/xtaci/kcptun（可查询各参数设置）&lt;/a&gt;
KCP 协议：&lt;a href=&quot;https://github.com/skywind3000/kcp&quot; target=&quot;_blank&quot;&gt;https://github.com/skywind3000/kcp&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;</content:encoded></item><item><title>怎样在路由器上格式化U盘、硬盘？</title><link>https://blog.moewah.com/posts/1512/</link><guid isPermaLink="true">https://blog.moewah.com/posts/1512/</guid><description>想在路由器上安全格式化U盘吗？本文详解梅林、Padavan固件下用fdisk命令4步完成U盘分区，解决ext4格式化问题，避免数据丢失。</description><pubDate>Tue, 04 Dec 2018 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;本教程适用于梅林、padavan、LEDE（openwrt）等固件&lt;/p&gt;&lt;p&gt;以下具体方法都基于 ext4，NTFS 相关错误不做回答&lt;/p&gt;&lt;p&gt;使用ssh连接路由器，把U盘插到路由器上&lt;/p&gt;&lt;p&gt;我们需要在命令行进行以下4步操作：&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;安装fdisk&lt;a href=&quot;#安装fdisk&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;一般梅林、Padavan 固件都会自带的，不用安装，如果没有则按照下面给出的命令&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;opkg update&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;opkg install fdisk&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 输出Configuring fdisk. 并且没有错误&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# fdisk就安装好了&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fdisk -l&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 这里先输出系统分区之类的不用管，外置设备一般在最后&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Disk /dev/sda: 30.7 GB, 30752000000 bytes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;64 heads, 32 sectors/track, 29327 cylinders&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Units = cylinders of 2048 * 512 = 1048576 bytes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Device Boot      Start         End      Blocks  Id System&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/dev/sda1               2       29327    30029824  83 Linux&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;上面的信息注意看到和你的存储大小一样的设备，我的是 &lt;code&gt;/dev/sda&lt;/code&gt;，在它里面有个 &lt;code&gt;/dev/sda1&lt;/code&gt;的分区&lt;/p&gt;&lt;/section&gt;
&lt;section&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;先卸载 U 盘，如果提示 &lt;code&gt;No such file or directory&lt;/code&gt; 没关系，说明本来就没挂载上&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# padavan、梅林可以执行以下这个推出 usb&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ejusb&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 其他固件，或者梅林使用以上命令无效，则可以使用这个命令卸载分区&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;umount /dev/sda1&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;p&gt;然后分区&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fdisk /dev/sda # 这是你的设备別打成分区&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Welcome to fdisk (util-linux 2.29.2).&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Changes will remain in memory only, until you decide to write them.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Be careful before using the write command.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Command (m for help): d&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 输入d回车，我只有一个分区，它自动选择了，如果你有多个分区，可以多次使用d&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Selected partition 1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Partition 1 has been deleted.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Command (m for help): n # 输入n会车，创建分区&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Partition type&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;p   primary (0 primary, 0 extended, 4 free)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;e   extended (container for logical partitions)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Select (default p): p # 选择p&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Partition number (1-4, default 1): # 输入 1 回车&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;First sector (2048-2065023, default 2048): # 回车&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Last sector, +sectors or +size{K,M,G,T,P} (2048-2065023, default 2065023): # 回车&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Created a new partition 1 of type &apos;Linux&apos; and of size 1007.3 MiB.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Command (m for help): w # 输入 w 回车，保存并退出&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;The partition table has been altered.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Calling ioctl() to re-read partition table.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Syncing disks.&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;经过以上的操作，你可以用 &lt;code&gt;fdisk -l&lt;/code&gt; 命令查看U盘上是否只有一个 Linux 分区&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fdisk -l&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 找到你的设备 可以看到ID为83就对了&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Disk /dev/sda: 30.7 GB, 30752000000 bytes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;64 heads, 32 sectors/track, 29327 cylinders&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Units = cylinders of 2048 * 512 = 1048576 bytes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Device Boot      Start         End      Blocks  Id System&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/dev/sda1               2       29327    30029824  83 Linux&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;code&gt;mkfs.ext4&lt;/code&gt; 命令格式化，并且设置卷标为 onmp&lt;/p&gt;&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;，如果下面的命令提示 &lt;code&gt;/dev/sda1 is mounted&lt;/code&gt;，则需要先卸载 U 盘，和分区前卸载的方法一样&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkfs.ext4 -m 0 -L onmp /dev/sda1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 如果你的硬盘比较大，256G以上的话，是下面这个命令：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# mkfs.ext4 -m 0 -L ONMP -T largefile /dev/sda1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mke2fs 1.42.8 (20-Jun-2013)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Filesystem label=onmp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;OS type: Linux&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Block size=4096 (log=2)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Fragment size=4096 (log=2)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Stride=0 blocks, Stripe width=0 blocks&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1880480 inodes, 7507456 blocks&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;0 blocks (0.00%) reserved for the super user&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;First data block=0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Maximum filesystem blocks=0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;230 block groups&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;32768 blocks per group, 32768 fragments per group&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;8176 inodes per group&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Superblock backups stored on blocks:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;4096000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Allocating group tables: done&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Writing inode tables: done&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Creating journal (32768 blocks): done&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Writing superblocks and filesystem accounting information: done&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这样，U盘就被格式化完了，拔插 U 盘可以重新挂载，或者你想用以下命令挂载也行&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir /mnt/onmp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mount -t ext4 /dev/sda1 /mnt/onmp&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded></item><item><title>极简云盘VFM2轻量PHP网盘程序安装指南</title><link>https://blog.moewah.com/posts/533/</link><guid isPermaLink="true">https://blog.moewah.com/posts/533/</guid><description>如何快速部署轻量级私有云盘？本文详解极简云盘VFM2的安装步骤、安全设置与功能配置，帮助用户在无数据库环境下搭建简易文件共享系统，实现私有化部署的高效管理。</description><pubDate>Thu, 29 Nov 2018 00:00:00 GMT</pubDate><content:encoded>&lt;section&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;极简云盘 – 更为简单便捷，程序是纯 PHP 网盘程序，程序包不到 2M，无需数据库支持，能够实现简单的用户注册、分享链接，自定义密码等功能！!&lt;/li&gt;
&lt;li&gt;因为极简，如果有扩展功能或插件的需求的话，VFM2 就不适合使用了，扩展性没 Owncloud 这些大型程序强（几乎无扩展），适合自用~&lt;/li&gt;
&lt;li&gt;该网盘源自 Veno File Manager 2.6.3(VFM2) ，详情可以谷歌搜索~VFM2 v2.6.3汉化优化程序包，本站资源备份地址：&lt;a href=&quot;/attachments/2018/533/533_vfm2_2_6_3_642b95.zip&quot;&gt;vfm2_2.6.3.zip&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;顶点网 Veno File Manager V3.4.5(VFM3)破解版：&lt;a href=&quot;/attachments/2018/533/533_vfm-v3_4_5_579752.zip&quot;&gt;vfm-v3.4.5.zip&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;1.建议安装在apache环境下，并确保.htaccess可用。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;2.解压文件至网站根目录。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;3.【重要】默认用户名：admin 默认密码：password&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;后台管理地址：http://yourdomain/vfm-admin/&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1.基本设置-概览：选中 只允许登录用户查看内容（强烈建议选中，否则所有文件将被直接公开输出）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2.基本设置-概览：配置是否开启伪静态。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3.基本设置-概览：取消 允许直链下载  （若无特殊需求强烈建议取消）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4.基本设置-分享：选择是否开启分享文件密码功能，或文件下载验证码 （合理设置分享链接时效）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;5.基本设置-权限：合理为管理员用户组分配权限&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;6.基本设置-注册：开启注册验证码，用户文件夹点击下拉选择：“创建新用户文件夹”并合理分配空间容量。&lt;/span&gt;&lt;/div&gt;&lt;/div&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;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&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;figure&gt;&lt;img alt=&quot;699c2d0fgy1fdlc2t5tn1j20ns0l6mzd.jpg&quot; loading=&quot;lazy&quot; width=&quot;690&quot; height=&quot;614&quot; src=&quot;/_astro/533_3819758818_ac46ae._xknT7nT_2i0MMV.webp&quot; srcset=&quot;/_astro/533_3819758818_ac46ae._xknT7nT_Z46ejA.webp 640w, /_astro/533_3819758818_ac46ae._xknT7nT_2i0MMV.webp 690w&quot; /&gt;&lt;figcaption&gt;699c2d0fgy1fdlc2t5tn1j20ns0l6mzd.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;699c2d0fgy1fdlc2tl82rj213f0klq5d.jpg&quot; loading=&quot;lazy&quot; width=&quot;690&quot; height=&quot;360&quot; src=&quot;/_astro/533_1071058969_15c197.CTscqJgP_Z1CNjA2.webp&quot; srcset=&quot;/_astro/533_1071058969_15c197.CTscqJgP_Z8lViL.webp 640w, /_astro/533_1071058969_15c197.CTscqJgP_Z1CNjA2.webp 690w&quot; /&gt;&lt;figcaption&gt;699c2d0fgy1fdlc2tl82rj213f0klq5d.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;156483266.jpg&quot; loading=&quot;lazy&quot; width=&quot;690&quot; height=&quot;278&quot; src=&quot;/_astro/533_3447082802_f1e2de.BedXPWSh_1aAiVM.webp&quot; srcset=&quot;/_astro/533_3447082802_f1e2de.BedXPWSh_WXgUI.webp 640w, /_astro/533_3447082802_f1e2de.BedXPWSh_1aAiVM.webp 690w&quot; /&gt;&lt;figcaption&gt;156483266.jpg&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Linux/Windows安装Java最新版教程</title><link>https://blog.moewah.com/posts/561/</link><guid isPermaLink="true">https://blog.moewah.com/posts/561/</guid><description>如何在Linux和Windows系统安装最新版Java？本文详细拆解下载、配置全流程，提供Oracle官网安全链接获取技巧和90%常见错误规避方案，包含Linux环境变量设置、Windows一键安装实战步骤，助你快速搭建稳定Java开发环境。</description><pubDate>Thu, 29 Nov 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;说明：&lt;/strong&gt; 我们很多时候都需要用到&lt;code&gt;JAVA&lt;/code&gt;环境，这里博主就记录下安装过程。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1、获取最新版JAVA下载链接&lt;/strong&gt;
首先进入&lt;code&gt;JAVA&lt;/code&gt;下载地址：&lt;a href=&quot;http://www.oracle.com/technetwork/java/javase/downloads/index.html&quot; target=&quot;_blank&quot;&gt;点击进入&lt;/a&gt;，再点击中间框框右下角的&lt;code&gt;JDK Download&lt;/code&gt;按钮进入下载界面，然后点击&lt;code&gt;Accept License Agreement&lt;/code&gt;，这时候就可以点击一下对应版本的JAVA JDK包，浏览器下载器会弹出来文件下载，这时候就可以复制下载链接了。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&quot;lazy&quot; width=&quot;1896&quot; height=&quot;1174&quot; src=&quot;/_astro/561_1122572043.DXgTrPXP_ZDes25.webp&quot; srcset=&quot;/_astro/561_1122572043.DXgTrPXP_1q0wcI.webp 640w, /_astro/561_1122572043.DXgTrPXP_Z2gENYo.webp 750w, /_astro/561_1122572043.DXgTrPXP_4RDGQ.webp 828w, /_astro/561_1122572043.DXgTrPXP_Z1T5ucW.webp 1080w, /_astro/561_1122572043.DXgTrPXP_Z1fB2jF.webp 1280w, /_astro/561_1122572043.DXgTrPXP_Z15Laym.webp 1668w, /_astro/561_1122572043.DXgTrPXP_ZDes25.webp 1896w&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;⚠️ 注意&lt;/strong&gt; ：别直接将&lt;code&gt;jdk&lt;/code&gt;包的超链接当成下载链接，这样下载会出错的。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;2、Linux安装&lt;/strong&gt;
这里&lt;code&gt;CentOS&lt;/code&gt;、&lt;code&gt;Debian&lt;/code&gt;、&lt;code&gt;Ubuntu&lt;/code&gt;等常见&lt;code&gt;Linux&lt;/code&gt;系统都可以用以下方法安装&lt;code&gt;JAVA&lt;/code&gt;。&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#下载JAVA JRE包，将你获取的链接替换到后面，下载链接通常为http://xx/jdk_linux-x64.tar.gz?AuthParam=xx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget -O jdk.tar.gz http://xx/jdk_linux-x64.tar.gz?AuthParam=xx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&l