<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>评论 on 云雾海的博客</title><link>https://blog.yunwuhai.com/tags/%E8%AF%84%E8%AE%BA/</link><description>Recent content in 评论 on 云雾海的博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 29 Oct 2026 09:30:00 +0800</lastBuildDate><atom:link href="https://blog.yunwuhai.com/tags/%E8%AF%84%E8%AE%BA/index.xml" rel="self" type="application/rss+xml"/><item><title>如何在Hugo中添加GitHub评论</title><link>https://blog.yunwuhai.com/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E7%8E%AF%E5%A2%83/%E5%A6%82%E4%BD%95%E5%9C%A8hugo%E4%B8%AD%E6%B7%BB%E5%8A%A0github%E8%AF%84%E8%AE%BA/</link><pubDate>Thu, 29 Oct 2026 09:30:00 +0800</pubDate><guid>https://blog.yunwuhai.com/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E7%8E%AF%E5%A2%83/%E5%A6%82%E4%BD%95%E5%9C%A8hugo%E4%B8%AD%E6%B7%BB%E5%8A%A0github%E8%AF%84%E8%AE%BA/</guid><description>&lt;img src="https://blog.yunwuhai.com/posts/%E5%B7%A5%E5%85%B7%E4%B8%8E%E7%8E%AF%E5%A2%83/%E5%A6%82%E4%BD%95%E5%9C%A8hugo%E4%B8%AD%E6%B7%BB%E5%8A%A0github%E8%AF%84%E8%AE%BA/cover.jpg" alt="Featured image of post 如何在Hugo中添加GitHub评论" /&gt;&lt;h1 id="如何在hugo中添加github评论"&gt;&lt;a href="#%e5%a6%82%e4%bd%95%e5%9c%a8hugo%e4%b8%ad%e6%b7%bb%e5%8a%a0github%e8%af%84%e8%ae%ba" class="header-anchor"&gt;&lt;/a&gt;如何在Hugo中添加GitHub评论&#10;&lt;/h1&gt;&lt;h2 id="前言"&gt;&lt;a href="#%e5%89%8d%e8%a8%80" class="header-anchor"&gt;&lt;/a&gt;前言&#10;&lt;/h2&gt;&lt;p&gt;静态博客是没有后端的，评论功能天然缺失。能选的路线其实就这几条：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;方案&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;评论存在哪&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;后端&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;说明&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;giscus&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;自己仓库的 GitHub Discussions&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;不需要&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;免费、无广告、支持表情反应、明暗主题、懒加载&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;utterances&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;自己仓库的 GitHub Issues&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;不需要&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;老牌方案，界面偏旧，没有 reactions&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Waline / Twikoo&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;自己的数据库&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;需要&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;功能最全，但要一台服务器或者 Serverless + 数据库长期维护&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Disqus&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;第三方平台&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;不需要&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;免费版带广告和追踪，国内加载很慢&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;我最后选了 giscus。核心原因是&lt;strong&gt;评论数据落在自己的仓库里&lt;/strong&gt;——文章和评论都在 GitHub，仓库在、数据就在，不会被某个厂商关停带走；而且访客用 GitHub 账号登录时，天然就过滤掉了绝大多数垃圾评论。&lt;/p&gt;&#10;&lt;p&gt;下面讲的是 giscus 通用的接入思路。代码我会尽量只给和主题无关的部分，遇到跟具体主题绑定的地方会单独标出来——毕竟每个人的主题都不一样，照抄别人的模板反而容易踩坑。&lt;/p&gt;&#10;&lt;h2 id="giscus-是怎么工作的"&gt;&lt;a href="#giscus-%e6%98%af%e6%80%8e%e4%b9%88%e5%b7%a5%e4%bd%9c%e7%9a%84" class="header-anchor"&gt;&lt;/a&gt;giscus 是怎么工作的&#10;&lt;/h2&gt;&lt;p&gt;giscus 本质上是一个托管在 &lt;code&gt;giscus.app&lt;/code&gt; 上的前端页面，我们用 iframe 把它嵌进文章页，它再通过 GitHub API 把评论读写到自己仓库的 Discussions 里。&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR&#10; A[访客的浏览器] --&gt;|加载 client.js| B[iframe: giscus.app]&#10; B --&gt;|GitHub API| C[(博客仓库&lt;br/&gt;Discussions)]&#10; C --&gt;|评论数据| B&#10; B --&gt;|渲染成评论区| A&lt;/pre&gt;&lt;p&gt;文章和 discussion 之间靠 &lt;code&gt;mapping&lt;/code&gt; 参数建立对应关系，giscus 支持按 &lt;code&gt;pathname&lt;/code&gt;、&lt;code&gt;url&lt;/code&gt;、&lt;code&gt;title&lt;/code&gt;、&lt;code&gt;og:title&lt;/code&gt; 等字段匹配。我选的是 &lt;code&gt;pathname&lt;/code&gt;，因为它只跟文章的 URL 路径有关，改标题、改描述都不会让评论失联。&lt;/p&gt;&#10;&lt;h2 id="第一步开启-discussions-并安装-giscus-app"&gt;&lt;a href="#%e7%ac%ac%e4%b8%80%e6%ad%a5%e5%bc%80%e5%90%af-discussions-%e5%b9%b6%e5%ae%89%e8%a3%85-giscus-app" class="header-anchor"&gt;&lt;/a&gt;第一步：开启 Discussions 并安装 giscus App&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;进入博客仓库的 &lt;strong&gt;Settings → General → Features&lt;/strong&gt;，勾上 &lt;strong&gt;Discussions&lt;/strong&gt;。&lt;/li&gt;&#10;&lt;li&gt;浏览器打开 &lt;a class="link" href="https://giscus.app" target="_blank" rel="noopener"&#10; &gt;giscus.app&lt;/a&gt;，在「仓库」一栏填入 &lt;code&gt;用户名/仓库名&lt;/code&gt;，比如 &lt;code&gt;yunwuhai/yunwuhai.github.io&lt;/code&gt;，然后点旁边的 &lt;strong&gt;安装&lt;/strong&gt;，把 giscus 的 GitHub App 授权给这一个仓库（只授予一个仓库就够了，不必给全部仓库）。&lt;/li&gt;&#10;&lt;li&gt;回到 giscus.app，选择 discussion 分类。分类只是给 discussion 打个标签，用哪个都不影响功能。我直接用了仓库里现成的 &lt;code&gt;Announcements&lt;/code&gt;；如果你希望评论区看着更干净，也可以先在仓库的 Discussions 里新建一个 &lt;code&gt;Comments&lt;/code&gt; 分类再回来选它。&lt;/li&gt;&#10;&lt;li&gt;页面往下滚，会看到一个配置生成器，记下这四个值：&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;repo = yunwuhai/yunwuhai.github.io&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;repo-id = R_kgDOP36lHQ&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;category = Announcements&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;category-id = DIC_kwDOP36lHc4DJxCY&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;如果 giscus.app 上填完仓库提示 &lt;strong&gt;&amp;ldquo;giscus is not installed on this repository&amp;rdquo;&lt;/strong&gt;，就是第 2 步的 App 没授权成功，回仓库的 Settings → GitHub Apps 里检查一下。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="第二步先搞清楚要传哪些参数"&gt;&lt;a href="#%e7%ac%ac%e4%ba%8c%e6%ad%a5%e5%85%88%e6%90%9e%e6%b8%85%e6%a5%9a%e8%a6%81%e4%bc%a0%e5%93%aa%e4%ba%9b%e5%8f%82%e6%95%b0" class="header-anchor"&gt;&lt;/a&gt;第二步：先搞清楚要传哪些参数&#10;&lt;/h2&gt;&lt;p&gt;Hugo 本身不认识 giscus，也不存评论。giscus 的接入方式只有一种：&lt;strong&gt;在页面里输出一个 client.js 脚本，用 &lt;code&gt;data-*&lt;/code&gt; 属性把配置交给它&lt;/strong&gt;。所以不管什么主题、走哪种接法，最终要落的都是同一组参数：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;参数&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;说明&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;data-repo&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;仓库全名，&lt;code&gt;owner/repo&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;data-repo-id&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;仓库 ID（&lt;code&gt;R_&lt;/code&gt; 开头），不是仓库名&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;data-category&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;discussion 分类名&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;data-category-id&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;分类 ID（&lt;code&gt;DIC_&lt;/code&gt; 开头）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;data-mapping&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;文章和 discussion 的匹配键：&lt;code&gt;pathname&lt;/code&gt; / &lt;code&gt;url&lt;/code&gt; / &lt;code&gt;title&lt;/code&gt; / &lt;code&gt;og:title&lt;/code&gt; 等&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;data-strict&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;0&lt;/code&gt;（默认）没匹配到就自动新建，&lt;code&gt;1&lt;/code&gt; 只允许已存在的&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;data-reactions-enabled&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;是否允许表情回应，默认 &lt;code&gt;1&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;data-input-position&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;输入框放 &lt;code&gt;top&lt;/code&gt; 还是 &lt;code&gt;bottom&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;data-theme&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;配色：&lt;code&gt;light&lt;/code&gt; / &lt;code&gt;dark&lt;/code&gt; / &lt;code&gt;transparent_dark&lt;/code&gt; 等&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;data-lang&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;界面语言，不写默认英文&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;data-loading&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;lazy&lt;/code&gt; = 滚进视口才加载&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;code&gt;repo-id&lt;/code&gt; 和 &lt;code&gt;category-id&lt;/code&gt; 要用 ID 而不是名字：以后改了仓库名或分类名，ID 依然有效，名字就匹配不上了。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;拿到参数之后，按你的主题分两条路走：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;主题已内置评论支持&lt;/strong&gt;。不少主题的配置里有评论 provider 选项，选 giscus 再把上表的值填进去就行。但&lt;strong&gt;键名每家都不一样&lt;/strong&gt;（有的叫 &lt;code&gt;repository&lt;/code&gt;，有的叫 &lt;code&gt;repo&lt;/code&gt;，有的嵌在 &lt;code&gt;params.comments.giscus&lt;/code&gt; 下面），不要照抄别人的 &lt;code&gt;hugo.toml&lt;/code&gt;，去主题文档查，或者直接在主题目录里搜：&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep -ri giscus themes/&amp;lt;你的主题&amp;gt;/layouts&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;搜到的那几个文件就是它读配置的地方，字段名一看便知。（Windows 上可以用 &lt;code&gt;rg&lt;/code&gt; 或 PowerShell 的 &lt;code&gt;Select-String&lt;/code&gt;。）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;主题没有评论功能&lt;/strong&gt;。连配置都不用加，直接进第三步自己写模板。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;我自己的站点用的是 Stack 主题，内置支持 giscus，配置写在 &lt;code&gt;hugo.toml&lt;/code&gt; 的 &lt;code&gt;[params.comments.giscus]&lt;/code&gt; 下——字段名和上表基本一一对应，但那是 Stack 的名字，换个主题就得重新找。&lt;/p&gt;&#10;&lt;h2 id="第三步把评论区插到文章页模板"&gt;&lt;a href="#%e7%ac%ac%e4%b8%89%e6%ad%a5%e6%8a%8a%e8%af%84%e8%ae%ba%e5%8c%ba%e6%8f%92%e5%88%b0%e6%96%87%e7%ab%a0%e9%a1%b5%e6%a8%a1%e6%9d%bf" class="header-anchor"&gt;&lt;/a&gt;第三步：把评论区插到文章页模板&#10;&lt;/h2&gt;&lt;p&gt;Hugo 的页面骨架分两层：&lt;code&gt;baseof.html&lt;/code&gt; 是所有页面共用的外壳，&lt;code&gt;single.html&lt;/code&gt; 才是文章页。评论区只应该出现在文章页，所以挂载点是&lt;strong&gt;文章模板里正文结束之后&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;h3 id="先找挂载点"&gt;&lt;a href="#%e5%85%88%e6%89%be%e6%8c%82%e8%bd%bd%e7%82%b9" class="header-anchor"&gt;&lt;/a&gt;先找挂载点&#10;&lt;/h3&gt;&lt;p&gt;在主题目录里搜输出正文的地方：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep -rn &lt;span class="s2"&gt;&amp;#34;\.Content&amp;#34;&lt;/span&gt; themes/&amp;lt;你的主题&amp;gt;/layouts&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;找到渲染正文的那行，它下面的位置就是评论区该待的地方。有些主题把文章页拆成一堆 partial（正文在某个 &lt;code&gt;_partials/article/...&lt;/code&gt; 里），那就从 &lt;code&gt;single.html&lt;/code&gt; 顺着调用链找下去，落到文章页最外层那个 partial 的结尾。&lt;/p&gt;&#10;&lt;h3 id="用覆盖机制不动主题源码"&gt;&lt;a href="#%e7%94%a8%e8%a6%86%e7%9b%96%e6%9c%ba%e5%88%b6%e4%b8%8d%e5%8a%a8%e4%b8%bb%e9%a2%98%e6%ba%90%e7%a0%81" class="header-anchor"&gt;&lt;/a&gt;用覆盖机制，不动主题源码&#10;&lt;/h3&gt;&lt;p&gt;Hugo 查模板时&lt;strong&gt;站点目录优先于主题&lt;/strong&gt;：把主题里的文件按相同相对路径复制到站点根目录的 &lt;code&gt;layouts/&lt;/code&gt; 下，改这份副本即可。这样主题升级不会冲掉你的修改，也不用去改 submodule 里的源码。&lt;/p&gt;&#10;&lt;h3 id="主题没有评论功能写一个-partial"&gt;&lt;a href="#%e4%b8%bb%e9%a2%98%e6%b2%a1%e6%9c%89%e8%af%84%e8%ae%ba%e5%8a%9f%e8%83%bd%e5%86%99%e4%b8%80%e4%b8%aa-partial" class="header-anchor"&gt;&lt;/a&gt;主题没有评论功能：写一个 partial&#10;&lt;/h3&gt;&lt;p&gt;新建 &lt;code&gt;layouts/_partials/comments/giscus.html&lt;/code&gt;，里面就是 giscus 官方给的那段脚本（把值换成你自己的）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://giscus.app/client.js&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-repo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;yunwuhai/yunwuhai.github.io&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-repo-id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;R_kgDOP36lHQ&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-category&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Announcements&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-category-id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;DIC_kwDOP36lHc4DJxCY&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-mapping&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pathname&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-strict&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-reactions-enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-input-position&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;top&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;light&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;zh-CN&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;data-loading&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;lazy&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;crossorigin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;anonymous&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;async&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后在文章模板（从主题复制到站点的那份 &lt;code&gt;layouts/_default/single.html&lt;/code&gt;）里，正文后面加一行调用：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ .Content }}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ partial &amp;#34;comments/giscus.html&amp;#34; . }}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;两个容易踩的点：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;别放到 &lt;code&gt;baseof.html&lt;/code&gt;&lt;/strong&gt;。那是所有页面的外壳，列表页、首页、404 都会跟着渲染，一页里冒出好几个 iframe。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;一页只放一次&lt;/strong&gt;。如果主题的评论区已经渲染过一次，就不要再加第二遍——多出来的 iframe 会抢同一个 discussion，还会重复加载脚本。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="主题已经内置什么都不用改"&gt;&lt;a href="#%e4%b8%bb%e9%a2%98%e5%b7%b2%e7%bb%8f%e5%86%85%e7%bd%ae%e4%bb%80%e4%b9%88%e9%83%bd%e4%b8%8d%e7%94%a8%e6%94%b9" class="header-anchor"&gt;&lt;/a&gt;主题已经内置：什么都不用改&#10;&lt;/h3&gt;&lt;p&gt;配置里启用就够了。比如 Stack 是：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;comments&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;enabled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;provider&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;giscus&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;文章模板会自动把评论 partial 调起来，我们只负责填参数。&lt;/p&gt;&#10;&lt;p&gt;我在这一步额外做的事只有一件：覆盖了一版 &lt;code&gt;layouts/_partials/comments/include.html&lt;/code&gt;，在 iframe 外面包了个卡片容器、加了个「评论」小标题。这是纯样式层面的美化，不做也能正常评论。&lt;/p&gt;&#10;&lt;h2 id="第四步中文界面"&gt;&lt;a href="#%e7%ac%ac%e5%9b%9b%e6%ad%a5%e4%b8%ad%e6%96%87%e7%95%8c%e9%9d%a2" class="header-anchor"&gt;&lt;/a&gt;第四步：中文界面&#10;&lt;/h2&gt;&lt;p&gt;分两件事，别混在一起。&lt;/p&gt;&#10;&lt;p&gt;giscus &lt;strong&gt;自己的界面&lt;/strong&gt;（&amp;ldquo;登录后可发表评论&amp;quot;这些话）由 &lt;code&gt;data-lang=&amp;quot;zh-CN&amp;quot;&lt;/code&gt; 控制，跟 Hugo 的 i18n 完全无关，填了就是中文。&lt;/p&gt;&#10;&lt;p&gt;容易出问题的是&lt;strong&gt;你在模板里自己写的文案&lt;/strong&gt;。Hugo 的 i18n 是精确匹配语言键的：站点 &lt;code&gt;defaultContentLanguage = 'zh-cn'&lt;/code&gt;，而主题只提供了 &lt;code&gt;i18n/zh.toml&lt;/code&gt;，那么 &lt;code&gt;{{ T &amp;quot;commentsTitle&amp;quot; }}&lt;/code&gt; 就拿到空字符串——标题位置一片空白。解决方式是把主题的语言文件按你的语言键复制一份、补上缺的词条：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# i18n/zh-cn.toml&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;commentsTitle&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;评论&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;（标题直接写死中文也行，只是以后要加英文站时还得再改一遍。）&lt;/p&gt;&#10;&lt;h2 id="第五步让评论跟随明暗模式"&gt;&lt;a href="#%e7%ac%ac%e4%ba%94%e6%ad%a5%e8%ae%a9%e8%af%84%e8%ae%ba%e8%b7%9f%e9%9a%8f%e6%98%8e%e6%9a%97%e6%a8%a1%e5%bc%8f" class="header-anchor"&gt;&lt;/a&gt;第五步：让评论跟随明暗模式&#10;&lt;/h2&gt;&lt;p&gt;这是整件事里唯一需要写逻辑的地方。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;data-theme&lt;/code&gt; &lt;strong&gt;只在初始化时读一次&lt;/strong&gt;，之后主题再怎么切，iframe 里的颜色都不会自己变。要换只能跟它通信，而且跨域 iframe 只能走 &lt;code&gt;postMessage&lt;/code&gt;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;iframe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contentWindow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;postMessage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;giscus&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;setConfig&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;dark&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://giscus.app&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;giscus 那边监听了这条消息，收到就切。所以要做的事就两条：&lt;strong&gt;iframe 出来以后先按当前状态对齐一次&lt;/strong&gt;，以及&lt;strong&gt;之后每次站点切明暗再发一次&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;真正的麻烦不在发消息，而在「怎么知道现在是明暗、什么时候变了」——每个主题的切法都不一样：有的给 &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; 加 &lt;code&gt;class=&amp;quot;dark&amp;quot;&lt;/code&gt;，有的改 &lt;code&gt;data-theme&lt;/code&gt; / &lt;code&gt;data-scheme&lt;/code&gt;，有的只换 CSS 变量。通用的做法是盯 &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; 元素的属性变化，再配一个读背景色的兜底：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;light&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;light&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;dark&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;transparent_dark&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 两套配色，按喜好换&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;isDark&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentElement&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scheme&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;data-color-scheme&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dark&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;light&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dark&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dark&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;getComputedStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/\d+/g&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 兜底：看背景亮度&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="mf"&gt;0.299&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.587&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.114&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;128&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;applied&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;force&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;iframe.giscus-frame&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;frame&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contentWindow&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;isDark&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;dark&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;light&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;force&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;applied&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contentWindow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;postMessage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;giscus&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;setConfig&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://giscus.app&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;applied&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 1) iframe 是异步加载的，等它出现&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;timer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="nx"&gt;clearInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 2) 站点切换明暗时（主题基本都会动这几个属性之一）&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;MutationObserver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nx"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentElement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;attributes&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;attributeFilter&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;class&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;style&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;data-theme&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;data-scheme&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;data-color-scheme&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;})();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;三段逻辑对应三个坑：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;setInterval&lt;/code&gt; 等 iframe：脚本执行时 giscus 可能还没加载出来，&lt;code&gt;querySelector&lt;/code&gt; 会拿到 &lt;code&gt;null&lt;/code&gt;。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;MutationObserver&lt;/code&gt; 盯 &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; 属性：这就是&amp;quot;任何主题都能用&amp;quot;的部分，不用知道它具体叫什么方案。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;applied&lt;/code&gt; 去重：同一次切换别重复发消息。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这段脚本放在渲染评论区的那份 partial 里（iframe 后面就行），有评论区的页面每次都会带上它。&lt;/p&gt;&#10;&lt;p&gt;如果发现某些主题在重渲染后颜色又弹回亮色，可以再补一个 &lt;code&gt;window&lt;/code&gt; 的 &lt;code&gt;message&lt;/code&gt; 监听，在 &lt;code&gt;e.origin === &amp;quot;https://giscus.app&amp;quot;&lt;/code&gt; 时重发一次——注意加节流，别和 giscus 自己的消息形成循环。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;关于暗色配色&lt;/strong&gt;：giscus 预置的 &lt;code&gt;dark&lt;/code&gt; 是深灰底，放进深色卡片里经常糊成一块不协调的方块。&lt;code&gt;transparent_dark&lt;/code&gt; 背景透明，跟卡片底色融为一体，也是我最后选的。&lt;/p&gt;&#10;&lt;h2 id="第六步样式微调可选"&gt;&lt;a href="#%e7%ac%ac%e5%85%ad%e6%ad%a5%e6%a0%b7%e5%bc%8f%e5%be%ae%e8%b0%83%e5%8f%af%e9%80%89" class="header-anchor"&gt;&lt;/a&gt;第六步：样式微调（可选）&#10;&lt;/h2&gt;&lt;p&gt;每个主题的 DOM 和 CSS 变量差别太大，写不出通用的样式表，但思路是固定的三条：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;给自己留个钩子&lt;/strong&gt;：在 partial 里给 iframe 外面套一层自己的容器（&lt;code&gt;&amp;lt;section class=&amp;quot;comments&amp;quot;&amp;gt;&lt;/code&gt;），这样你至少有稳定的选择器可用。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;复用主题的卡片变量&lt;/strong&gt;：背景、圆角、内边距、阴影直接用主题已有的 CSS 变量，评论区就会自然长成和文章卡片一样的样子；主题没有这些变量就写死颜色。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;移动端单独收内边距&lt;/strong&gt;。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-scss" data-lang="scss"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nc"&gt;.comments&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;margin-top&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="kt"&gt;rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;card-padding&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="kt"&gt;rem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;border-radius&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;card-border-radius&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;card-background&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;box-shadow&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;shadow-l1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt; &lt;span class="nf"&gt;rgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="kt"&gt;%&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;overflow&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="ni"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;max-width&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;767&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nc"&gt;.comments&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="mf"&gt;.25&lt;/span&gt;&lt;span class="kt"&gt;rem&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="kt"&gt;rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;变量名对不上就换成主题自己的，实在没有就写死颜色——目的只有一个：让评论区看起来属于这张页面，而不是贴上去的第三方外挂。&lt;/p&gt;&#10;&lt;h2 id="常见问题排查"&gt;&lt;a href="#%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98%e6%8e%92%e6%9f%a5" class="header-anchor"&gt;&lt;/a&gt;常见问题排查&#10;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;评论区一片空白&lt;/strong&gt;&#10;先看浏览器 Network 里 &lt;code&gt;client.js&lt;/code&gt; 是不是 403。giscus 控制台报 &lt;code&gt;giscus is not installed on this repository&lt;/code&gt;，说明 App 没授权到当前仓库；如果 Discussions 没开启，giscus 会直接报没有权限。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;只有一条灰色骨架，刷新几次都一样&lt;/strong&gt;&#10;这是 &lt;code&gt;data-loading=&amp;quot;lazy&amp;quot;&lt;/code&gt; 的正常行为——评论区要滚进视口才开始加载 iframe，加载完还要再等一两秒。截图的时候尤其容易误判成&amp;quot;渲染坏了&amp;rdquo;。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;评论和文章对不上&lt;/strong&gt;&#10;&lt;code&gt;mapping&lt;/code&gt; 一旦改了，旧评论就全部失联（它们还挂在上一种映射的 key 上）。我用的是 &lt;code&gt;pathname&lt;/code&gt;，所以文章 URL 尽量别动；真要改 URL，Hugo 的 &lt;code&gt;aliases&lt;/code&gt; 只能把访问者重定向到新地址，&lt;strong&gt;救不了&lt;/strong&gt;已经按旧路径建立的 discussion。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;怎么删评论、锁帖、置顶&lt;/strong&gt;&#10;全都去仓库的 &lt;strong&gt;Discussions&lt;/strong&gt; 页面操作，和普通的 GitHub 讨论一样。作者本人发评论会带上 &lt;code&gt;Author&lt;/code&gt; 徽章。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;想临时关掉评论&lt;/strong&gt;&#10;把启用开关改回 &lt;code&gt;false&lt;/code&gt; 重新构建即可（Stack 是 &lt;code&gt;[params.comments] enabled = false&lt;/code&gt;），模板不用动。&lt;/p&gt;&#10;&lt;h2 id="总结"&gt;&lt;a href="#%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;总结&#10;&lt;/h2&gt;&lt;p&gt;giscus 大概是静态博客接评论性价比最高的方案：不用服务器、不用数据库、不用备案，评论数据留在自己的仓库里，访客用 GitHub 账号登录就能发言。要做的事归起来只有四件：装 App、开 Discussions、把参数交给页面、让文章模板输出那一个 iframe。&lt;/p&gt;&#10;&lt;p&gt;本文尽量只写和主题无关的部分：参数表是 giscus 自己的，找挂载点、覆盖模板的方法属于 Hugo 本身，明暗同步那段用的是通用的属性监听——换成 Blowfish、FixIt、PaperMod 或你自己手写的主题，思路一样能用，只是配置键名和文件路径要自己找一下。&lt;/p&gt;&#10;&lt;p&gt;本站文章底部的评论区就是这套配置（Stack 主题 + 内置 giscus + 一段明暗同步脚本），暗色模式下也是自动跟随的。如果只是想先跑起来，第二步和第三步就够用了；第四到第六步是把它做得&amp;quot;不像一个外挂&amp;quot;，可以按需加。&lt;/p&gt;&#10;</description></item></channel></rss>