메인 컨텐츠로 이동
Version: 2.0.0-beta.20

도큐사우루스 클라이언트 API

도큐사우루스는 사이트를 만들 때 도움이 될 만한 API를 클라이언트에서 사용할 수 있게 제공합니다.

컴포넌트

<ErrorBoundary />

이 컴포넌트는 리액트 에러 경계를 만듭니다.

이를 사용해 컴포넌트를 래핑하고 에러가 발생했을 때 전체 앱 오류로 처리하는 대신 대체할 수 있는 UI를 보여줄 수 있습니다.

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>
);
tip

동작을 확인하려면 클릭해보세요.

info

도큐사우루스는 해당 컴포넌트를 사용해 테마 레이아웃과 전체 앱에서 발생하는 오류를 처리할 수 있습니다.

note

This component doesn't catch build-time errors and only protects against client-side render errors that can happen when using stateful React components.

속성

  • fallback: JSX 요소를 반환하는 콜백 옵션입니다. 두 개의 속성을 받을 수 있습니다. error는 처리할 에러 그리고 tryAgain는 컴포넌트 내에서 에러를 초기화하고 다시 렌더링하기 위한 콜백 함수(() => void)입니다.

재사용할 수 있는 리액트 컴포넌트로 문서 헤더 영역의 수정을 관리할 수 있습니다. 일반적인 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>

내부 페이지에 연결하거나 미리 콘텐츠를 불러와서(preloading) 성능을 최적화할 수 있는 기능을 사용할 수 있습니다. 사전 로딩(preloading)은 사용자가 컴포넌트를 사용하는 시점에 필요한 리소스를 미리 가져오는 방식입니다. <Link>가 viewport 내에 있을 때 낮은 우선순위의 요청을 처리하기 위해 IntersectionObserver를 사용합니다. 그리고 사용자가 높은 우선순위의 리소스를 요청하려고 할 때는 onMouseOver 이벤트를 발생시킵니다.

리액트 라우터의 <Link>의 래퍼 컴포넌트이며 도큐사우루스 특성에 맞게 몇 가지 유용한 기능을 확장했스니다. 모든 속성 설정은 리액트 라우터의 <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: string

탐색할 주소를 설정합니다. 예를 들어 /docs/introduction 같은 형식입니다.

<Link to="/courses" />
tip

Prefer this component to vanilla <a> tags because Docusaurus does a lot of optimizations (e.g. broken path detection, prefetching, applying base URL...) if you use <Link>.

<Redirect/>

<Redirect>은 새로운 주소의 콘텐츠로 바로 가기 위해 사용합니다. The new location will override the current location in the history stack like server-side redirects (HTTP 3xx) do. 사용할 수 있는 속성에 대해서는 리액트 라우터의 리다이렉트 문서를 참고하세요.

예를 들어 아래와 같이 설정할 수 있습니다.

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

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

@docusaurus/router리액트 라우터 기반으로 모든 기능을 지원합니다.

<BrowserOnly/>

The <BrowserOnly> component permits to render React components only in the browser after the React app has hydrated.

tip

Use it for integrating with code that can't run in Node.js, because the window or document objects are being accessed.

속성

  • children: 브라우저 전용 JSX를 반환하는 렌더링 함수 속성입니다. Node.js에서는 실행되지 않습니다.
  • fallback (옵션): 리액트 하이드레이트가 완료되기전까지 서버(Node.js)에서 렌더링할 JSX입니다.

예시 코드

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

동적으로 표시되는 자리표시자(placeholder)를 포함한 텍스트를 위한 간단한 컴포넌트입니다.

자리표시자는 동적으로 처리되는 값과 여러분이 선택한 JSX 요소(문자열, 링크, 스타일 요소 등)을 대체합니다.

속성

  • children: {placeholderName} 형태로 작성한 자리표시자를 포함한 텍스트입니다.
  • values: 자리표시자를 처리할 값을 포함한 오브젝트입니다.
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}! How are you? Take a look at my {website}'}
</Interpolate>
);
}

<Translate/>

여러분의 사이트를 현지화할 때 <Translate/> 컴포넌트는 홈페이지 같은 리액트 컴포넌트에 대한 번역을 지원합니다. <Translate> 컴포넌트는 interpolation를 지원합니다.

