giscus 评论组件集成说明
本站是纯静态 Docusaurus 站点,评论能力不能依赖本地服务器或运行时数据库。当前实现使用 giscus,把页面评论存放到独立 GitHub Discussions 仓库 NeverGpDzy/docs-comments,站点只负责在指定页面加载评论组件。
评论组件的设计目标是和音频播放器一样自动挂载:文章作者不需要在每篇 Markdown 或 MDX 文件里手动引入组件。只要页面属于博客详情页、Travel 文档详情页,或被布局层明确允许的自定义页面,布局层会自动渲染评论区。
当前行为
评论只出现在下面这些页面:
| 页面类型 | 中文路径 | 英文路径 | 是否显示评论 |
|---|---|---|---|
| 博客详情页 | /blog/... | /en/blog/... | 是 |
| Travel 文档详情页 | /docs/Travel/... | /en/docs/Travel/... | 是 |
| About 页面 | /about | /en/about | 是 |
| 博客列表页 | /blog | /en/blog | 否 |
| 其他文档页 | 非 /docs/Travel/... 的文档 | 非 /en/docs/Travel/... 的文档 | 否 |
| 其他自定义页面 | 非 /about 的自定义页面 | 非 /en/about 的自定义 页面 | 否 |
中英文对应页面共用同一条 Discussion。实现方式是把英文页面路径开头的 /en 去掉后再作为 giscus 的 term:
/blog/2026/05/02/hamasushi-big-conveyor-belt-sushi-meal
/en/blog/2026/05/02/hamasushi-big-conveyor-belt-sushi-meal
-> /blog/2026/05/02/hamasushi-big-conveyor-belt-sushi-meal
/docs/Travel/hong-kong-travel
/en/docs/Travel/hong-kong-travel
-> /docs/Travel/hong-kong-travel
/about
/en/about
-> /about
这样读者在中文页或英文页看到的是同一个评论区,避免同一篇内容被拆成两套讨论。
GitHub 侧配置
评论数据放在仓库:
NeverGpDzy/docs-comments
这个仓库需要满足以下条件:
- 仓库必须是 public。
Settings -> General -> Features中启用 Discussions。- Discussions 中存在
Announcements分类。 - giscus GitHub App 已安装并授权给
NeverGpDzy/docs-comments。 - 不创建
giscus.json,因此不限制来源域名。
当前前端写死的 giscus 配置如下:
| 配置项 | 值 |
|---|---|
repo | NeverGpDzy/docs-comments |
repoId | R_kgDOSTPzRQ |
category | Announcements |
categoryId | DIC_kwDOSTPzRc4C8Qej |
mapping | specific |
strict | 1 |
reactionsEnabled | 1 |
emitMetadata | 0 |
inputPosition | bottom |
loading | lazy |
repoId 和 categoryId 不是密钥,可以写入前端代码。它们来自 giscus 配置页生成的 script 片段。
代码结构
核心文件:
| 文件 | 作用 |
|---|---|
src/components/GiscusComments/index.js | 评论组件主体,封装 giscus 配置、语言、主题和 term 生成 |
src/components/GiscusComments/styles.module.css | 评论区标题、间距和分隔线样式 |
src/theme/BlogPostPage/index.js | 博客详情页 swizzle 布局,自动挂载评论 |
src/theme/DocItem/Layout/index.js | 文档详情页 swizzle 布局,仅在 Travel 分支挂载评论 |
src/theme/MDXPage/index.js | content-pages 布局,仅在 About 页面挂载评论 |
package.json | 声明 @giscus/react 依赖 |
组件关系:
BlogPostPage
-> BlogAudioPlayer
-> BlogPostItem
-> GiscusComments
-> BlogPostPaginator
DocItem/Layout
-> if isTravelDocMetadata(metadata)
-> DocItemContent
-> GiscusComments
-> DocItemPaginator
-> else
-> normal doc layout without comments
MDXPage
-> MDXContent
-> if getGiscusTerm(metadata.permalink) === '/about'
-> GiscusComments
-> else
-> normal MDX page without comments
评论组件实现
GiscusComments 接收一个可选的 permalink:
<GiscusComments permalink={metadata.permalink} />
博客页和文档页都传入 Docusaurus metadata 中的 permalink,而不是直接依赖浏览器地址。这样 SSR、静态构建和客户端导航时使用的路径来源更稳定。
组件内部会处理四件事。