进阶 docusaurus.io 2026-10-13 10:58:59 · 24 阅读
第10章 Docusaurus 客户端 API 详解
版本:2.x Docusaurus 客户端 API
Docusaurus 在客户端提供了一系列 API,可辅助网站构建。
组件
ErrorBoundary 组件创建了一个 React 错误边界。使用它可以包裹可能抛出异常的组件,以便在异常发生时显示回退内容,而非导致整个应用崩溃。
import React from 'react';
import ErrorBoundary from '@docusaurus/ErrorBoundary';
const SafeComponent = () => (
fallback={({error, tryAgain}) => (
)}>
);
提示:点击此处可查看实际效果: 信息:Docusaurus 使用此组件捕获主题布局内部乃至整个应用内的错误。 注意:该组件无法捕获构建时错误,仅保护因使用有状态 React 组件而可能引发的客户端渲染错误。 Props fallback:可选的渲染回调,返回一个 JSX 元素。它将接收一个包含两个属性的对象:error(捕获到的错误)和 tryAgain(一个 (() => void) 类型的回调函数,用于重置组件错误并再次尝试渲染)。若未提供该属性,则会渲染 @theme/Error。@theme/Error 用于包裹位于布局上方的站点级错误边界。 警告:fallback prop 是一个回调函数,而非 React 函数组件。因此,不能在该回调中使用 React hooks。 Head 组件是一个可复用的 React 组件,用于管理 document head 的所有变更。它接收纯 HTML 标签并输出纯 HTML 标签,易于初学者上手,本质上是 React Helmet 的封装。 使用示例: import React from 'react';
import Head from '@docusaurus/Head';
const MySEO = () => (
My Title
);
嵌套或后定义的组件会覆盖重复使用的项:
My Title
Nested Title
输出:
Nested Title
该组件支持链接到内部页面,并内置一项强大的性能特性——预加载。预加载会在用户通过此组件导航前预先获取资源,从而提升加载体验。具体实现上,我们利用 IntersectionObserver 在 进入视口时发起低优先级请求,同时通过 onMouseOver 事件在用户很可能即将跳转时触发高优先级请求。 该组件基于 react-router 的 封装,并添加了 Docusaurus 专属的增强功能。所有 props 均透传给 react-router 的 组件。 外部链接同样适用,并会自动附加这些属性:target="_blank" rel="noopener noreferrer"。 import React from 'react';
import Link from '@docusaurus/Link';
const Page = () => (
);
to: string 要导航到的目标位置,例如:/docs/introduction。
提示:建议使用该组件而非原生 标签,因为使用 时 Docusaurus 会执行大量优化,例如检测无效路径、预取资源及应用基础 URL 等。
渲染 后,浏览器将导航至新位置。新位置会在历史记录堆栈中覆盖当前位置,机制类似于服务端重定向(HTTP 3xx)。更多可用 props 请参阅 React Router 的 Redirect 文档。
使用示例:
import React from 'react';
import {Redirect} from '@docusaurus/router';
const Home = () => {
return ;
};
提示:@docusaurus/router 基于 React Router 实现,并支持其各项特性。
组件让 React 组件只在浏览器中渲染,且要等 React 应用完成 hydration 之后才会执行。
提示:如果代码需要访问 window 或 document 对象、无法在 Node.js 中运行,可以用它来集成。
属性:
children:一个渲染函数,返回仅在浏览器中渲染的 JSX,在 Node.js 中不会执行。
fallback(可选):在服务端(Node.js)以及 React hydration 完成前渲染的 JSX。
代码示例:
import BrowserOnly from '@docusaurus/BrowserOnly';
const MyComponent = () => {
return (
{() => page url = {window.location.href}}
);
};
集成第三方库的示例: import BrowserOnly from '@docusaurus/BrowserOnly';
const MyComponent = (props) => {
return (
Loading...
}>import ErrorBoundary from '@docusaurus/ErrorBoundary';
const SafeComponent = () => (
该组件因以下错误而崩溃:{error.message}。
)}>
);
提示:点击此处可查看实际效果: 信息:Docusaurus 使用此组件捕获主题布局内部乃至整个应用内的错误。 注意:该组件无法捕获构建时错误,仅保护因使用有状态 React 组件而可能引发的客户端渲染错误。 Props fallback:可选的渲染回调,返回一个 JSX 元素。它将接收一个包含两个属性的对象:error(捕获到的错误)和 tryAgain(一个 (() => void) 类型的回调函数,用于重置组件错误并再次尝试渲染)。若未提供该属性,则会渲染 @theme/Error。@theme/Error 用于包裹位于布局上方的站点级错误边界。 警告:fallback prop 是一个回调函数,而非 React 函数组件。因此,不能在该回调中使用 React hooks。 Head 组件是一个可复用的 React 组件,用于管理 document head 的所有变更。它接收纯 HTML 标签并输出纯 HTML 标签,易于初学者上手,本质上是 React Helmet 的封装。 使用示例: import React from 'react';
import Head from '@docusaurus/Head';
const MySEO = () => (
);
嵌套或后定义的组件会覆盖重复使用的项:
输出:
该组件支持链接到内部页面,并内置一项强大的性能特性——预加载。预加载会在用户通过此组件导航前预先获取资源,从而提升加载体验。具体实现上,我们利用 IntersectionObserver 在 进入视口时发起低优先级请求,同时通过 onMouseOver 事件在用户很可能即将跳转时触发高优先级请求。 该组件基于 react-router 的 封装,并添加了 Docusaurus 专属的增强功能。所有 props 均透传给 react-router 的 组件。 外部链接同样适用,并会自动附加这些属性:target="_blank" rel="noopener noreferrer"。 import React from 'react';
import Link from '@docusaurus/Link';
const Page = () => (
Check out my blog!
Follow me on X!
);
to: string 要导航到的目标位置,例如:/docs/introduction。
提示:建议使用该组件而非原生 标签,因为使用 时 Docusaurus 会执行大量优化,例如检测无效路径、预取资源及应用基础 URL 等。
import {Redirect} from '@docusaurus/router';
const Home = () => {
return
};
提示:@docusaurus/router 基于 React Router 实现,并支持其各项特性。
const MyComponent = () => {
return (
{() => page url = {window.location.href}}
);
};
集成第三方库的示例: import BrowserOnly from '@docusaurus/BrowserOnly';
const MyComponent = (props) => {
return (
{() => {
const LibComponent = require('some-lib').LibComponent;
return
}}
);
};
import Link from '@docusaurus/Link';
import Interpolate from '@docusaurus/Interpolate';
export default function VisitMyWebsiteMessage() {
return (
firstName: 'Sébastien',
website: (
website
),
}}>
{'Hello, {firstName}! How are you? Take a look at my {website}'}
);
}
`
import Layout from '@theme/Layout';
import Translate from '@docusaurus/Translate';
export default function Home() {
return (
{'Welcome, {firstName}! How are you?'}
);
}
注意:你甚至可以省略 `children` prop,在运行 `docusaurus write-translations` CLI 命令后,手动在 `code.json` 文件中指定翻译字符串。`
` Hooks useDocusaurusContext 一个用于访问 Docusaurus Context 的 React Hook。该 Context 包含来自 `docusaurus.config.js` 的 `siteConfig` 对象以及部分额外的站点元数据。 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
};
type I18nLocaleConfig = {
label: string;
direction: string;
};
type I18n = {
defaultLocale: string;
locales: [string, ...string[]];
currentLocale: string;
localeConfigs: Record
};
type DocusaurusContext = {
siteConfig: DocusaurusConfig;
siteMetadata: SiteMetadata;
globalData: Record
i18n: I18n;
codeTranslations: Record
};
使用示例: import React from 'react';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
const MyComponent = () => {
const {siteConfig, siteMetadata} = useDocusaurusContext();
return (
{siteConfig.title}
{siteMetadata.siteVersion}
{siteMetadata.docusaurusVersion}
);
};
注意:siteConfig 对象仅包含可序列化的值(即经过 JSON.stringify() 后仍保留的值)。函数、正则表达式等在客户端会丢失。 useIsBrowser 当 React 应用已在浏览器中成功完成水合(hydration)时返回 true。 警告:在 React 渲染逻辑中,请改用此 Hook 代替 typeof windows !== 'undefined'。首次客户端渲染的输出(在浏览器中)必须与服务器端渲染(Node.js)的输出完全一致。若违反此规则,会导致不可预期的水合行为,详见 The Perils of Rehydration。 使用示例: import React from 'react';
import useIsBrowser from '@docusaurus/useIsBrowser';
const MyComponent = () => {
const isBrowser = useIsBrowser();
return
{isBrowser ? 'Client' : 'Server'}
;};
useBaseUrl React Hook,用于在字符串前拼接站点的 baseUrl。 警告:不要用于普通链接!默认情况下,/baseUrl/ 前缀会自动添加到所有绝对路径: Markdown:[link](/my/path) 将链接到 /baseUrl/my/path React: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
};
提示:大多数情况下无需使用 useBaseUrl。对于资源,建议优先使用 require() 调用:
.default})
useBaseUrlUtils 有时 useBaseUrl 的功能不够用。该 Hook 返回与站点 base URL 相关的额外工具函数。 withBaseUrl:当你需要一次性为多个 URL 添加 base 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
{/* ... */}
;};
useGlobalData 用于访问 Docusaurus 全局数据的 React hook,这些数据由所有插件创建。 全局数据先按插件名称、再按插件 ID 命名空间隔离。 info只有当同一个插件在站点中被使用多次时,插件 ID 才有意义。每个插件实例都可以创建自己的全局数据。 type GlobalData = Record<
PluginName,
Record<
PluginId, // "default" by default
any // plugin-specific data
>
>;
使用示例: import React from 'react';
import useGlobalData from '@docusaurus/useGlobalData';
const MyComponent = () => {
const globalData = useGlobalData();
const myPluginData = globalData['my-plugin']['default'];
return
{myPluginData.someAttribute}
;};
tip可以在 ./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
{myPluginData.someAttribute}
;};
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
{myPluginData.someAttribute}
;};
函数 interpolate
function interpolate(text: string, values: Record
// JSX interpolation
function interpolate(
text: string,
values: Record
): ReactNode;
示例 import {interpolate} from '@docusaurus/Interpolate';
const message = interpolate('Welcome {firstName}', {firstName: 'Sébastien'});
translate
translation: {message: string; id?: string; description?: string},
values: Record
): string;
示例 src/pages/index.jsimport React from 'react';
import Layout from '@theme/Layout';
import {translate} from '@docusaurus/Translate';
export default function Home() {
return (
aria-label={
translate(
{
message: 'The logo of site {siteName}',
// Optional
id: 'homepage.logo.ariaLabel',
description: 'The home page logo aria label',
},
{siteName: 'Docusaurus'},
)
}
/>
);
}
模块 ExecutionEnvironment 一个用于检测当前渲染环境的模块,暴露若干布尔变量。 警告:对于 React 渲染逻辑,请改用 useIsBrowser() 或
if (ExecutionEnvironment.canUseDOM) {
require('lib-that-only-works-client-side');
}
字段 | 说明 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_ID | default