The translation strings will statically extracted from your code with the docusaurus write-translations CLI and a code.json translation file will be created in website/i18n/[locale].

note

<Translate/> 속성은 직접 입력된 문자열이어야 합니다.

Apart from the values prop used for interpolation, it is not possible to use variables, or the static extraction wouldn't work.

속성

  • children: 사이트 기본 로케일 설정에 따라 번역되지 않은 문자열(interpolation placeholders을 포함할 수 있습니다)
  • id: optional value to be used as the key in JSON translation files
  • 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="The homepage welcome message">
Welcome to my website
</Translate>
</h1>
<main>
<Translate values={{firstName: 'Sébastien'}}>
{'Welcome, {firstName}! How are you?'}
</Translate>
</main>
</Layout>
);
}
note

You can even omit the children prop and specify a translation string in your code.json file manually after running the docusaurus write-translations CLI command.

<Translate id="homepage.title" />

후크

useDocusaurusContext

도큐사우루스 컨텍스트에 접근하기 위한 리액트 후크입니다. The context contains the siteConfig object from docusaurus.config.js and some additional site metadata.

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

The siteConfig object only contains serializable values (values that are preserved after JSON.stringify()). Functions, regexes, etc. would be lost on the client side.

useIsBrowser

리액트 앱이 브라우저에서 성공적으로 하이드레이트되면 true를 반환합니다.

caution

리액트 렌더링 로직에서 typeof windows !== 'undefined' 대신 이 후크를 사용하세요.

첫 번째 클라이언트 측 렌더링 출력(브라우저에서)은 서버 측 렌더링 출력(Node.js)와 정확히 같아야 합니다. 그렇지 않으면 The Perils of Rehydration에서 설명하는 것처럼 의도하지 않은 하이드레이트가 동작할 수 있습니다.

사용 예:

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

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

useBaseUrl

여러분의 사이트 baseUrl에 문자열을 추가하기 위한 리액트 후크입니다.

caution

일반 링크에는 사용하지 마세요!

/baseUrl/ 접두사는 모든 절대 경로에 자동으로 추가됩니다.

  • 마크다운: [link](/my/path)/baseUrl/my/path에 링크가 연결됩니다.
  • 리액트: <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} />;
};
tip

대부분의 경우 useBaseUrl을 사용할 일은 없습니다.

아래와 같이 require() 메소드를 사용해 필요한 애셋을 호출하세요.

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

useBaseUrlUtils

useBaseUrl만 사용하기에는 충분하지 않습니다. 여러분의 사이트 base url과 관련된 추가 유틸을 반환하는 후크입니다.

  • withBaseUrl: useful if you need to add base URLs to multiple URLs at once.
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

모든 플러그인에서 만든 도큐사우루스 전역 데이터에 접근하기 위한 리액트 후크입니다.

Global data is namespaced by plugin name then by plugin ID.

info

Plugin ID is only useful when a plugin is used multiple times on the same site. 각 플러그인 인스턴스는 자신만의 전역 데이터를 만들 수 있습니다.

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

./docusaurus/globalData.json에서 여러분의 사이트에서 사용하는 전역 데이터를 확인할 수 있습니다.

usePluginData

특정 플러그인 인스턴스에서 만든 전역 데이터에 접근합니다.

This is the most convenient hook to access plugin global data and should be used most of the time.

멀티 인스턴스 플러그인을 사용하지 않는다면 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>;
};

함수

interpolate

<Interpolate> 컴포넌트에 대응하는 함수입니다.

시그니처

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

<Translate> 컴포넌트에 대응하는 함수입니다. 자리표시자 기능도 지원합니다.

tip

Use the imperative API for the 아래와 같이 간혹 컴포넌트를 사용할 수 없는 경우 함수 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: '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>
);
}

모듈

ExecutionEnvironment

A module that exposes a few boolean variables to check the current rendering environment.

caution

리액트 렌더링 로직의 경우 useIsBrowser() 또는 <BrowserOnly>을 사용하세요.

예:

import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment';

if (ExecutionEnvironment.canUseDOM) {
require('lib-that-only-works-client-side');
}
Field설명
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';
Named export
DEFAULT_PLUGIN_IDdefault