このシリーズでは、ドキュメントサイトをつくりながら Docusaurus の使い方を説明しています。
前回「ドキュメント編」では、ドキュメントページの追加とサイドバーのカスタマイズまで進めました。今回は Markdown や MDX の機能を見ていきます。
なお、Docusaurus の Markdown の詳細は、以下の公式ドキュメントから確認できます。
本記事の完成後のデータ一式は以下の GitHub リポジトリにアップしています。
https://github.com/griponminds/docusaurus-tutorial/tree/vol-4
Markdown / MDX の機能を試していくにあたり、まずサンプル用のページを docs/markdown.mdx
というファイル名で追加します。
なお、Docusaurus では、拡張子が .md
でも MDX として処理されます。
今回は、サンプルページはビルドには含めずに開発時のみに使用できるようにします。そのために、Front Matter に draft: true
と指定して、下書き状態とします。
追加したサンプルページへのリンクをサイドバー(sidebars.js
)にも反映します。
あらためて Markdown とは、シンプルなテキストで文書構造を表現することができる軽量のマークアップ言語です。ツールを介して HTML 形式などへの変換が可能です。
Markdown は「読みやすく」「書きやすい」特徴を持った文書を、適切な XHTML または HTML に変換できるフォーマットとして、John Gruber 氏とその協力者である Aaron Swartz 氏によって 2004 年に考案されました。
その後、多くのサービスで使われるようになる Markdown ですが、明確な仕様が存在しなかったため、実装によって異なる解釈が生まれてしまう曖昧さが問題となりました。
この問題を解決するために、2014 年以降、CommonMark プロジェクトにより仕様化が進められました。現在も、この CommonMark の仕様をベースに、独自の記法や拡張機能を取り入れたいくつものバリエーションが生まれています。
GitHub は、2009 年より Markdown から派生した独自の GitHub Flavored Markdown(GFM)を導入していましたが、2017 年に CommonMark の上位互換として改めて仕様化されました。
Docusaurus では Markdown 内で JSX 構文で作られたコンポーネントを使用できる、MDX をサポートしています。
少しややこしいのですが、この MDX は CommonMark の仕様をベースとしており、GFM の拡張機能は remark のプラグイン経由で使用できます。Docusaurus では、この GFM の拡張機能が使える状態になっています。
ここで一旦、Docusaurus での Markdown 機能の前提をまとめます。
- MDX をサポートしており、JSX 構文で作られたコンポーネントが使用できる
.md
、.mdx
どちらの拡張子でも MDX として処理される
- GFM の拡張機能を使用できる(remark プラグイン経由)
GitHub をはじめ、さまざまなサービスで使われているため、なじみ深いと思いますが、以下に GFM の基本的な記法をピックアップします(折りたたんでいます)。
GFM の基本的な記法
画像は、以下の参照形式にも対応しています。
参照形式は URL が長いときなどに、記述箇所を分けることで可読性を高めることができますが、ファイル内で参照する ID の値を一意にしなければならない点に留意する必要があります。
Markdown の記法で画像を指定した場合、Docusaurus では loading="lazy"
、width
、height
が自動的に付与されます。パフォーマンスの向上が見込める反面、ファーストビュー(Above the fold)に配置される画像の LCP を悪化させる要因にもなるので注意が必要です。
取り消し線は、GFM の拡張機能です。
リンクは、以下の参照形式にも対応しています。
画像同様に、参照形式を使用することで文書の可読性を高めることができますが、ID の値をユニークにしなければならない点に留意する必要があります。
GFM の拡張機能として、以下のような URL 形式やメール形式のテキストは、自動的にリンクが付与されますが、なるべく使用は控えたほうがよいでしょう。
タスクリストは GFM の拡張機能です。
表は GFM の拡張機能です。
列方向の見出しセル要素(tbody > th
)や、colspan
、rowspan
でのセルの結合は表現できないので、その場合は HTML で記述する必要があります。
続いて、そのほかの拡張機能を見ていきます。
コードブロックは、GFM の記法に加えて Docusaurus 独自の機能があります。
コードブロック開始位置の ```
の後ろの半角スペースに続けて、title=""
でタイトルを明示することができます。
以下のコメントで特定の行をハイライト表示できます。
// highlight-next-line
: 次の行をハイライト
// highlight-start
… // highlight-end
: ハイライトの範囲を指定
これらの特殊なコメントは「Magic comments」と呼ばれ、Docusaurus ではユーザ独自のコメントのルールとスタイルを追加することもできます。
なお、以下のようにコードの行番号 {5,11-14}
を指定してハイライトさせることもできますが、コード全体の行数が変わると位置が変わるリスクがあるので避けたほうがよいでしょう。
以下のように showLineNumbers
を指定すると行番号を表示できます。
Docusaurus npm2yarn remark plugin は、npm のコマンドを指定するだけで、Yarn と pnpm のコマンドをタブ形式で生成してくれるプラグインです。
以下のコマンドでプラグインをインストールします。
docusaurus.config.js
の presets
に、プラグインの設定を追加します。
以下のように、コードブロックに npm2yarn
を指定すると有効になります。
ドキュメントのインデックスページ(docs/index.md
)のコードブロックに npm2yarn
を追加して表示を確認してみましょう。
Docusaurus では、折りたたみ要素(アコーディオン)のスタイルが用意されていますが、HTML タグ(<details>
と <summary>
)で記述する必要があります。
以下のように、折りたたみ要素のスタイルが適用されます。
Docusaurus では、注記や警告などを表現する「Admonitions」と呼ばれる要素を使用できます。この機能は remark プラグインによって実装されています。
対象箇所を :::
から :::
までで囲い、開始位置にキーワードを指定します。
日本語にローカライズされた状態でのテキストラベルは以下のとおりです。
指定したキーワードによって、テキストラベル、アイコン、カラーが変わります。
キーワードの後ろの半角スペースに続けて、文字列を指定することでテキストラベルを変更することができます。
なお、詳しい説明は省きますが、docusaurus write-translations
コマンドを実行することで翻訳データ(JSON ファイル)を取得することができます。
この JSON ファイルの内容を変更することで、Admonitions の「注記」や「ヒント」のような、デフォルトのテキストラベルを変更することができます。
脚注は remark のプラグイン経由で実装されています。
Docusaurus では、タブ切り替えのコンポーネントが用意されています。
groupId
属性の値をそろえることで、タブの切り替えを同期させることができます。
そのほかにも、スタイルを変更したり、クエリ文字列を指定することもできます。詳しくは公式ドキュメントをご確認ください。
独自に作成した React コンポーネントを読み込むこともできます。
例として、テキストをマーカー風のスタイルで強調するカスタムコンポーネントを src/components/Marker.js
というファイル名で作成します。
このコンポーネントは color
属性でマーカーのカラーを変更できます。
MDX ファイルでインポートしてコンポーネントを使用します。
以下のように、<Marker>
コンポーネントが有効になります。
カスタムコンポーネントをグローバルなコンポーネントとして設定することも可能です。
src/theme/MDXComponents.js
を新規作成し、以下のように Marker
を追加します。
これで <Marker>
コンポーネントがグローバルスコープになったので、インポートせずに使用することができます。
Docusaurus の Markdown は、このほかにもさまざまな機能がありますが、基本的な使い方としてはこんなところでしょうか。
次回は、ブログの機能を見ていきます。