Docusaurus 添加评论功能

未经作者允许请勿转载
更好的阅读体验查看我的博客原文

获取 Giscus 配置参数

首先根据 Giscus官网 的步骤配置安装并获取配置后的参数。

选择 giscus 连接到的仓库。请确保:

  1. 此仓库是公开的,否则访客将无法查看 discussion。
  2. giscus app 已安装否则访客将无法评论和回应。
  3. Discussions功能已在你的仓库中启用。

Docusaurus 中安装 Giscus

yarn add @giscus/react

然后我们封装一个评论组件方便使用

import React from 'react';
import Giscus from '@giscus/react';

export const Comment = () => {
  return (
    <div style={{ paddingTop: 50 }}>
      <Giscus
        id="comments"
        // highlight-warn-start
        // 这部分填写你自己的
        repo="3Alan/site"
        repoId=""
        category="Announcements"
        categoryId=""
        // highlight-warn-end
        mapping="title"
        strict="1"
        term="Welcome to @giscus/react component!"
        reactionsEnabled="1"
        emitMetadata="0"
        inputPosition="bottom"
        theme="dark_dimmed"
        lang="zh-CN"
        loading="lazy"
      />
    </div>
  );
};

export default Comment;

Swizzling Docusaurus 内部组件

Swizzling 文档页面对应组件

yarn run swizzle @docusaurus/theme-classic DocItem/Layout -- --eject --typescript

:::caution

因为我的项目是基于 typescript 的,如果你的项目是 javascript 的话,则不需要加后面的 --typescript

:::

Swizzling 后会生成 src/theme/DocItem/Layout 目录,我们需要对 src/theme/DocItem/Layout/index.tsx 进行修改

import React from 'react';
import clsx from 'clsx';
import { useWindowSize } from '@docusaurus/theme-common';
  // @ts-ignore
import { useDoc } from '@docusaurus/theme-common/internal';
import DocItemPaginator from '@theme/DocItem/Paginator';
import DocVersionBanner from '@theme/DocVersionBanner';
import DocVersionBadge from '@theme/DocVersionBadge';
import DocItemFooter from '@theme/DocItem/Footer';
import DocItemTOCMobile from '@theme/DocItem/TOC/Mobile';
import DocItemTOCDesktop from '@theme/DocItem/TOC/Desktop';
import DocItemContent from '@theme/DocItem/Content';
import DocBreadcrumbs from '@theme/DocBreadcrumbs';
import type { Props } from '@theme/DocItem/Layout';

import styles from './styles.module.css';
// highlight-add-line
import Comment from '../../../components/comment';

/**
 * Decide if the toc should be rendered, on mobile or desktop viewports
 */
function useDocTOC() {
  const { frontMatter, toc } = useDoc();
  const windowSize = useWindowSize();

  const hidden = frontMatter.hide_table_of_contents;
  const canRender = !hidden && toc.length > 0;

  const mobile = canRender ? <DocItemTOCMobile /> : undefined;

  const desktop =
    canRender && (windowSize === 'desktop' || windowSize === 'ssr') ? (
      <DocItemTOCDesktop />
    ) : undefined;

  return {
    hidden,
    mobile,
    desktop
  };
}

export default function DocItemLayout({ children }: Props): JSX.Element {
  const docTOC = useDocTOC();
  return (
    <div className="row">
      <div className={clsx('col', !docTOC.hidden && styles.docItemCol)}>
        <DocVersionBanner />
        <div className={styles.docItemContainer}>
          <article>
            <DocBreadcrumbs />
            <DocVersionBadge />
            {docTOC.mobile}
            <DocItemContent>{children}</DocItemContent>
            <DocItemFooter />
          </article>
          <DocItemPaginator />
        </div>

        // highlight-add-line
        <Comment />
      </div>
      {docTOC.desktop && <div className="col col--3">{docTOC.desktop}</div>}
    </div>
  );
}

Swizzling 博客页面对应组件

yarn run swizzle @docusaurus/theme-classic BlogPostPage -- --eject --typescript 

同样修改文件

import React, { type ReactNode } from 'react';
import clsx from 'clsx';
import {
  HtmlClassNameProvider,
  ThemeClassNames
} from '@docusaurus/theme-common';

