Aller au contenu principal
Version : Canary 🚧

API client Docusaurus

Docusaurus fournit quelques API sur les clients qui peuvent vous ĂȘtre utiles lors de la construction de votre site.

Composants​

<ErrorBoundary />​

Ce composant crée une Limite d'erreur de React.

Utilisez-le pour envelopper les composants susceptibles de se bloquer, et affichez une solution de repli lorsque cela se produit au lieu de faire planter toute l'application.

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

const SafeComponent = () => (
<ErrorBoundary
fallback={({error, tryAgain}) => (
<div>
<p>Ce composant s'est plantĂ© Ă  cause d'une erreur : {error.message}.</p>
<button onClick={tryAgain}>Essayez Ă  nouveau !</button>
</div>
)}>
<SomeDangerousComponentThatMayThrow />
</ErrorBoundary>
);
astuce

Pour le voir en action, cliquez ici :

info

Docusaurus utilise ce composant pour détecter les erreurs dans la mise en page du thÚme, mais aussi dans l'ensemble de l'application.

remarque

Ce composant ne détecte pas les erreurs de construction et protÚge uniquement contre les erreurs de rendu cÎté client qui peuvent survenir lors de l'utilisation de composants d'état de React.

Props​

  • fallback : un callback optionnel de rendu renvoyant un Ă©lĂ©ment JSX. Il recevra un objet avec 2 attributs : error, l'erreur qui a Ă©tĂ© dĂ©tectĂ©e, et tryAgain, une fonction (() => void) de rappel pour rĂ©initialiser l'erreur dans le composant et essayer de le rendre Ă  nouveau. S'il n'est pas prĂ©sent, @theme/Error sera rendu Ă  la place. @theme/Erreur est utilisĂ© pour les limites d'erreur qui enveloppent le site, au-dessus de la mise en page.
attention

La prop fallback est une callback, et n'est pas un composant fonctionnel React. Vous ne pouvez pas utiliser les hooks React à l'intérieur de ce callback.

Ce composant React rĂ©utilisable gĂ©rera toutes les modifications apportĂ©es Ă  la tĂȘte (« Head ») du document. Il prend des balises HTML simples et affiche des balises HTML simples et est facile Ă  utiliser pour les dĂ©butants. Il s'agit d'une enveloppe autour de React Helmet.

Exemple d'utilisation :

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>Mon Titre</title>
<link rel="canonical" href="http://mysite.com/example" />
</Head>
);

Les composants imbriqués ou les derniers remplaceront les utilisations dupliquées :

<Parent>
<Head>
<title>Mon Titre</title>
<meta name="description" content="Helmet application" />
</Head>
<Child>
<Head>
<title>Titre imbriqué</title>
<meta name="description" content="Composant imbriqué" />
</Head>
</Child>
</Parent>

Sorties :

<head>
<title>Titre imbriqué</title>
<meta name="description" content="Nested component" />
</head>

Ce composant permet de crĂ©er des liens vers des pages internes ainsi qu'une puissante fonctionnalitĂ© de performance appelĂ©e « prĂ©chargement Â». Le prĂ©chargement est utilisĂ© pour rĂ©cupĂ©rer les ressources Ă  l'avance, de sorte que les ressources soient rĂ©cupĂ©rĂ©es au moment oĂč l'utilisateur navigue avec ce composant. Nous utilisons un IntersectionObserver pour rĂ©cupĂ©rer une requĂȘte de faible prioritĂ© lorsque le <Link> est dans le viewport, puis nous utilisons un Ă©vĂ©nement onMouseOver pour dĂ©clencher une requĂȘte de haute prioritĂ© lorsqu'il est probable qu'un utilisateur navigue vers la ressource demandĂ©e.

Ce composant est une enveloppe autour du composant <Link> de react-router qui ajoute des améliorations utiles spécifiques à Docusaurus. Tous les props sont transmis au composant <Link> de react-router.

Les liens externes fonctionnent Ă©galement, et ont automatiquement ces props : target="_blank" rel="noopener noreferrer".

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

const Page = () => (
<div>
<p>
Consultez mon <Link to="/blog">blog</Link>!
</p>
<p>
Follow me on <Link to="https://x.com/docusaurus">X</Link>!
</p>
</div>
);

to : string​

L'emplacement cible vers lequel vous souhaitez naviguer. Exemple : /docs/introduction.

<Link to="/courses" />
astuce

Préférez ce composant aux balises vanilla <a> car si vous utilisez <Link>, Docusaurus effectue de nombreuses optimisations (par exemple, la détection des chemins brisés, le prefetch, l'application de l'URL de base...).

<Redirect/>​

Rendre un <Redirect> permet de naviguer vers un nouvel emplacement. Le nouvel emplacement remplacera l'emplacement actuel de la pile d'historique comme le font les redirections cÎté serveur (HTTP 3xx). Vous pouvez vous référer à la documentation de redirection de React Router pour plus d'informations sur les props disponibles.

