如何添加评论区
获取 Giscus 配置参数
首先根据 Giscus 官网 的步骤配置安装并获取配置后的参数。下载Giscus链接:GitHub Apps - giscus
选择 giscus 连接到的仓库。请确保:
- 此仓库是公开的,否则访客将无法查看 discussion。
- giscus app 已安装否则访客将无法评论和回应。
- Discussions 功能已在你的仓库中启用。
安装所需要的包
首先,如果你不能使用yarn命令行,请先安装
npm install --global yarn
检查
yarn --version
安装包
yarn add @giscus/react mitt
封装评论组件
配置生命周期函数
由于 Docusaurus bug 导致 Giscus 有时获取的仍然是上一篇文章的评论,为解决这一问题我们创建一个 clientModule,在src文件夹新建一个clientModules文件,然后在该文件夹新建routeModules.ts文件
src/clientModules/routeModules.ts
import mitt from 'mitt';
import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment';
const emitter = mitt();
if (ExecutionEnvironment.canUseDOM) {
window.emitter = emitter;
}
export function onRouteDidUpdate() {
if (ExecutionEnvironment.canUseDOM) {
setTimeout(() => {
window.emitter.emit('onRouteDidUpdate');
});
}
// https://github.com/facebook/docusaurus/issues/8278
}
创建一个组件
src/components/comment/index.tsx(同样是新建出来的)
import React, { forwardRef, useEffect, useState } from 'react';
import BrowserOnly from '@docusaurus/BrowserOnly';
import Giscus, { GiscusProps } from '@giscus/react';
import {
useThemeConfig,
useColorMode,
ThemeConfig
} from '@docusaurus/theme-common';
interface CustomThemeConfig extends ThemeConfig {
giscus: GiscusProps & { darkTheme: string };
}
export const Comment = forwardRef<HTMLDivElement>((_props, ref) => {
const { giscus } = useThemeConfig() as CustomThemeConfig;
const { colorMode } = useColorMode();
const { theme = 'light', darkTheme = 'dark_dimmed' } = giscus;
const giscusTheme = colorMode === 'dark' ? darkTheme : theme;
const [routeDidUpdate, setRouteDidUpdate] = useState(false);
useEffect(() => {
function eventHandler(e) {
setRouteDidUpdate(true);
}
window.emitter.on('onRouteDidUpdate', eventHandler);
return () => {
window.emitter.off('onRouteDidUpdate', eventHandler);
};
}, []);
if (!routeDidUpdate) {
return null;
}
return (
<BrowserOnly fallback={<div>Loading Comments...</div>}>
{() => (
<div ref={ref} id="comment" style={{ paddingTop: 50 }}>
<Giscus
id="comments"
mapping="title"
strict="1"
reactionsEnabled="1"
emitMetadata="0"
inputPosition="bottom"
lang="zh-CN"
loading="lazy"
{...giscus}
theme={giscusTheme}
/>
</div>
)}
</BrowserOnly>
);
});
export default Comment;
Swizzling Docusaurus 内部组件
Docusaurus 页面分为文档和博客,自己根据需求 Swizzling 对应的页面组件。