Docusaurus 的一些常见问题
本段为在使用Docusaurus时可能会出现的一些问题,由deepseek回答。
为 Docusaurus 的帖子(包括博客和文档)增加创建时间与最后修改时间,有完全不同的实现方式。下面我为你拆解这两种场景的具体做法。
如何将博客设置为主页
在 Docusaurus 中,将博客页设为网站主页需要通过修改路由配置来实现。这本质上是改变了博客插件和页面插件默认的访问路径。主要有两种方法,你可以根据需求选择。
方法一:直接让博客"占用"根路径(推荐)
这个方法的思路是,将博客插件的路由基础路径(routeBasePath)设置为根路径 /,这样当用户访问网站首页时,就会直接看到博客列表。这也是文档中所提到的 "仅博客模式" 的实现方式。
操作步骤如下:
- 修改配置文件:打开项目根目录下的
docusaurus.config.js文件。 - 调整博客插件路径:在
presets中找到@docusaurus/preset-classic的blog配置项,将routeBasePath设置为'/'。 - (可选)处理原有首页:为了让改动更彻底,你可以直接删除或重命名默认的首页文件
src/pages/index.js(或index.tsx)。如果不删除,访问根路径时可能会因为路由冲突而出现意想不到的问题。
配置代码示例如下:
export default {
presets: [
[
'@docusaurus/preset-classic',
{
// ... 其他配置
blog: {
routeBasePath: '/', // 关键配置:将博客的访问路径设置为网站根目录
// ... 其他博客配置
},
},
],
],
};
完成配置并重启开发服务器后,访问 http://localhost:3000/ 就会直接显示你的博客文章列表了。
方法二:使用客户端重定向
如果你不想改变博客原有的 /blog 路径,而是希望在用户访问首页时,自动跳转到博客页。这可以通过一个简单的重定向组件实现。
操作步骤如下:
- 创建重定向组件:在
src/pages/index.js(或index.tsx)文件中,编写一个执行重定向的 React 组件。 - 指定目标路径:使用
@docusaurus/router提供的<Redirect>组件,将流量指向/blog。
代码示例如下:
import React from 'react';
import { Redirect } from '@docusaurus/router';
export default function Home() {
return <Redirect to="/blog" />;
}
这种方法实现简单,但请注意它是一个客户端重定向,可能会对首次加载速度和 SEO 有一点影响。
💎 总结与建议
| 特性 | 方法一:修改博客根路径 | 方法二:客户端重定向 |
|---|---|---|
| 最终效果 | 根路径/ 直接显示博客内容 | 访问根路径/ 会跳转到 /blog |
| 复杂度 | 较低,仅修改配置 | 较低,创建单文件组件 |
| SEO 影响 | 博客内容直接作为首页,URL简洁 | 存在一次客户端跳转,URL是/blog |
| 推荐场景 | 更推荐。希望博客成为网站真正意义上的首页。 | 希望保留/blog 路径作为博客入口,但用户访问主页时引导至博客。 |
选择方法一能够更彻底地将博客内容作为网站的核心入口,实现你想要的效果。
_category_.json有什么作用?该如何配置
_category_.json 是 Docusaurus 自动生成侧边栏时的“指挥中心”,它让你不用手动编辑 sidebars.js,就能直接通过文件夹来精细控制文档的分类展示。简单说,把哪个文件夹变成什么分类、放在哪里、怎么显示,都由这个文件说了算。
📁 核心作用:定义与控制分类
_category_.json 必须放在需要管理的文件夹根目录下,它的核心作用是定义该文件夹在侧边栏中作为一个分类(Category)的展示方式。
你可以通过它来控制:
- 分类名称 (
label):在侧边栏里显示给用户看的名字,比如"入门指南"。 - 分类排序 (
position):决定这个文件夹(分类)在它所属的“上一级侧边栏切片”(即同级菜单中)的排列顺序,数字越小越靠前。 - 展开行为 (
collapsible/collapsed):控制侧边栏里的这个分类是否可折叠,以及默认是展开还是折叠状态。 - 生成索引页 (
link):这是很实用的功能。它可以为这个分类自动生成一个“索引页”,用来展示该分类下的所有文档摘要,让你的文档结构像一本书的目录一样清晰。
⚙️ 配置示例解读
一个最基础的 _category_.json 文件内容通常是这样:
{
"label": "入门指南", // 侧边栏显示的名称
"position": 1, // 在上级侧边栏中的排序,数字越小越靠前
"link": {
"type": "generated-index", // 为此分类自动生成一个索引页面
"title": "入门指南", // 索引页面的标题
"description": "从这里开始你的Docusaurus之旅" // 索引页面的描述
}
}
💎 最佳实践与注意事项
- 适用场景:最适合与你
sidebars.js中的{ type: 'autogenerated', dirName: '...' }配置配合使用。 - 不宜混用:不要试图在
_category_.json里通过items字段来手动指定该分类下包含哪些文档。这个操作不被支持,强行添加会导致构建错误。自动生成侧边栏会根据文件夹内的实际文件自动生成列表。 - 索引页的作用:当配置了
link指向一个索引页(如generated-index)后,侧边栏中该分类的标签(label)会变为可点击的链接,方便用户快速查看该分类的概览。
在blog中能否增加coming soon的帖子?
可以的,Docusaurus 原生就支持为博客文章添加类似“Coming Soon”的草稿状态。
这个功能的核心是通过在文章的前置信息(Front Matter)中添加一个简单的字段来实现的。具体有两种方式,你可以根据你的发布计划来选择。
使用 draft: true 制作草稿(推荐)
这是最直接的方法。当你在博客文章里设置 draft: true 时,这篇文章会变成一个只有你自己能看到的“草稿”。
- 它的行为是:
- 本地开发时 (
docusaurus start):这篇文章会正常显示在博客列表里,你可以随时预览和编辑它。 - 生产构建时 (
docusaurus build):这篇文章不会被包含在最终的静态网站里,也不会出现在侧边栏、搜索索引和站点地图中,确保不会对外发布。 - 这个功能在 Docusaurus v1 中就已经存在,并在 v2 及之后版本中得到延续和支持。
- 本地开发时 (
配置示例:在你的博客文章文件顶部,添加 draft: true 即可。
---
title: 即将推出的重磅功能
authors: [your_author_id]
draft: true # 关键配置,标记为草稿
---
这篇内容正在准备中,只有你能在本地看到它。
使用 unlisted: true 实现“未公开”效果
如果你希望文章在最终发布时,能通过直接链接分享给特定的人(比如给团队成员或早期用户预览),但又不想让它出现在博客列表、标签归档或搜索结果中,那么 unlisted: true 是更合适的选择。
它的行为是:
- 生产构建中:文章页面会被生成,但不会列在博客首页、侧边栏或RSS订阅中,搜索引擎也不会索引到它。
- 访问方式:只有知道这篇文章确切URL的人才能访问。
配置示例:
---
title: 即将推出的重磅功能
authors: [your_author_id]
unlisted: true # 不公开列出,但可通过链接访问
---
你可以把这个链接分享给团队做内部预览。
📝 总结:如何选择
简单来说,这两个字段的区别在于:
| 字段 | 是否对外可见 | 是否出现在列表 | 最佳场景 |
|---|---|---|---|
draft: true | 完全不可见 | 仅在本地开发环境可见 | 自己还在写作中的“Coming Soon”内容 |
unlisted: true | 通过直接链接可见 | 生产环境不可见 | 可以分享给特定用户预览,但尚未准备好公开发布 |
所以,如果只是你自己在写还没打算对外公开的新文章预告,使用 draft: true 就已经足够实现“Coming Soon”的效果了。
如何配置隐藏的网页?
在 Docusaurus 中配置“隐藏的网页”,可以根据你的具体需求选择不同的方法。这主要取决于你想要的“隐藏”效果:是完全不公开发布,还是仅从导航中移除但保留链接。
以下是几种最常用和有效的方法。
🌿 草稿模式:完全隐藏,用于未完成内容
如果你想把正在编写的页面藏起来,不让它在线上公开,draft: true 是最佳选择。
- 效果:在
docusaurus build生产构建时,该页面完全不会被生成,因此不会出现在任何地方,包括侧边栏、搜索和站点地图中。但在docusaurus start开发模式下,你仍然可以预览它。 - 配置方法:在你的 Markdown 或 MDX 文件(无论是文档还是博客)的开头 Front Matter 中添加
draft: true。
---
title: 我的草稿页面
draft: true
---
🕶️ 未列出模式:可链接访问,但不公开可见
如果你的页面已经完成,但只想通过直接链接分享给特定人员(比如内部预览),而不希望它出现在公开的导航或搜索结果中,可以使用 unlisted: true。
- 效果:在生产构建中,页面会被生成,并且可以通过 URL 直接访问。但它不会出现在侧边栏、搜索索引、站点地图或博客列表中。
- 配置方法:同样是在 Front Matter 中添加
unlisted: true。
---
title: 内部预览页面
unlisted: true
---
🗺️ 从导航中移除但页面依然存在
如果你希望页面公开,但只是不想让它出现在侧边栏或导航栏中,可以单独控制导航的显示。
- 从侧边栏隐藏:
- 推荐方法:在你的侧边栏配置文件(通常是
sidebars.js)中,直接移除或注释掉该页面的条目。 - 备选方法:在文档的 Front Matter 中添加
hide_in_sidebar: true,这只会将其从侧边栏移除,但页面本身仍然可被搜索引擎索引和通过搜索找到。
- 推荐方法:在你的侧边栏配置文件(通常是
- 从导航栏隐藏:编辑
docusaurus.config.js文件中的themeConfig.navbar.items数组,移除对应的导航项链接即可。
💡 进阶技巧
- 使用
slug自定义路径:可以通过slug字段为页面设置一个和文件路径无关的、简洁的永久链接,让 URL 更可控。 - 隐藏整个文件夹:如果在
docs目录下,想保留文件但不生成对应页面,可以在文件名前加下划线_,例如_my-hidden-file.md。Docusaurus 将不会为这个文件创建页面。
根据你的需求,选择最适合的方法即可。如果你能补充说明更具体的使用场景,比如是博客还是文档,也许还能提供更针对性的建议。
如何将最近blog换成所有blog
要把博客列表从"最近"的几篇改成显示"所有"博客,只需要修改一个配置项。这个功能在 Docusaurus v2 中就已经支持了。
⚙️ 修改配置
在 docusaurus.config.js 文件中,找到博客插件的配置部分,将 postsPerPage 的值改为 'ALL'。
export default {
presets: [
[
'@docusaurus/preset-classic',
{
blog: {
// ... 你的其他博客配置
postsPerPage: 'ALL', // 关键:显示所有博客,取消分页
},
},
],
],
};
💡 效果与建议
设置成 'ALL' 之后,你的博客首页会一次性加载所有文章。这样一来:
- 优点:所有文章一目了然,方便访客浏览你的全部内容。
- 注意:如果文章数量非常多(比如超过几十上百篇),可能会影响页面加载速度。如果你的文章数量适中,这个设置会让体验更流畅。
如果你希望保留分页,但将每页显示的数量从默认的 10 篇调大一些,也可以把 'ALL' 替换成一个具体的数字,比如 postsPerPage: 20。
为帖子增加创建时间和最后修改时间
📝 为博客(Blog)增加时间
博客天生就带创建日期,主要需求是补充最后修改时间。Docusaurus 从 v3.6.0 版本开始,为博客插件原生支持了这项功能。
你只需要在 docusaurus.config.js 的博客插件配置中开启两个选项即可:
export default {
presets: [
[
'@docusaurus/preset-classic',
{
blog: {
// ... 你的其他博客配置
showLastUpdateTime: true, // 显示最后修改时间
showLastUpdateAuthor: true, // 显示最后修改作者
},
},
],
],
};
开启后,Docusaurus 会自动读取 Git 提交历史,在每篇博客文章下方显示最后修改时间和作者。如果文章从未修改,则不会显示此信息。这个特性让读者能快速了解内容的时效性。
📚 为文档(Docs)增加时间
官方在 @docusaurus/plugin-content-docs 插件中为文档页面提供了更灵活的支持。
1. 显示最后更新时间
你可以像博客一样,在文档插件配置中开启基于 Git 的最后更新显示,这是一种通用的便捷方式:
export default {
presets: [
[
'@docusaurus/preset-classic',
{
docs: {
// ... 你的其他文档配置
showLastUpdateTime: true,
showLastUpdateAuthor: true,
},
},
],
],
};
2. 自定义创建和更新时间
如果你需要精确控制,比如从旧站点迁移时需要保留原始的创建时间,可以使用 Front Matter(前言)中的 created 和 last_update 字段来手动指定日期。这让你完全掌控时间的显示,而无需依赖 Git 提交记录。
---
created: 2024-01-15 # 自定义创建日期
last_update:
date: 2024-06-20 # 自定义最后更新日期
author: 你的名字
---
这种方式的优先级最高,会覆盖基于 Git 自动生成的信息。启用后,Docusaurus 会自动将这些日期解析并应用到页面元数据中。
💎 总结与对比
| 内容类型 | 创建时间 | 最后修改时间 | 配置方式 |
|---|---|---|---|
| 博客 (Blog) | 由文件命名或 Front Matter 中的date 字段决定 | 通过showLastUpdateTime 选项启用,基于 Git 历史 | 在博客插件配置中设置 |
| 文档 (Docs) | 可通过 Front Matter 的created 字段自定义 | 通过showLastUpdateTime 选项启用,或用 last_update 字段手动指定 | 在文档插件配置中设置,或在文件 Front Matter 中声明 |
两种内容类型都内置了对 Git 最后修改时间的支持。如果需要更精细的控制,特别是为文档页面保留原始的创建日期,可以充分利用 Front Matter 中提供的 created 和 last_update 字段。
如何对docs中的一个.md做到仅展示到##的标题,而不展示###标题
要让某个 .md 文档的目录只展示到 ## 级别,隐藏所有 ### 标题,最标准的方法是在该文件的 Front Matter 中设置 toc_max_heading_level。
⚙️ 配置方法
在你需要修改的那个 .md 文件顶部的 Front Matter 中添加以下配置:
---
title: 你的文档标题
toc_max_heading_level: 2
---
这样设置后,该页面右上角的目录就只会显示 ##(h2)标题,### 及更深层级的标题都会被隐藏。
💡 补充说明
- 默认行为:Docusaurus 默认会显示 h2 和 h3 标题。通过将
toc_max_heading_level设为2,你就是在告诉它“最大只解析到二级标题”。 - 仅影响当前页面:这种 Front Matter 方式的设置只对当前这一个文档生效,不会影响其他页面。如果你需要全局修改所有文档的目录层级,可以在
docusaurus.config.js的themeConfig.tableOfContents中进行配置。 - 内容不受影响:这个配置只改变目录侧边栏的显示,文章正文中的
###标题依然会正常渲染和显示,不会消失。
部署到cloudflare上的work&pages时,如何升级cloudflare上的node.js和docuraurus版本
[INFO] You are using Node.js v18.17.1, Requirement: Node.js >=20.0.
2026-08-07T06:38:41.429703Z [ERROR] Minimum Node.js version not met :(
这个错误是因为 Cloudflare Pages 默认的 Node.js 版本是 18,而你的 Docusaurus 项目要求 20 或更高版本。你不需要也不能在 Cloudflare 上升级“系统”的 Node.js,你需要做的是覆盖构建环境使用的 Node.js 版本。
💡 为什么会出现这个错误?
Cloudflare Pages 的构建环境有固定的“构建镜像”,v2 版本默认使用 Node.js 18。你的 Docusaurus 项目(以及越来越多个框架)要求 Node.js 20+,所以构建会失败。好在,Cloudflare 允许你通过几种简单的方式指定构建时使用的 Node.js 版本。
✅ 解决方案:指定 Node.js 版本
要解决这个问题,有三种推荐的方法,你只需要选择其中一种。
方法一:升级 Pages 构建系统版本到 v3(推荐)
Cloudflare Pages 最新的 v3 构建系统默认已经包含了 Node.js 22。
- 登录 Cloudflare Dashboard。
- 进入 Workers & Pages,选择你的 Pages 项目。
- 在项目设置中,找到 Builds & deployments 部分。
- 在 Build system version 选项中,选择 v3 并保存。
这样,下次构建时就会默认使用 Node.js 22,满足 Docusaurus 的要求。
方法二:通过环境变量指定版本(最灵活)
如果你不想升级构建系统,可以设置 NODE_VERSION 环境变量来明确指定版本。
- 在你的 Pages 项目仪表盘,进入 Settings > Environment variables。
- 点击 Add variable,添加一个名为
NODE_VERSION,值为20或22的环境变量。
方法三:在项目中添加版本配置文件(推荐与代码同步)
你也可以在项目根目录下添加一个文件,Cloudflare Pages 会自动读取它来指定 Node.js 版本。
- 创建
.nvmrc或.node-version文件:在项目根目录下创建该文件,并在文件内容中写入你需要的 Node.js 版本号(例如20或22)。 - 将这个文件提交到你的代码仓库,这样版本要求就和代码绑定在一起了。
📌 关于 Docusaurus 版本升级
你提到的“升级 Docusaurus 版本”这件事,并不在 Cloudflare 上进行。Docusaurus 是你项目代码的一部分,在 package.json 文件中管理。升级步骤和你本地开发时一样:
- 在你的本地项目目录中,运行
npm update @docusaurus/core@latest @docusaurus/preset-classic@latest(或用 yarn/pnpm)。 - 测试本地构建 (
npm run build) 确保一切正常。 - 将更新后的
package.json和package-lock.json提交并推送到 GitHub。 - Cloudflare Pages 检测到代码变更后,会使用你指定的 Node.js 版本自动重新构建和部署。
💎 总结
你遇到的问题是 Node.js 版本不匹配,而不是 Cloudflare 系统版本老旧。最简单的修复方法是设置 NODE_VERSION 环境变量为 20 或 22,或者将 Pages 项目的 Build system version 切换到 v3。
📖 额外参考
Cloudflare 官方文档中详细说明了如何覆盖构建语言和工具的默认版本,以及 Docusaurus 的部署流程。