Next.jsでMarkdownとMDXを使用する方法
Markdownは、テキストをフォーマットするための軽量なマークアップ言語です。プレーンテキスト構文で記述し、構造的に有効なHTMLに変換できます。ウェブサイトやブログのコンテンツ作成によく使用されます。
例えば次のように記述すると...
次のHTMLが出力されます:
MDXはMarkdownの拡張で、JSXを直接Markdownファイルに記述できます。コンテンツ内に動的なインタラクティブ性を追加したり、Reactコンポーネントを埋め込んだりする強力な方法です。
Next.jsは、アプリケーション内のローカルMDXコンテンツと、サーバー上で動的に取得されるリモートMDXファイルの両方をサポートできます。Next.jsプラグインは、MarkdownとReactコンポーネントをHTMLに変換する処理を行い、App RouterのデフォルトであるServer Componentsでの使用もサポートしています。
豆知識: 完全な動作例についてはPortfolio Starter Kitテンプレートをご覧ください。
依存関係のインストール
@next/mdx
パッケージと関連パッケージは、Next.jsがMarkdownとMDXを処理できるように設定するために使用されます。ローカルファイルからデータを取得するため、/pages
または/app
ディレクトリに直接.md
または.mdx
拡張子のページを作成できます。
Next.jsでMDXをレンダリングするには、次のパッケージをインストールします:
next.config.mjs
の設定
プロジェクトのルートにあるnext.config.mjs
ファイルを更新して、MDXを使用するように設定します:
これにより、.mdx
ファイルをアプリケーション内のページ、ルート、またはインポートとして使用できるようになります。
.md
ファイルの処理
デフォルトでは、next/mdx
は.mdx
拡張子のファイルのみをコンパイルします。.md
ファイルをwebpackで処理するには、extension
オプションを更新します:
豆知識: Turbopackは現在
extension
オプションをサポートしておらず、したがって.md
ファイルもサポートしていません。
mdx-components.tsx
ファイルの追加
プロジェクトのルートにmdx-components.tsx
(または.js
)ファイルを作成して、グローバルなMDXコンポーネントを定義します。例えば、pages
やapp
と同じレベル、または該当する場合はsrc
内に配置します。
豆知識:
mdx-components.tsx
はApp Routerで@next/mdx
を使用するために必須であり、これがないと動作しません。mdx-components.tsx
ファイル規約について詳しく学びましょう。- カスタムスタイルとコンポーネントの使用方法を学びましょう。
MDXのレンダリング
MDXは、Next.jsのファイルベースルーティングを使用するか、MDXファイルを他のページにインポートすることでレンダリングできます。
ファイルベースルーティングの使用
ファイルベースルーティングを使用する場合、MDXページは他のページと同じように使用できます。
App Routerアプリでは、メタデータの使用も可能です。
/app
ディレクトリ内に新しいMDXページを作成します:
これらのファイルでMDXを使用し、Reactコンポーネントを直接MDXページ内にインポートできます:
/mdx-page
ルートに移動すると、レンダリングされたMDXページが表示されます。
インポートの使用
/app
ディレクトリ内に新しいページを作成し、任意の場所にMDXファイルを作成します:
これらのファイルでMDXを使用し、Reactコンポーネントを直接MDXページ内にインポートできます:
MDXファイルをページ内にインポートしてコンテンツを表示します:
/mdx-page
ルートに移動すると、レンダリングされたMDXページが表示されます。
動的インポートの使用
ファイルシステムルーティングを使用する代わりに、動的MDXコンポーネントをインポートできます。
例えば、別のディレクトリからMDXコンポーネントを読み込む動的ルートセグメントを作成できます:

generateStaticParams
を使用して、指定されたルートを事前レンダリングできます。dynamicParams
をfalse
に設定すると、generateStaticParams
で定義されていないルートにアクセスすると404エラーになります。
豆知識: インポート時に
.mdx
ファイル拡張子を指定してください。モジュールパスエイリアス(例:@/content
)を使用する必要はありませんが、インポートパスを簡素化できます。
カスタムスタイルとコンポーネントの使用
Markdownはレンダリング時にネイティブHTML要素にマッピングされます。例えば、次のMarkdownを記述すると:
次のHTMLが生成されます:
Markdownにスタイルを適用するには、生成されたHTML要素にマッピングするカスタムコンポーネントを提供できます。スタイルとコンポーネントは、グローバル、ローカル、および共有レイアウトで実装できます。
グローバルスタイルとコンポーネント
mdx-components.tsx
にスタイルとコンポーネントを追加すると、アプリケーション内のすべてのMDXファイルに影響します。
ローカルスタイルとコンポーネント
インポートしたMDXコンポーネントにスタイルやコンポーネントを渡すことで、特定のページにローカルスタイルやコンポーネントを適用できます。これらはグローバルスタイルとコンポーネントとマージされ、上書きされます。
共有レイアウト
MDXページ間でレイアウトを共有するには、App Routerの組み込みレイアウトサポートを使用できます。
Tailwind タイポグラフィプラグインの使用
アプリケーションのスタイリングに Tailwind を使用している場合、@tailwindcss/typography
プラグイン を使用すると、マークダウンファイルで Tailwind の設定とスタイルを再利用できます。
このプラグインは prose
クラスのセットを追加し、マークダウンのようなソースから来るコンテンツブロックにタイポグラフィスタイルを適用できます。
Tailwind タイポグラフィをインストール し、共有レイアウト と共に使用して必要な prose
を追加します。
フロントマター
フロントマターは YAML のようなキー/値のペアで、ページに関するデータを保存するために使用できます。@next/mdx
はデフォルトでフロントマターを サポートしていません が、以下のような多くのソリューションがあります:
@next/mdx
は他の JavaScript コンポーネントと同様にエクスポートを使用できます:
これで、MDX ファイルの外部でメタデータを参照できます:
この機能の一般的な使用例は、MDX のコレクションを反復処理してデータを抽出する場合です。例えば、すべてのブログ投稿からブログインデックスページを作成する場合です。Node の fs
モジュール や globby などのパッケージを使用して、投稿ディレクトリを読み込み、メタデータを抽出できます。
知っておくと便利:
fs
、globby
などの使用はサーバーサイドでのみ可能です。- 完全な動作例は Portfolio Starter Kit テンプレートを参照してください。
remark と rehype プラグイン
必要に応じて、MDX コンテンツを変換する remark と rehype プラグインを提供できます。
例えば、remark-gfm
を使用して GitHub Flavored Markdown をサポートできます。
remark と rehype のエコシステムは ESM のみであるため、設定ファイルとして next.config.mjs
または next.config.ts
を使用する必要があります。
Turbopack でプラグインを使用する
Turbopack でプラグインを使用するには、最新の @next/mdx
にアップグレードし、プラグイン名を文字列で指定します:
知っておくと便利:
シリアライズ可能なオプションを持たない remark と rehype プラグインは、JavaScript 関数を Rust に渡せない ため、Turbopack ではまだ使用できません。
リモート MDX
MDX ファイルやコンテンツが 別の場所 にある場合、サーバー上で動的に取得できます。これは CMS、データベース、その他の場所に保存されたコンテンツに便利です。この用途のコミュニティパッケージとして next-mdx-remote-client
があります。
知っておくと便利: 注意して進めてください。MDX は JavaScript にコンパイルされ、サーバー上で実行されます。信頼できるソースからのみ MDX コンテンツを取得する必要があります。そうしないと、リモートコード実行 (RCE) につながる可能性があります。
以下の例では next-mdx-remote-client
を使用しています:
/mdx-page-remote
ルートに移動すると、レンダリングされた MDX が表示されます。
詳細: マークダウンを HTML に変換する方法
React はネイティブでマークダウンを理解しません。マークダウンプレーンテキストはまず HTML に変換する必要があります。これは remark
と rehype
で実現できます。
remark
はマークダウン周りのツールのエコシステムです。rehype
は HTML 用の同様のエコシステムです。例えば、以下のコードスニペットはマークダウンを HTML に変換します:
remark
と rehype
のエコシステムには、シンタックスハイライト、見出しリンク、目次生成 などのプラグインがあります。
上記のように @next/mdx
を使用する場合、直接 remark
や rehype
を使用する必要はありません。これらは内部で処理されます。ここでは @next/mdx
パッケージの内部動作を理解するために説明しています。
Rust ベースの MDX コンパイラの使用 (実験的)
Next.js は Rust で書かれた新しい MDX コンパイラをサポートしています。このコンパイラはまだ実験的で、本番環境での使用は推奨されません。新しいコンパイラを使用するには、next.config.js
を withMDX
に渡すときに設定する必要があります:
mdxRs
は MDX ファイルの変換方法を設定するオブジェクトも受け入れます。