Exemple d'utilisation :

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

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

@docusaurus/router implémente React Router et prend en charge ses fonctionnalités.

<BrowserOnly/>​

Le composant <BrowserOnly> permet de rendre les composants React uniquement dans le navigateur aprÚs que l'application React se soit hydratée.

astuce

Utilisez-le pour intégrer du code qui ne peut pas s'exécuter dans Node.js, parce que des objets window ou document sont accédés.

Props​

  • children : prop de fonction de rendu retournant le JSX du navigateur uniquement. Ne sera pas exĂ©cutĂ© dans Node.js
  • fallback (facultatif) : JSX Ă  rendre sur le serveur (Node.js) et jusqu'Ă  ce que l'hydratation React soit terminĂ©e.

Exemple avec du code​

import BrowserOnly from '@docusaurus/BrowserOnly';

const MyComponent = () => {
return (
<BrowserOnly>
{() => <span>page url = {window.location.href}</span>}
</BrowserOnly>
);
};

Exemple avec une bibliothùque​

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/>​

Un composant d'interpolation simple pour le texte contenant des placeholders dynamiques.

Les placeholders seront remplacés par les valeurs dynamiques fournies et les éléments JSX de votre choix (chaßnes, liens, éléments stylés...).

Props​

  • children : texte contenant des placeholders d'interpolation comme {placeholderName}
  • values : objet contenant des valeurs placeholder d'interpolation
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">
website
</Link>
),
}}>
{'Hello, {firstName} ! Comment vas-tu ? Jete un Ɠil Ă  mon {website}'}
</Interpolate>
);
}

<Translate/>​

Lors de la localisation de votre site, le composant <Translate/> permettra de fournir un support de traduction aux composants React, tels que votre page d'accueil. Le composant <Translate> prend en charge l'interpolation.

Les chaßnes de traduction seront extraites statiquement de votre code avec la CLI docusaurus write-translations et créera un fichier de traduction code.json dans website/i18n/[locale].

remarque

Les props de <Translate/> ** doivent ĂȘtre des chaĂźnes codĂ©es en dur**.

Mis à part la prop values utilisée pour l'interpolation, il n'est pas possible d'utiliser des variables, sinon l'extraction statique ne fonctionnerait pas.

Props​

  • children : chaĂźne non traduite dans la locale par dĂ©faut du site (peut contenir des placeholders d'interpolation)
  • id : valeur optionnelle Ă  utiliser comme clĂ© dans les fichiers de traduction JSON
  • description : texte optionnel pour aider le traducteur
  • values : objet optionnel contenant des valeurs placeholder d'interpolation

Exemple​

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="The homepage welcome message">
Welcome to my website
</Translate>
</h1>
<main>
<Translate values={{firstName: 'SĂ©bastien'}}>
{'Welcome, {firstName}! How are you?'}
</Translate>
</main>
</Layout>
);
}
remarque

Vous pouvez mĂȘme omettre la prop enfant et spĂ©cifier manuellement une chaĂźne de traduction dans votre fichier code.json aprĂšs avoir exĂ©cutĂ© la commande CLI docusaurus write-translations.

<Translate id="homepage.title" />
info

Le composant <Translate> prend en charge l'interpolation. Vous pouvez également implémenter la pluralisation de chaßnes à travers du code personnalisé et l'API impérative translate.

Hooks​

useDocusaurusContext​

Hook de React pour accéder au contexte Docusaurus. Le contexte contient l'objet siteConfig depuis docusaurus.config.js et quelques métadonnées supplémentaires du site.

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>;
};

Exemple d'utilisation :

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>
);
};
remarque

L'objet siteConfig ne contient que des valeurs sérialisables (valeurs qui sont préservées aprÚs JSON.stringify()). Les fonctions, les regex, etc. seraient perdus du cÎté client.

useIsBrowser​

Renvoie true lorsque l'application React s'est hydratée avec succÚs dans le navigateur.

attention

Utilisez ce hook au lieu de typeof windows !== 'undefined' dans la logique de rendu de React.

Le premier rendu cĂŽtĂ© client (dans le navigateur) doit ĂȘtre exactement le mĂȘme que le rendu cĂŽtĂ© serveur (Node.js). Ne pas suivre cette rĂšgle peut conduire Ă  des comportements d'hydratation inattendus, comme dĂ©crit dans The Perils of Rehydration.

Exemple d'utilisation :

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

const MyComponent = () => {
const isBrowser = useIsBrowser();
return <div>{isBrowser ? 'Client' : 'Server'}</div>;
};

useBaseUrl​

Hook de React pour préfixer le baseUrl de votre site à une chaßne.

attention