import {
  BlogPostProvider,
  useBlogPost
  // @ts-ignore
} from '@docusaurus/theme-common/internal';
import BlogLayout from '@theme/BlogLayout';
import BlogPostItem from '@theme/BlogPostItem';
import BlogPostPaginator from '@theme/BlogPostPaginator';
import BlogPostPageMetadata from '@theme/BlogPostPage/Metadata';
import TOC from '@theme/TOC';
import type { Props } from '@theme/BlogPostPage';
import type { BlogSidebar } from '@docusaurus/plugin-content-blog';
// highlight-add-line
import Comment from '../../components/comment';

function BlogPostPageContent({
  sidebar,
  children
}: {
  sidebar: BlogSidebar;
  children: ReactNode;
}): JSX.Element {
  const { metadata, toc } = useBlogPost();
  const { nextItem, prevItem, frontMatter } = metadata;
  const {
    hide_table_of_contents: hideTableOfContents,
    toc_min_heading_level: tocMinHeadingLevel,
    toc_max_heading_level: tocMaxHeadingLevel
  } = frontMatter;
  return (
    <BlogLayout
      sidebar={sidebar}
      toc={
        !hideTableOfContents && toc.length > 0 ? (
          <TOC
            toc={toc}
            minHeadingLevel={tocMinHeadingLevel}
            maxHeadingLevel={tocMaxHeadingLevel}
          />
        ) : undefined
      }
    >
      <BlogPostItem>{children}</BlogPostItem>

      {(nextItem || prevItem) && (
        <BlogPostPaginator nextItem={nextItem} prevItem={prevItem} />
      )}

      // highlight-add-line
      <Comment />
    </BlogLayout>
  );
}

export default function BlogPostPage(props: Props): JSX.Element {
  const BlogPostContent = props.content;
  return (
    <BlogPostProvider content={props.content} isBlogPostPage>
      <HtmlClassNameProvider
        className={clsx(
          ThemeClassNames.wrapper.blogPages,
          ThemeClassNames.page.blogPostPage
        )}
      >
        <BlogPostPageMetadata />
        <BlogPostPageContent sidebar={props.sidebar}>
          <BlogPostContent />
        </BlogPostPageContent>
      </HtmlClassNameProvider>
    </BlogPostProvider>
  );
}

:::caution

Swizzling 后需要重新运行 Docusaurus ,不然是无法看到效果的

:::

大功告成

完成以上步骤后你就可以在每篇博客和每篇文档的底部看到评论功能了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在本地安装Docusaurus的搜索功能,您需要执行以下步骤: 1. 安装Node.js和npm。如果您尚未安装,请先从官方网站下载并安装Node.js。 2. 在终端或命令行中进入您的Docusaurus项目的根目录。 3. 运行以下命令来安装@docusaurus/plugin-search-local插件: ``` npm install @docusaurus/plugin-search-local ``` 4. 修改docusaurus.config.js文件,将插件添加到plugins数组中: ``` module.exports = { // ...其他配置... plugins: [ // ...其他插件... [ '@docusaurus/plugin-search-local', { // ...插件配置... } ] ] } ``` 5. 在插件配置中指定要搜索的文件或目录。例如,以下配置指定了要搜索的所有Markdown文件: ``` module.exports = { // ...其他配置... plugins: [ // ...其他插件... [ '@docusaurus/plugin-search-local', { hashed: true, indexBlog: true, indexDocs: true, docsRouteBasePath: '/docs', blogRouteBasePath: '/blog', docsDir: 'docs', blogDir: 'blog' } ] ] } ``` 在这个例子中,插件会搜索docs和blog目录中的所有Markdown文件,并将它们添加到搜索索引中。注意,hashed选项设置为true会在文件名中包含文件内容的哈希值,以便在文件内容发生更改后强制刷新搜索索引。 6. 运行以下命令来生成搜索索引: ``` npm run build ``` 这将在项目的build目录中生成一个搜索索引文件。 7. 启动本地服务器并验证搜索功能是否正常工作: ``` npm run start ``` 然后在浏览器中打开http://localhost:3000并进行搜索。如果一切正常,您应该能够找到包含搜索关键字的页面和文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值