跳到主要内容

Docusaurus 客户端 API

Docusaurus 提供了一些客户端 API,在构建站点时可能会对您有所帮助。

组件

<ErrorBoundary />

此组件创建一个 React 错误边界

使用它来包装可能抛出异常的组件,并在发生异常时显示备用内容,而不是使整个应用程序崩溃。

import React from 'react';
import ErrorBoundary from '@docusaurus/ErrorBoundary';

const SafeComponent = () => (
<ErrorBoundary
fallback={({error, tryAgain}) => (
<div>
<p>此组件由于错误而崩溃:{error.message}</p>
<button onClick={tryAgain}>重试!</button>
</div>
)}>
<SomeDangerousComponentThatMayThrow />
</ErrorBoundary>
);
提示

要查看其运行情况,请点击此处:

信息

Docusaurus 使用此组件捕获主题布局内以及整个应用程序内的错误。

备注

此组件不会捕获构建时错误,只会防止使用有状态 React 组件时可能发生的客户端渲染错误。

属性

  • fallback: 一个可选的渲染回调函数,返回一个 JSX 元素。它将接收一个包含 2 个属性的对象:error,捕获到的错误;tryAgain,一个函数 (() => void) 回调函数,用于重置组件中的错误并尝试再次渲染它。如果不存在,则会渲染 @theme/Error@theme/Error 用于包装站点的错误边界,位于布局之上。
注意

fallback 属性是一个回调函数, 而不是一个 React 函数组件 。您不能在此回调函数内使用 React hook。

此可重用的 React 组件将管理您对文档头部所做的所有更改。它接收纯 HTML 标签并输出纯 HTML 标签,非常易于上手。它是 React Helmet 的一个包装器。

使用方法示例:

import React from 'react';
import Head from '@docusaurus/Head';

const MySEO = () => (
<Head>
<meta property="og:description" content="我的自定义描述" />
<meta charSet="utf-8" />
<title>我的标题</title>
<link rel="canonical" href="http://mysite.com/example" />
</Head>
);

嵌套或后面的组件将覆盖重复的使用:

<Parent>
<Head>
<title>我的标题</title>
<meta name="description" content="Helmet 应用" />
</Head>
<Child>
<Head>
<title>嵌套标题</title>
<meta name="description" content="嵌套组件" />
</Head>
</Child>
</Parent>

输出:

<head>
<title>嵌套标题</title>
<meta name="description" content="嵌套组件" />
</head>

此组件允许链接到内部页面,以及一个名为预加载的强大性能功能。预加载用于预取资源,以便在用户使用此组件导航时及时获取资源。我们使用 IntersectionObserver<Link> 位于视口中时获取低优先级请求,然后使用 onMouseOver 事件在用户可能导航到请求的资源时触发高优先级请求。

此组件是 react-router 的 <Link> 组件的包装器,它添加了特定于 Docusaurus 的有用增强功能。所有属性都将传递给 react-router 的 <Link> 组件。

外部链接也可以工作,并自动具有以下属性:target="_blank" rel="noopener noreferrer"

import React from 'react';
import Link from '@docusaurus/Link';

const Page = () => (
<div>
<p>
查看我的 <Link to="/blog">博客</Link>
</p>
<p>
关注我的 <Link to="https://x.com/docusaurus">X</Link>
</p>
</div>
);

to: 字符串

要导航到的目标位置。例如:/docs/introduction

<Link to="/courses" />
提示

优先使用此组件而不是普通的 <a> 标签,因为如果您使用 <Link>,Docusaurus 会执行许多优化(例如,损坏路径检测、预取、应用基本 URL……)。

<Redirect/>

渲染 <Redirect> 将导航到一个新位置。新位置将像服务器端重定向 (HTTP 3xx) 那样覆盖历史堆栈中的当前位置。您可以参考 React Router 的 Redirect 文档 以了解有关可用属性的更多信息。

使用方法示例:

import React from 'react';
import {Redirect} from '@docusaurus/router';

const Home = () => {
return <Redirect to="/docs/test" />;
};
备注