Ne l'utilisez pas pour les liens normaux !

Le préfixe /baseUrl/ est automatiquement ajouté à tous les chemins absolus par défaut :

  • Markdown : [link](/my/path) sera liĂ© Ă  /baseUrl/my/path
  • React : <Link to="/my/path/">lien</Link> sera liĂ© Ă  /baseUrl/my/path

Options​

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

Exemple d'utilisation :​

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

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

Dans la plupart des cas, vous n'avez pas besoin de useBaseUrl.

PrĂ©fĂ©rez un appel de require() pour les ressources :

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

useBaseUrlUtils​

Parfois, useBaseUrl n'est pas suffisant. Ce hook retourne des utilitaires supplémentaires liés à l'URL de base de votre site.

  • withBaseUrl : utile si vous avez besoin d'ajouter des URL de base Ă  plusieurs URL Ă  la fois.
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​

Hook de React pour accéder aux données globales de Docusaurus créées par tous les plugins.

Les données globales sont des espaces nommés par le nom du plugin et l'ID du plugin.

info

L'ID du plugin n'est utile que si un plugin est utilisĂ© plusieurs fois sur le mĂȘme site. Chaque instance de plugin est capable de crĂ©er ses propres donnĂ©es globales.

type GlobalData = Record<
PluginName,
Record<
PluginId, // "default" par défaut
any // données spécifiques au plugin
>
>;

Exemple d'utilisation :

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>;
};
astuce

Inspectez les données globales de votre site depuis .docusaurus/globalData.json

usePluginData​

Accéder aux données globales créées par une instance spécifique du plugin.

C'est le hook le plus pratique pour accĂ©der aux donnĂ©es globales du plugin et devrait ĂȘtre utilisĂ© la plupart du temps.

pluginId est facultatif si vous n'utilisez pas de plugins multi-instances.

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

Exemple d'utilisation :

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

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

useAllPluginInstancesData​

Accéder aux données globales créées par un plugin spécifique. Donné un nom de plugin, il retourne les données de toutes les instances de plugins de ce nom, pour chaque id de plugin.

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

Exemple d'utilisation :

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>;
};

Un hook React pour accéder aux API du vérificateur de liens défectueux de Docusaurus, exposant un moyen pour une page Docusaurus de rapporter et de collecter ses liens et ses ancrages.

attention

Il s'agit d'une interface avancée que la plupart des utilisateurs de Docusaurus n'ont pas besoin d'utiliser directement.

Il est dĂ©jĂ  intĂ©grĂ© dans les composants de haut niveau existants :

  • le composant <Link> va collecter des liens pour vous
  • le @theme/Heading (utilisĂ©e pour les entĂȘtes Markdown) va collecter les ancrages

Utilisez useBrokenLinks() si vous implémentez votre propre composant <Heading> ou <Link>.

Exemple d'utilisation :

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} />;
}

Fonctions​

interpolate​

La contrepartie impérative du composant <Interpolate>.

Signature​

// Interpolation simple de chaĂźne de caractĂšres
function interpolate(text: string, values: Record<string, string>): string;

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

Exemple​

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

const message = interpolate('Welcome {firstName}', {firstName: 'SĂ©bastien'});

translate​

La contrepartie impérative du composant <Translate>. Elle prend en charge aussi l'interpolation des placeholders.

astuce

Utilisez l'API impĂ©rative pour les rares cas oĂč un composant ne peut pas ĂȘtre utilisĂ©, tels que :

  • la mĂ©tadonnĂ©e title de la page
  • les props placeholder pour des saisies de formulaire
  • les props aria-label- pour l'accessibilitĂ©

Signature​

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

Exemple​

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: 'My page meta title'})}>
<img
src={'https://docusaurus.io/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>
);
}

Modules​

ExecutionEnvironment​

Un module qui expose quelques variables booléennes pour vérifier l'environnement de rendu actuel.

attention

Pour la logique de rendu de React, utilisez useIsBrowser() ou <BrowserOnly> Ă  la place.

Exemple :

import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment';

if (ExecutionEnvironment.canUseDOM) {
require('lib-that-only-works-client-side');
}
ChampDescription
ExecutionEnvironment.canUseDOMtrue si sur le client/navigateur, false si c'est Node.js/pré-rendu.
ExecutionEnvironment.canUseEventListenerstrue si sur le client et nous avons window.addEventListener.
ExecutionEnvironment.canUseIntersectionObservertrue si sur le client et nous avons IntersectionObserver.
ExecutionEnvironment.canUseViewporttrue si sur le client et nous avons window.screen.

constants​

Un module exposant des constantes utiles au code du thÚme cÎté client.

import {DEFAULT_PLUGIN_ID} from '@docusaurus/constants';
Export nomméValeur
DEFAULT_PLUGIN_IDdefault