跳到主要内容
版本:Canary 🚧

主题配置

此配置适用于所有的主要主题

通用

色彩模式

经典主题默认提供浅色主题和暗黑主题,用户可以通过导航栏切换。

可以通过 colorMode 对象自定义色彩模式支持。

接受的字段:

参数类型默认值描述
defaultMode'light' | 'dark''light'用户首次访问网站时的色彩模式。
disableSwitchbooleanfalse在导航栏隐藏按钮。 如果你想要只支持一种色彩模式很有用。
respectPrefersColorSchemebooleanfalse是否使用 prefers-color-scheme 媒体查询,从而使用用户系统的首选项,而不是硬代码的 defaultMode

示例配置:

docusaurus.config.js
export default {
themeConfig: {
colorMode: {
defaultMode: 'light',
disableSwitch: false,
respectPrefersColorScheme: false,
},
},
};
警告

如果使用 respectPrefersColorScheme: truedefaultMode 会被用户系统的偏好设置覆盖。

如果你只想支持一种色彩模式,你大概率会想要忽略用户系统的偏好设置。

元数据图像

你可以配置用于元标签的默认图像,尤其是 og:imagetwitter:image

接受的字段:

参数类型默认值描述
imagestringundefined网站的元数据图像 URL。 相对于你的网站的静态目录。 不能是 SVG。 可以是外部链接。

示例配置:

docusaurus.config.js
export default {
themeConfig: {
image: 'img/docusaurus.png',
},
};

元数据

你可以配置额外的 HTML 元数据(以及覆盖现有数据)。

接受的字段:

参数类型默认值描述
metadataMetadata[][]所有字段都会被直接传递给 <meta /> 标签。 可选的字段包括 idnamepropertycontentitemprop 等。

示例配置:

docusaurus.config.js
export default {
themeConfig: {
metadata: [{name: 'twitter:card', content: 'summary'}],
},
};

告示条

有时候,你需要在网站上发布告示。 这种情况下,你可以添加一个告示条。 这是位于导航栏上方的一个面板,非固定而且可以关闭。 所有配置都在 announcementBar 对象中。

接受的字段:

参数类型默认值描述
idstring'announcement-bar'任何能够唯一标识此信息的值。
contentstring''告示的文字内容。 HTML 也可以识别。
backgroundColorstring'#fff'告示条的背景颜色。
textColorstring'#000'告示的文字颜色。
isCloseablebooleantrue是否可以用 '×' 按钮关闭告示。

示例配置:

docusaurus.config.js
export default {
themeConfig: {
announcementBar: {
id: 'support_us',
content:
'We are looking to revamp our docs, please fill <a target="_blank" rel="noopener noreferrer" href="#">this survey</a>',
backgroundColor: '#fafbfc',
textColor: '#091E42',
isCloseable: false,
},
},
};

插件

我们的 主要主题 提供额外的 Docusaurus 核心内容插件的主题配置选项。

文档

参数类型默认值描述

示例配置:

docusaurus.config.js
export default {
themeConfig: {
docs: {
versionPersistence: 'localStorage',
sidebar: {
hideable: false,
autoCollapseCategories: false,
},
},
},
};

博客

参数类型默认值描述

示例配置:

docusaurus.config.js
export default {
themeConfig: {
blog: {
sidebar: {
groupByYear: true,
},
},
},
};

接受的字段:

参数类型默认值描述

图标可以放在静态文件夹里。 图标链接的 URL 会被默认设置为网站的 base URL。 尽管你可以为图标指定自己的 URL,但如果链接是外部的,它会打开一个新标签页。 此外,你还可以覆盖图标链接的 target 属性值,如果你把文档网站托管在主网站的一个子目录中,这个配置会很有用。这种情况下,你可能不需要在链接到主网站的时候打开新标签页。

为了改善暗黑模式支持,你也可以为暗黑模式设置一个不同的图标。

接受的字段:

参数类型默认值描述

示例配置:

docusaurus.config.js
export default {
themeConfig: {
navbar: {
title: 'Site Title',
logo: {
alt: 'Site Logo',
src: 'img/logo.svg',
srcDark: 'img/logo_dark.svg',
href: 'https://docusaurus.io/',
target: '_self',
width: 32,
height: 32,
className: 'custom-navbar-logo-class',
style: {border: 'solid red'},
},
},
},
};

你可以通过向导航栏 themeConfig.navbar.items 添加项目。

docusaurus.config.js
export default {
themeConfig: {
navbar: {
items: [
{
type: 'doc',
position: 'left',
docId: 'introduction',
label: 'Docs',
},
{to: 'blog', label: 'Blog', position: 'left'},
{
type: 'docsVersionDropdown',
position: 'right',
},
{
type: 'localeDropdown',
position: 'right',
},
{
href: 'https://github.com/facebook/docusaurus',
position: 'right',
className: 'header-github-link',
'aria-label': 'GitHub repository',
},
],
},
},
};

根据 type 字段,导航栏项目的行为可能不同。 下面的部分会为你介绍所有的导航栏项目类型。

导航栏项目默认是一个普通链接(内部或外部均可)。

React Router 会自动给链接应用活跃样式,但在边缘情况下,你可以使用 activeBasePath。 对于链接应该在几个不同路径上激活的情况(比如你在同一个侧边栏下有多个文件夹), 你可以使用 activeBaseRegexactiveBaseRegex 是一个比 activeBasePath 更灵活的替代选项,并且优先于后者——Docusaurus 会把它作为正则表达式解析,并与当前的 URL 匹配。

外部链接会自动获得 target="_blank" rel="noopener noreferrer" 属性。

接受的字段:

参数类型默认值描述
备注

除了上面的字段外,你可以指定其他任何 HTML 链接接受的属性。

示例配置:

docusaurus.config.js
export default {
themeConfig: {
navbar: {
items: [
{
to: 'docs/introduction',
// Only one of "to" or "href" should be used
// href: 'https://www.facebook.com',
label: 'Introduction',
// Only one of "label" or "html" should be used
// html: '<b>Introduction</b>'
position: 'left',
activeBaseRegex: 'docs/(next|v8)',
target: '_blank',
},
],
},
},
};

dropdown 类型的导航栏项有一个额外的 items 字段,一组内部的导航栏项目。

下拉菜单的内部项目只支持以下**「类链接」的项目类型**:

请注意下拉菜单的主项也是一个可点击的链接,所以它可以接受普通导航栏链接的任何属性。

接受的字段:

参数类型默认值描述

示例配置:

docusaurus.config.js
export default {
themeConfig: {
navbar: {
items: [
{
type: 'dropdown',
label: 'Community',
position: 'left',
items: [
{
label: 'Facebook',
href: 'https://www.facebook.com',
},
{
type: 'doc',
label: 'Social',
docId: 'social',
},
// ... more items
],
},
],
},
},
};

如果你想要链接到某篇指定文档,这个特别的导航栏项目类型会渲染一个链接,指向带有给定的 docId 的文档。 只要你在浏览同一侧边栏的文档,它就会获得 navbar__link--active 类名。

接受的字段:

参数类型默认值描述

示例配置:

docusaurus.config.js
export default {
themeConfig: {
navbar: {
items: [
{
type: 'doc',
position: 'left',
docId: 'introduction',
label: 'Docs',
},
],
},
},
};

你可以将一个导航栏项目链接到某个给定侧边栏的第一个文档链接(可能是文档或者生成类别索引),而不需要硬编码一个文档 ID。

接受的字段:

参数类型默认值描述
提示

如果你的侧边栏经常更新而且顺序不稳定,请使用这个导航栏项目类型。

示例配置:

docusaurus.config.js
export default {
themeConfig: {
navbar: {
items: [
{
type: 'docSidebar',
position: 'left',
sidebarId: 'api',
label: 'API',
},
],
},
},
};
sidebars.js
export default {
tutorial: [
{
type: 'autogenerated',
dirName: 'guides',
},
],
api: [
'cli', // The navbar item will be linking to this doc
'docusaurus-core',
{
type: 'autogenerated',
dirName: 'api',
},
],
};

如果你使用文档版本化,这个特别的导航栏项目类型会渲染一个下拉菜单,包含你的网站的所有可用版本。

用户可以从一个版本切换到另一个版本。 而仍然保持在同一篇文档上(只要文档 ID 在版本之间保持不变)。

接受的字段:

参数类型默认值描述

Types:

type DropdownVersion = {
/** Allows you to provide a custom display label for each version. */
label?: string;
};

type DropdownVersions = string[] | {[versionName: string]: DropdownVersion};

示例配置:

docusaurus.config.js
export default {
themeConfig: {
navbar: {
items: [
{
type: 'docsVersionDropdown',
position: 'left',
dropdownItemsAfter: [{to: '/versions', label: 'All versions'}],
dropdownActiveClassDisabled: true,
},
],
},
},
};

如果你使用文档版本化,这个特别的的导航栏项目类型会链接到你的文档的活跃版本(正浏览的版本;取决于当前的 URL)。如果没有版本处于活跃状态,则链接到最新版本。

接受的字段:

参数类型默认值描述

示例配置:

docusaurus.config.js
export default {
themeConfig: {
navbar: {
items: [
{
type: 'docsVersion',
position: 'left',
to: '/path',
label: 'label',
},
],
},
},
};

如果你使用 i18n 功能,这个特别的的导航栏项目类型会渲染一个下拉菜单,包含了你的网站上所有可用的语言。

用户能够从一种语言切换到另一种语言,同时保持在同一个页面上。

接受的字段:

参数类型默认值描述

示例配置:

docusaurus.config.js
export default {
themeConfig: {
navbar: {
items: [
{
type: 'localeDropdown',
position: 'left',
dropdownItemsAfter: [
{
to: 'https://my-site.com/help-us-translate',
label: 'Help us translate',
},
],
},
],
},
},
};

如果你使用搜索功能,搜索框会默认是导航栏中最右边的元素。

然而,通过这个特别的导航栏项目类型,你可以更改默认位置。

参数类型默认值描述
docusaurus.config.js
export default {
themeConfig: {
navbar: {
items: [
{
type: 'search',
position: 'right',
},
],
},
},
};

你也可以用这个导航栏项目类型在导航栏中渲染自己的 HTML 标记。

参数类型默认值描述
docusaurus.config.js
export default {
themeConfig: {
navbar: {
items: [
{
type: 'html',
position: 'right',
value: '<button>Give feedback</button>',
},
],
},
},
};

自动隐藏顶部导航栏

你可以启用这个很酷的界面功能,它会在用户开始向下滚动页面时,自动隐藏导航栏,当用户向上滚动时再显示它。

docusaurus.config.js
export default {
themeConfig: {
navbar: {
hideOnScroll: true,
},
},
};

你可以把导航栏样式设置为静态,而不禁用主题切换能力。 无论用户选择哪个主题,所选的样式都会被应用。

目前有两种样式选项:darkprimary(基于 --ifm-color-main 的颜色)。 你可以在 Infima 文档中看到样式的预览。

docusaurus.config.js
export default {
themeConfig: {
navbar: {
style: 'primary',
},
},
};

代码块

Docusaurus 使用 Prism React Renderer 高亮代码块。 所有配置都在 prism 对象中。

接受的字段:

参数类型默认值描述
themePrismThemepalenight用于浅色模式下代码块的 Prism 主题。
darkThemePrismThemepalenight用于暗黑模式下代码块的 Prism 主题。
defaultLanguagestringundefined未显式声明任何语言的情况下,用于代码块的默认语言。
magicCommentsMagicCommentConfig[]见下文魔法注释列表。
type MagicCommentConfig = {
className: string;
line?: string;
block?: {start: string; end: string};
};
const defaultMagicComments = [
{
className: 'theme-code-block-highlighted-line',
line: 'highlight-next-line',
block: {start: 'highlight-start', end: 'highlight-end'},
},
];

主题

默认情况下,我们使用 Palenight 作为语法高亮主题。 您可以从这个可用主题列表中指定一个自定义主题。 你也可以在网站处于暗黑模式时,使用不同的语法高亮主题。

示例配置:

docusaurus.config.js
import {themes as prismThemes} from 'prism-react-renderer';

export default {
themeConfig: {
prism: {
theme: prismThemes.github,
darkTheme: prismThemes.dracula,
},
},
};
备注

如果你使用了 Markdown 的行高亮语法,你可能需要为暗黑模式的语法高亮主题指定不同的行高亮背景颜色。 具体教程请参考文档

默认语言

你可以设置代码块的默认语言。如果代码块开头的三个反引号(就是 ```)后没有添加语言,会使用默认语言。 注意必须传递合法的语言名

示例配置:

docusaurus.config.js
export default {
themeConfig: {
prism: {
defaultLanguage: 'javascript',
},
},
};

你可以通过 themeConfig.foot 为页脚添加图标和版权声明。 Logo 图标可以放在静态文件夹中。 图标 URL 的工作方式和导航栏图标相同。

接受的字段:

参数类型默认值描述

示例配置:

docusaurus.config.js
export default {
themeConfig: {
footer: {
logo: {
alt: 'Meta Open Source Logo',
src: 'img/meta_oss_logo.png',
href: 'https://opensource.fb.com',
width: 160,
height: 51,
},
copyright: `Copyright © ${new Date().getFullYear()} My Project, Inc. Built with Docusaurus.`,
},
},
};

你可以通过 themeConfig.footer.links 为页脚添加链接。 页脚配置有两种类型:多列页脚简单页脚

多列页脚链接的每一列都有一个 title 和一个 FooterItem 的列表。

参数类型默认值描述

每个 FooterItem 接受的字段为:

参数类型默认值描述

多列页脚配置示例:

docusaurus.config.js
export default {
footer: {
links: [
{
title: 'Docs',
items: [
{
label: 'Style Guide',
to: 'docs/',
},
{
label: 'Second Doc',
to: 'docs/doc2/',
},
],
},
{
title: 'Community',
items: [
{
label: 'Stack Overflow',
href: 'https://stackoverflow.com/questions/tagged/docusaurus',
},
{
label: 'Discord',
href: 'https://discordapp.com/invite/docusaurus',
},
{
label: 'X',
href: 'https://x.com/docusaurus',
},
{
html: `
<a href="https://www.netlify.com" target="_blank" rel="noreferrer noopener" aria-label="Deploys by Netlify">
<img src="https://www.netlify.com/img/global/badges/netlify-color-accent.svg" alt="Deploys by Netlify" width="114" height="51" />
</a>
`,
},
],
},
],
},
};

简单页脚就只会显示一行 FooterItem 列表。

简单页脚配置示例:

docusaurus.config.js
export default {
footer: {
links: [
{
label: 'Stack Overflow',
href: 'https://stackoverflow.com/questions/tagged/docusaurus',
},
{
label: 'Discord',
href: 'https://discordapp.com/invite/docusaurus',
},
{
label: 'X',
href: 'https://x.com/docusaurus',
},
{
html: `
<a href="https://www.netlify.com" target="_blank" rel="noreferrer noopener" aria-label="Deploys by Netlify">
<img src="https://www.netlify.com/img/global/badges/netlify-color-accent.svg" alt="Deploys by Netlify" width="114" height="51" />
</a>
`,
},
],
},
};

目录

你可以通过 themeConfig.tableOfContents 调整默认的目录样式。

参数类型默认值描述
minHeadingLevelnumber2目录中显示的最小标题层级。 必须介于 2 到 6 之间,并且小于等于最大值。
maxHeadingLevelnumber3目录显示的最大标题层级。 必须是 2 到 6 之间的整数。

示例配置:

docusaurus.config.js
export default {
themeConfig: {
tableOfContents: {
minHeadingLevel: 2,
maxHeadingLevel: 5,
},
},
};

钩子函数

useColorMode

一个用于访问色彩模式 context 的 React 钩子。 This context contains functions for selecting light/dark/system mode and exposes the current color mode and the choice from the user. The color mode values should not be used for dynamic content rendering (see below).

示例用法:

import {useColorMode} from '@docusaurus/theme-common';

const MyColorModeButton = () => {
const {
colorMode, // the "effective" color mode, never null
colorModeChoice, // the color mode chosen by the user, can be null
setColorMode, // set the color mode chosen by the user
} = useColorMode();

return (
<button
onClick={() => {
const nextColorMode = colorModeChoice === 'dark' ? 'light' : 'dark';
setColorMode(nextColorMode);
}}>
Toggle color mode
</button>
);
};

Attributes:

  • colorMode: 'light' | 'dark': The effective color mode currently applied to the UI. It cannot be null.
  • colorModeChoice: 'light' | 'dark' | null: The color mode explicitly chosen by the user. It can be null if user has not made any choice yet, or if they reset their choice to the system/default value.
  • setColorMode(colorModeChoice: 'light' | 'dark' | null, options: {persist: boolean}): void: A function to call when the user explicitly chose a color mode. null permits to reset the choice to the system/default value. By default, the choice is persisted in localStorage and restored on page reload, but you can opt out with {persist: false}.
警告

Don't use colorMode and colorModeChoice while rendering React components. Doing so is likely to produce FOUC, layout shifts and React hydration mismatches if you use them to render JSX content dynamically.

However, these values are safe to use after React hydration, in useEffect and event listeners, like in the MyColorModeButton example above.

If you need to render content dynamically depending on the current theme, the only way to avoid FOUC, layout shifts and hydration mismatch is to rely on CSS selectors to render content dynamically, based on the html data attributes that we set before the page displays anything:

<html data-theme="<light | dark>" data-theme-choice="<light | dark | system>">
<!-- content -->
</html>
[data-theme='light']
[data-theme='dark']

[data-theme-choice='light']
[data-theme-choice='dark']
[data-theme-choice='system']
Why are colorMode and colorModeChoice unsafe when rendering?

To understand the problem, you need to understand how React hydration works.

During the static site generation phase, Docusaurus doesn't know what the user color mode choice is, and useColorMode() returns the following static values:

  • colorMode = themeConfig.colorMode.defaultMode
  • colorModeChoice = null

During the very first React client-side render (the hydration), React must produce the exact same HTML markup, and will also use these static values.

The correct colorMode and colorModeChoice values will only be provided in the second React render.

Typically, the following component will lead to React hydration mismatches. The label may switch from light to dark while React hydrates, leading to a confusing user experience.

import {useColorMode} from '@docusaurus/theme-common';

const DisplayCurrentColorMode = () => {
const {colorMode} = useColorMode();
return <span>{colorMode}</span>;
};
备注

调用 useColormode 的组件必须是 Layout 的子组件。

function ExamplePage() {
return (
<Layout>
<Example />
</Layout>
);
}

i18n

请先阅读 i18n介绍

翻译文件位置

  • 基础路径website/i18n/[语言]/docusaurus-theme-[主题名]
  • 多实例路径:N/A
  • JSON 文件: 提取的 docusaurus write-translations
  • Markdown 文件:N/A

文件系统结构示例

website/i18n/[语言]/docusaurus-theme-classic

# 主题翻译
├── navbar.json
└── footer.json