@docusaurus/router 实现了 React Router 并支持其功能。

<BrowserOnly/>

<BrowserOnly> 组件允许仅在浏览器中 React 应用程序完成 hydration 后渲染 React 组件。

提示

将其用于集成无法在 Node.js 中运行的代码,因为正在访问 windowdocument 对象。

属性

  • children: 返回仅限浏览器的 JSX 的渲染函数 prop。不会在 Node.js 中执行
  • fallback(可选):在服务器 (Node.js) 上以及 React hydration 完成之前渲染的 JSX。

带代码的示例

import BrowserOnly from '@docusaurus/BrowserOnly';

const MyComponent = () => {
return (
<BrowserOnly>
{() => <span>页面 URL = {window.location.href}</span>}
</BrowserOnly>
);
};

使用库的示例

import BrowserOnly from '@docusaurus/BrowserOnly';

const MyComponent = (props) => {
return (
<BrowserOnly fallback={<div>加载中...</div>}>
{() => {
const LibComponent = require('some-lib').LibComponent;
return <LibComponent {...props} />;
}}
</BrowserOnly>
);
};

<Interpolate/>

用于包含动态占位符的文本的简单插值组件。

占位符将被替换为您选择的提供的动态值和 JSX 元素(字符串、链接、样式化元素……)。

属性

  • children: 包含插值占位符(如 {placeholderName})的文本
  • values: 包含插值占位符值的 Object
import React from 'react';
import Link from '@docusaurus/Link';
import Interpolate from '@docusaurus/Interpolate';

export default function VisitMyWebsiteMessage() {
return (
<Interpolate
values={{
firstName: 'Sébastien',
website: (
<Link to="https://docusaurus.io" className="my-website-class">
网站
</Link>
),
}}>
{'你好,{firstName}!最近好吗?看看我的 {website}'}
</Interpolate>
);
}

<Translate/>

本地化您的站点 时,<Translate/> 组件将允许为 React 组件 (例如您的主页)提供 翻译支持<Translate> 组件支持 插值

翻译字符串将使用 docusaurus write-translations CLI 从您的代码中静态提取,并且将在 website/i18n/[locale] 中创建一个 code.json 翻译文件。

备注

<Translate/> 属性 必须是硬编码字符串

除了用于插值的 values 属性外, 不能使用变量 ,否则静态提取将无法工作。

