Published on

第二天 为博客增加评论功能

Authors

增加基本用户评论功能

在你的 Next.js 静态博客基础上增加用户注册和评论功能,需要从静态站点向动态功能转变。由于静态托管(如 Vercel 的免费套餐)无法直接运行后端服务器和数据库,你需要采用一种无服务器(Serverless)或第三方服务的方式来实现。下面尝试采用第三方服务方案,方便与Next.js 静态博客集成:

实现步骤:Giscus评论系统(推荐,最简单)

具体参考Giscus官方指南:https://giscus.app/zh-CN。 这是最简单、最快捷的方式,完全避免了后端开发和数据库管理的复杂性。

第三方评论系统比较:

  • Giscus: 你的 next.config.js 中已经提到了 giscus。这是一个基于 GitHub Discussions 的评论系统,它利用 GitHub 的 API,让用户通过 GitHub 账号登录并发表评论。评论数据直接存储在你的 GitHub 仓库中,无需数据库。

    如何启用: 在 siteMetadata.js 文件中,你只需要配置 giscusConfig 即可。你需要去 giscus.app 按照步骤生成配置,然后填入 repo、repositoryId 等字段。

  • Disqus: 另一个老牌的评论服务,功能丰富,集成简单。

  • utterances: 类似 Giscus,也是基于 GitHub Issues 的评论系统,配置简单。

用户注册:

  • 对于简单的博客,用户注册可能并不是必须的。如果你的评论系统(如 Giscus)要求用户使用 GitHub 账号登录,那么它已经为你解决了用户身份验证的问题。

  • 如果你确实需要一个独立的注册系统,可以考虑使用 Firebase Authentication 或 Supabase Auth。它们提供免费套餐,可以轻松集成到 Next.js 应用中,管理用户的注册、登录和会话。

无服务器函数方案(需要一些后端知识):(后续再说)

  • Next.js 本身就支持无服务器函数(Serverless Functions),这使得你可以在一个项目中同时拥有前端和后端功能,而无需一个独立的服务器

  • Next.js API 路由: 在 app/api 或 pages/api 目录下,你可以创建 API 路由。这些文件中的代码只在请求时执行,就像一个后端函数。

  • 你可以创建 /pages/api/register.js 和 /pages/api/comments.js 这样的文件来处理注册和评论逻辑。

数据库选择:

需要一个无服务器或托管的数据库来存储用户和评论数据。

  • Supabase: 提供免费的 PostgreSQL 数据库和认证服务,与 Next.js 集成非常方便。它被认为是 Firebase 的开源替代品。

  • MongoDB Atlas: MongoDB 提供的云服务,也有免费套餐,可以作为 NoSQL 数据库使用。

  • PlanetScale: 一个无服务器的 MySQL 数据库,特别适合需要横向扩展的场景。

匿名评论功能

需要评论系统支持“访客评论”或“匿名用户”功能。

方案一:使用支持匿名评论的第三方服务

这是最简单、最快捷的方式,无需你进行任何后端开发。

utterances 或 Giscus (有限支持): utterances 和 Giscus 主要基于 GitHub Issues/Discussions,它们的核心是依赖用户的 GitHub 账号,都完全免费且评论数据直接存储在你的 Git 仓库中。但是,严格意义上来说,它们不支持完全匿名评论。

其他无服务器服务:

  • 像 Commento 或 Staticman 这类服务也支持匿名评论。

  • Staticman: 免费、开源,它通过 GitHub API 将评论数据提交到你的仓库。你需要一些配置,但可以实现访客评论。

方案二:自己实现匿名评论 (需要一些后端知识)

如果你不想依赖任何第三方服务,并且希望拥有完全的控制权,可以自己使用 Next.js API 和数据库来实现。

如何实现:

  • 创建评论 API: 在你的 pages/api/ 或 app/api/ 目录下创建一个 API 路由,例如 comment.js。
  • 存储评论数据: 使用一个数据库来存储评论。对于匿名评论,你只需存储评论内容、评论者姓名(可选)、邮箱(可选,不需验证)、文章 ID 和创建时间。
  • 前端表单: 在文章详情页创建一个评论表单,包含评论者姓名、评论内容等字段。
  • 提交评论: 当用户点击提交时,前端代码会向你的 comment.js API 发送一个 POST 请求,API 函数将数据存储到数据库中。
  • 展示评论: 在文章详情页加载时,你的页面会从 API 路由或直接从数据库中获取所有评论,并展示出来。

如何处理匿名:

  • 在评论表单中,你可以将“姓名”和“邮箱”字段设置为可选。

  • 在 API 函数中,如果用户没有提供姓名,你可以为其分配一个默认的昵称,例如“匿名用户”。

匿名评论