Markdown と MDX
Markdown は、テキストをフォーマットするための軽量マークアップ言語です。プレーンテキストの構文を使用して、構造的に有効な HTML に変換できます。ウェブサイトやブログのコンテンツ作成によく使用されます。
以下のように記述すると...
出力:
MDX は、markdown のスーパーセットで、markdown ファイル内で直接 JSX を記述できます。コンテンツ内で動的な対話性を追加し、React コンポーネントを埋め込む強力な方法です。
Next.js は、アプリケーション内のローカル MDX コンテンツと、サーバー上で動的にフェッチされるリモート MDX ファイルの両方をサポートできます。Next.js プラグインは、Markdown と React コンポーネントを HTML に変換し、Server Components(App Router のデフォルト)での使用もサポートします。
補足: 完全に動作する例については、ポートフォリオ スターター キット テンプレートを参照してください。
@next/mdx
パッケージと関連パッケージは、Next.js が Markdown と MDX を処理できるように設定するために使用されます。ローカルファイルからデータを取得し、/pages
または /app
ディレクトリ内で .md
または .mdx
拡張子のページを直接作成できます。
MDX を Next.js でレンダリングするには、以下のパッケージをインストールします:
プロジェクトのルートにある next.config.mjs
ファイルを更新し、MDX を使用するように設定します:
これにより、.md
と .mdx
ファイルがアプリケーション内でページ、ルート、またはインポートとして機能するようになります。
グローバル MDX コンポーネントを定義するために、プロジェクトのルートに mdx-components.tsx
(または .js
)ファイルを作成します。例えば、pages
または app
と同じレベル、または該当する場合は src
内に作成します。
補足:
Next.js のファイルベースルーティングまたは MDX ファイルを他のページにインポートすることで、MDX をレンダリングできます。
ファイルベースルーティングを使用する場合、MDX ページを他のページと同様に使用できます。
App Router アプリでは、メタデータの使用も含まれます。
/app
ディレクトリ内に新しい MDX ページを作成します:
これらのファイル内で MDX を使用でき、MDX ページ内で直接 React コンポーネントをインポートすることもできます:
/mdx-page
ルートに移動すると、レンダリングされた MDX ページが表示されます。
/app
ディレクトリ内に新しいページを作成し、任意の場所に MDX ファイルを作成します:
これらのファイル内で MDX を使用でき、MDX ページ内で直接 React コンポーネントをインポートすることもできます:
ページ内で MDX ファイルをインポートしてコンテンツを表示します:
/mdx-page
ルートに移動すると、レンダリングされた MDX ページが表示されます。
Markdown は、レンダリング時にネイティブ HTML 要素にマッピングされます。例えば、次の Markdown を記述すると:
以下の HTML が生成されます:
Markdown のスタイル設定には、生成された HTML 要素にマッピングするカスタムコンポーネントを提供できます。スタイルとコンポーネントは、グローバル、ローカル、および共有レイアウトで実装できます。
mdx-components.tsx
にスタイルとコンポーネントを追加すると、アプリケーション内の_すべての_ MDX ファイルに影響します。
特定のページにローカルスタイルとコンポーネントを適用するには、インポートしたMDXコンポーネントに渡すことができます。これらはグローバルスタイルとコンポーネントとマージされ、上書きされます。
MDXページ間でレイアウトを共有するには、App Routerの組み込みレイアウトサポートを使用できます。
アプリケーションのスタイル付けにTailwindを使用している場合、@tailwindcss/typography
プラグインを使用することで、Tailwindの設定とスタイルをマークダウンファイルで再利用できます。
このプラグインは、マークダウンなどのソースから来るコンテンツブロックに、タイポグラフィスタイルを追加できるprose
クラスのセットを追加します。
Tailwindタイポグラフィをインストールし、共有レイアウトと共に使用して、必要なprose
を追加します。
フロントマターは、ページに関するデータを保存できるYAMLに似たキー/値のペアリングです。@next/mdx
はデフォルトではフロントマターをサポートしていませんが、MDXコンテンツにフロントマターを追加するためのソリューションは多数あります:
@next/mdx
は、他のJavaScriptコンポーネントと同様に、エクスポートを使用できます:
メタデータは現在、MDXファイルの外部から参照できます:
一般的なユースケースは、MDXのコレクションを反復処理し、データを抽出する場合です。例えば、すべてのブログ投稿からブログインデックスページを作成する場合です。Node の fs
モジュールやglobbyなどのパッケージを使用して、投稿のディレクトリを読み取り、メタデータを抽出できます。
補足:
オプションで、MDXコンテンツを変換するためのremark
およびrehype
プラグインを提供できます。
例えば、GitHub Flavored Markdownをサポートするためにremark-gfm
を使用できます。
remark
とrehype
のエコシステムはESMのみであるため、設定ファイルとしてnext.config.mjs
を使用する必要があります。
MDXファイルやコンテンツが どこか別の場所 にある場合、サーバー上で動的にフェッチできます。これは、別のローカルフォルダ、CMS、データベース、またはその他の場所に保存されているコンテンツに便利です。この用途のための人気のあるコミュニティパッケージはnext-mdx-remote
です。
注意: 注意して進めてください。MDXはJavaScriptにコンパイルされ、サーバー上で実行されます。信頼できるソースからのみMDXコンテンツをフェッチする必要があります。そうしないと、リモートコード実行(RCE)につながる可能性があります。
以下の例はnext-mdx-remote
を使用しています:
/mdx-page-remote
ルートに移動すると、レンダリングされたMDXが表示されます。
Reactはネイティブでマークダウンを理解しません。マークダウンのプレーンテキストは最初にHTMLに変換される必要があります。これはremark
とrehype
で実現できます。
remark
はマークダウン周りのツールのエコシステムです。rehype
もHTML用の同様のものです。例えば、次のコードスニペットはマークダウンをHTMLに変換します:
remark
とrehype
のエコシステムには、シンタックスハイライト、見出しのリンク、目次の生成などのプラグインが含まれています。
上記のように@next/mdx
を使用する場合、直接remark
やrehype
を使用する 必要はありません。@next/mdx
パッケージが内部で処理するためです。ここでは、@next/mdx
パッケージが下で何をしているかをより深く理解するために説明しています。
Next.jsは、Rustで書かれた新しいMDXコンパイラをサポートしています。このコンパイラはまだ実験的であり、本番環境での使用は推奨されません。新しいコンパイラを使用するには、withMDX
に渡す際にnext.config.js
を設定する必要があります:
mdxRs
はオブジェクトを受け取り、MDXファイルの変換方法を設定できます。
補足:
このオプションは、Turbopack(next dev --turbopack
)を使用しながらマークダウンとMDXを処理する場合に必要です。