属性

  • children: 默认站点语言环境中的未翻译字符串(可以包含 插值占位符
  • id: 可选值,用作 JSON 翻译文件中的键
  • description: 可选文本,用于帮助翻译人员
  • values: 可选对象,包含插值占位符值

示例

src/pages/index.js
import React from 'react';
import Layout from '@theme/Layout';

import Translate from '@docusaurus/Translate';

export default function Home() {
return (
<Layout>
<h1>
<Translate
id="homepage.title"
description="主页欢迎消息">
欢迎来到我的网站
</Translate>
</h1>
<main>
<Translate values={{firstName: 'Sébastien'}}>
{'欢迎,{firstName}!最近好吗?'}
</Translate>
</main>
</Layout>
);
}
备注

您甚至可以省略 children 属性,并在运行 docusaurus write-translations CLI 命令后手动在您的 code.json 文件中指定翻译字符串。

<Translate id="homepage.title" />
信息

<Translate> 组件支持插值。您还可以通过一些自定义代码和 translate 命令式 API 实现 字符串复数化

Hooks

useDocusaurusContext

访问 Docusaurus 上下文的 React hook。上下文包含来自 docusaurus.config.jssiteConfig 对象和一些额外的站点元数据。

type PluginVersionInformation =
| {readonly type: 'package'; readonly version?: string}
| {readonly type: 'project'}
| {readonly type: 'local'}
| {readonly type: 'synthetic'};

type SiteMetadata = {
readonly docusaurusVersion: string;
readonly siteVersion?: string;
readonly pluginVersions: Record<string, PluginVersionInformation>;
};

type I18nLocaleConfig = {
label: string;
direction: string;
};

type I18n = {
defaultLocale: string;
locales: [string, ...string[]];
currentLocale: string;
localeConfigs: Record<string, I18nLocaleConfig>;
};

type DocusaurusContext = {
siteConfig: DocusaurusConfig;
siteMetadata: SiteMetadata;
globalData: Record<string, unknown>;
i18n: I18n;
codeTranslations: Record<string, string>;
};

使用方法示例:

import React from 'react';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';

const MyComponent = () => {
const {siteConfig, siteMetadata} = useDocusaurusContext();
return (
<div>
<h1>{siteConfig.title}</h1>
<div>{siteMetadata.siteVersion}</div>
<div>{siteMetadata.docusaurusVersion}</div>
</div>
);
};
备注

siteConfig 对象只包含 可序列化值 (在 JSON.stringify() 后保留的值)。函数、正则表达式等将在客户端丢失。

useIsBrowser

当 React 应用程序已在浏览器中成功完成 hydration 时返回 true

注意

在 React 渲染逻辑中使用此 hook 代替 typeof windows !== 'undefined'

首次客户端渲染输出(在浏览器中) 必须与 服务器端渲染输出(Node.js) 完全相同 。不遵守此规则可能会导致意外的 hydration 行为,如 The Perils of Rehydration 中所述。

使用方法示例:

import React from 'react';
import useIsBrowser from '@docusaurus/useIsBrowser';

const MyComponent = () => {
const isBrowser = useIsBrowser();
return <div>{isBrowser ? '客户端' : '服务器端'}</div>;
};

useBaseUrl

React hook 用于将站点的 baseUrl 添加到字符串的前面。

注意

不要将其用于常规链接!

默认情况下,/baseUrl/ 前缀会自动添加到所有 绝对路径

  • Markdown:[link](/my/path) 将链接到 /baseUrl/my/path
  • React:<Link to="/my/path/">link</Link> 将链接到 /baseUrl/my/path

选项

type BaseUrlOptions = {
forcePrependBaseUrl: boolean;
absolute: boolean;
};

使用示例:

import React from 'react';
import useBaseUrl from '@docusaurus/useBaseUrl';

const SomeImage = () => {
const imgSrc = useBaseUrl('/img/myImage.png');
return <img src={imgSrc} />;
};
提示

在大多数情况下,您不需要 useBaseUrl

对于 资源 ,优先使用 require() 调用:

<img src={require('@site/static/img/myImage.png').default} />

useBaseUrlUtils

有时 useBaseUrl 不够好。此 hook 返回与站点基本 URL 相关的其他实用程序。

  • withBaseUrl: 如果你需要一次性为多个 URL 添加基本 URL,则很有用。
import React from 'react';
import {useBaseUrlUtils} from '@docusaurus/useBaseUrl';

const Component = () => {
const urls = ['/a', '/b'];
const {withBaseUrl} = useBaseUrlUtils();
const urlsWithBaseUrl = urls.map(withBaseUrl);
return <div>{/* ... */}</div>;
};

useGlobalData

React hook 用于访问所有插件创建的 Docusaurus 全局数据。

全局数据按插件名称,然后按插件 ID 进行命名空间划分。

信息

只有当同一个站点多次使用同一个插件时,插件 ID 才有用。每个插件实例都可以创建自己的全局数据。

type GlobalData = Record<
PluginName,
Record<
PluginId, // 默认情况下为 "default"
any // 插件特定的数据
>
>;

使用方法示例:

import React from 'react';
import useGlobalData from '@docusaurus/useGlobalData';

const MyComponent = () => {
const globalData = useGlobalData();
const myPluginData = globalData['my-plugin']['default'];
return <div>{myPluginData.someAttribute}</div>;
};
提示

检查您站点上的全局数据,位置在 .docusaurus/globalData.json

usePluginData

访问特定插件实例创建的全局数据。

这是访问插件全局数据最方便的 hook,大多数情况下都应该使用它。

如果您不使用多实例插件,则 pluginId 是可选的。

function usePluginData(
pluginName: string,
pluginId?: string,
options?: {failfast?: boolean},
);

使用方法示例:

import React from 'react';
import {usePluginData} from '@docusaurus/useGlobalData';

const MyComponent = () => {
const myPluginData = usePluginData('my-plugin');
return <div>{myPluginData.someAttribute}</div>;
};

useAllPluginInstancesData

访问特定插件创建的全局数据。给定一个插件名称,它将按插件 ID 返回该名称的所有插件实例的数据。

function useAllPluginInstancesData(
pluginName: string,
options?: {failfast?: boolean},
);

使用方法示例:

import React from 'react';
import {useAllPluginInstancesData} from '@docusaurus/useGlobalData';

const MyComponent = () => {
const allPluginInstancesData = useAllPluginInstancesData('my-plugin');
const myPluginData = allPluginInstancesData['default'];
return <div>{myPluginData.someAttribute}</div>;
};

React hook 用于访问 Docusaurus 损坏链接检查器 API,为 Docusaurus 页面提供一种报告和收集其链接和锚点的方法。

注意

这是一个 高级 API, 大多数 Docusaurus 用户不需要直接使用

它已经 内置 在现有的高级组件中:

  • <Link> 组件将为您收集链接
  • @theme/Heading(用于 Markdown 标题)将收集锚点

如果您实现自己的 <Heading><Link> 组件,请使用 useBrokenLinks()

使用方法示例:

MyHeading.js
import useBrokenLinks from '@docusaurus/useBrokenLinks';

export default function MyHeading(props) {
useBrokenLinks().collectAnchor(props.id);
return <h2 {...props} />;
}
MyLink.js
import useBrokenLinks from '@docusaurus/useBrokenLinks';

export default function MyLink(props) {
useBrokenLinks().collectLink(props.href);
return <a {...props} />;
}

函数

interpolate

<Interpolate> 组件的命令式对应项。

签名

// 简单字符串插值
function interpolate(text: string, values: Record<string, string>): string;

// JSX 插值
function interpolate(
text: string,
values: Record<string, ReactNode>,
): ReactNode;

示例

import {interpolate} from '@docusaurus/Interpolate';

const message = interpolate('欢迎 {firstName}', {firstName: 'Sébastien'});

translate

<Translate> 组件的命令式对应项。也支持 占位符插值

提示

很少情况下无法使用组件 时,请使用命令式 API,例如:

  • 页面 title 元数据
  • 表单输入的 placeholder 属性
  • 用于辅助功能的 aria-label 属性

签名

function translate(
translation: {message: string; id?: string; description?: string},
values: Record<string, string>,
): string;

示例

src/pages/index.js
import React from 'react';
import Layout from '@theme/Layout';

import {translate} from '@docusaurus/Translate';

export default function Home() {
return (
<Layout
title={translate({message: '我的页面元标题'})}>
<img
src={'https://docusaurus.io/logo.png'}
aria-label={
translate(
{
message: '站点 {siteName} 的徽标',
// 可选
id: 'homepage.logo.ariaLabel',
description: '主页徽标 aria 标签',
},
{siteName: 'Docusaurus'},
)
}
/>
</Layout>
);
}

模块

ExecutionEnvironment

一个模块,它公开了一些布尔变量来检查当前的渲染环境。

注意

对于 React 渲染逻辑,请改用 useIsBrowser()<BrowserOnly>

示例:

import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment';

if (ExecutionEnvironment.canUseDOM) {
require('仅在客户端有效的库');
}
字段描述
ExecutionEnvironment.canUseDOM如果在客户端/浏览器上则为 true,在 Node.js/预渲染上则为 false
ExecutionEnvironment.canUseEventListeners如果在客户端并且具有 window.addEventListener 则为 true
ExecutionEnvironment.canUseIntersectionObserver如果在客户端并且具有 IntersectionObserver 则为 true
ExecutionEnvironment.canUseViewport如果在客户端并且具有 window.screen 则为 true

constants

一个模块,向客户端主题代码公开有用的常量。

import {DEFAULT_PLUGIN_ID} from '@docusaurus/constants';
命名导出
DEFAULT_PLUGIN_IDdefault