Docusaurus 客户端 API
Docusaurus 在客户端提供了一些 API,在构建网站时对您可能会有帮助。
组件
<ErrorBoundary />
此组件创建了一个 React 错误边界。
使用它来包装可能抛出异常的组件,并在发生这种情况时显示备用内容,而不是使整个应用程序崩溃。
import React from 'react';
import ErrorBoundary from '@docusaurus/ErrorBoundary';
const SafeComponent = () => (
<ErrorBoundary
fallback={({error, tryAgain}) => (
<div>
<p>This component crashed because of error: {error.message}.</p>
<button onClick={tryAgain}>Try Again!</button>
</div>
)}>
<SomeDangerousComponentThatMayThrow />
</ErrorBoundary>
);
要查看实际效果,请点击此处
Docusaurus 使用此组件来捕获主题布局以及整个应用程序中的错误。
此组件不会捕获构建时错误,只针对使用有状态 React 组件时可能发生的客户端渲染错误提供保护。
属性
fallback
:一个可选的渲染回调函数,返回一个 JSX 元素。它将接收一个包含两个属性的对象:error
,捕获的错误,以及tryAgain
,一个函数 (() => void
) 回调函数,用于重置组件中的错误并尝试重新渲染它。如果不存在,将渲染@theme/Error
。@theme/Error
用于包装网站的错误边界,位于布局之上。
fallback
属性是一个回调函数,而不是一个 React 函数式组件。您不能在此回调函数中使用 React 钩子。
<Head/>
这个可重复使用的 React 组件将管理您对文档头部的所有更改。它接受纯 HTML 标签并输出纯 HTML 标签,对初学者友好。它是 React Helmet 的包装器。
使用示例
import React from 'react';
import Head from '@docusaurus/Head';
const MySEO = () => (
<Head>
<meta property="og:description" content="My custom description" />
<meta charSet="utf-8" />
<title>My Title</title>
<link rel="canonical" href="http://mysite.com/example" />
</Head>
);
嵌套或后面的组件将覆盖重复的使用
<Parent>
<Head>
<title>My Title</title>
<meta name="description" content="Helmet application" />
</Head>
<Child>
<Head>
<title>Nested Title</title>
<meta name="description" content="Nested component" />
</Head>
</Child>
</Parent>
输出
<head>
<title>Nested Title</title>
<meta name="description" content="Nested component" />
</head>
<Link/>
此组件允许链接到内部页面,并提供一个强大的性能功能,称为预加载。预加载用于预取资源,以便在用户使用此组件导航时,资源已准备好。我们使用 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>
Check out my <Link to="/blog">blog</Link>!
</p>
<p>
Follow me on <Link to="https://twitter.com/docusaurus">Twitter</Link>!
</p>
</div>
);
to
:字符串
要导航到的目标位置。例如:/docs/introduction
。
<Link to="/courses" />
与普通的 <a>
标签相比,更倾向于使用此组件,因为 Docusaurus 在使用 <Link>
时会进行很多优化(例如,断开路径检测、预取、应用基本 URL...)。
<Redirect/>
渲染 <Redirect>
将导航到一个新的位置。新的位置将像服务器端重定向(HTTP 3xx)一样覆盖历史记录堆栈中的当前位置。您可以参考 React Router 的重定向文档,了解更多关于可用属性的信息。
使用示例
import React from 'react';
import {Redirect} from '@docusaurus/router';
const Home = () => {
return <Redirect to="/docs/test" />;
};
@docusaurus/router
实施了 React Router 并支持其功能。
<BrowserOnly/>
<BrowserOnly>
组件允许仅在浏览器中渲染 React 组件,在 React 应用程序完成水合后。
对于集成无法在 Node.js 中运行的代码,请使用它,因为正在访问 window
或 document
对象。
属性
children
:渲染函数 prop,返回浏览器专用的 JSX。不会在 Node.js 中执行fallback
(可选):在服务器(Node.js)上渲染的 JSX,以及在 React 水合完成之前。
使用代码的示例
import BrowserOnly from '@docusaurus/BrowserOnly';
const MyComponent = () => {
return (
<BrowserOnly>
{() => <span>page url = {window.location.href}</span>}
</BrowserOnly>
);
};
使用库的示例
import BrowserOnly from '@docusaurus/BrowserOnly';
const MyComponent = (props) => {
return (
<BrowserOnly fallback={<div>Loading...</div>}>
{() => {
const LibComponent = require('some-lib').LibComponent;
return <LibComponent {...props} />;
}}
</BrowserOnly>
);
};
<Interpolate/>
一个用于包含动态占位符的文本的简单插值组件。
占位符将被您选择的提供的动态值和 JSX 元素(字符串、链接、样式化元素...)替换。
属性
children
:包含插值占位符的文本,例如{placeholderName}
values
:包含插值占位符值的 objects
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.org.cn" className="my-website-class">
website
</Link>
),
}}>
{'Hello, {firstName}! How are you? Take a look at my {website}'}
</Interpolate>
);
}
<Translate/>
在 本地化您的网站 时,<Translate/>
组件将允许为 React 组件提供翻译支持,例如您的主页。<Translate>
组件支持 插值。
翻译字符串将使用 docusaurus write-translations
CLI 从您的代码中静态提取,并将创建一个 code.json
翻译文件,位于 website/i18n/[locale]
中。
<Translate/>
的属性必须是硬编码字符串。
除了用于插值的 values
属性外,不能使用变量,否则静态提取将无法正常工作。
属性
children
:网站默认区域设置中的未翻译字符串(可以包含 插值占位符)id
:可选值,用作 JSON 翻译文件中的键description
:可选文本,用于帮助翻译人员values
:可选 objects,包含插值占位符值
示例
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="The homepage welcome message">
Welcome to my website
</Translate>
</h1>
<main>
<Translate values={{firstName: 'Sébastien'}}>
{'Welcome, {firstName}! How are you?'}
</Translate>
</main>
</Layout>
);
}
您甚至可以省略 children 属性,并在运行 docusaurus write-translations
CLI 命令后,在 code.json
文件中手动指定翻译字符串。
<Translate id="homepage.title" />
<Translate>
组件支持插值。您还可以通过一些自定义代码和 translate
命令式 API 实施 字符串复数化。
钩子
useDocusaurusContext
React 钩子,用于访问 Docusaurus 上下文。上下文包含来自 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<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 应用程序在浏览器中成功完成水合后,返回 true
。
在 React 渲染逻辑中,使用此钩子代替 typeof windows !== 'undefined'
。
第一个客户端渲染输出(在浏览器中)必须与服务器端渲染输出(Node.js)完全相同。不遵循此规则会导致意外的水合行为,如 水合的危害 中所述。
使用示例
import React from 'react';
import useIsBrowser from '@docusaurus/useIsBrowser';
const MyComponent = () => {
const isBrowser = useIsBrowser();
return <div>{isBrowser ? 'Client' : 'Server'}</div>;
};
useBaseUrl
React 钩子,用于将您的网站 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" 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 <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>;
};
useBrokenLinks
React hook 用于访问 Docusaurus 错误链接检查器 API,为 Docusaurus 页面提供报告和收集其链接和锚点的途径。
这是一个 高级 API,大多数 Docusaurus 用户不需要直接使用。
它已内置在现有的高级组件中
- the
<Link>
component will collect links for you - the
@theme/Heading
(用于 Markdown 标题) 将收集锚点
如果您实现了自己的 <Heading>
或 <Link>
组件,请使用 useBrokenLinks()
。
使用示例
import useBrokenLinks from '@docusaurus/useBrokenLinks';
export default function MyHeading(props) {
useBrokenLinks().collectAnchor(props.id);
return <h2 {...props} />;
}
import useBrokenLinks from '@docusaurus/useBrokenLinks';
export default function MyLink(props) {
useBrokenLinks().collectLink(props.href);
return <a {...props} />;
}
函数
interpolate
The imperative counterpart of the <Interpolate>
component.
签名
// Simple string interpolation
function interpolate(text: string, values: Record<string, string>): string;
// JSX interpolation
function interpolate(
text: string,
values: Record<string, ReactNode>,
): ReactNode;
示例
import {interpolate} from '@docusaurus/Interpolate';
const message = interpolate('Welcome {firstName}', {firstName: 'Sébastien'});
translate
The imperative counterpart of the <Translate>
component. Also supporting placeholders interpolation.
在以下 罕见情况 下使用命令式 API,这些情况是 无法使用组件 的情况,例如
- 页面
title
元数据 - 表单输入的
placeholder
属性 - 用于可访问性的
aria-label
属性
签名
function translate(
translation: {message: string; id?: string; description?: string},
values: Record<string, string>,
): string;
示例
import React from 'react';
import Layout from '@theme/Layout';
import {translate} from '@docusaurus/Translate';
export default function Home() {
return (
<Layout
title={translate({message: 'My page meta title'})}>
<img
src={'https://docusaurus.org.cn/logo.png'}
aria-label={
translate(
{
message: 'The logo of site {siteName}',
// Optional
id: 'homepage.logo.ariaLabel',
description: 'The home page logo aria label',
},
{siteName: 'Docusaurus'},
)
}
/>
</Layout>
);
}
模块
ExecutionEnvironment
一个模块,它公开一些布尔变量来检查当前渲染环境。
对于 React 渲染逻辑,请改用 useIsBrowser()
或 <BrowserOnly>
。
示例
import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment';
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 | 默认 |