MarkdownとMDX
Markdownは、ブログ投稿やドキュメントのようなテキストを多用するコンテンツのオーサリングによく使います。Astroは標準的なMarkdownファイルをビルトインでサポートしており、タイトルや説明文、タグなどのカスタムメタデータを定義するためのフロントマターYAMLも使用できます。
@astrojs/mdxインテグレーション (EN)をインストールすると、MDX(.mdx
)ファイルにも対応し、MarkdownコンテンツでのJavaScript式やコンポーネントのサポートなどの追加機能を提供します。
Markdownコンテンツを書くには、どちらか一方、または両方のタイプのファイルを使用します。
MarkdownページとMDXページ
コンテンツコレクション
Astroでは、MarkdownやMDXのファイルを専用のsrc/content/
フォルダで管理できます。コンテンツコレクションは、コンテンツの整理、フロントマターの検証、コンテンツを扱う際のTypeScriptの自動型安全性確保に役立ちます。
ディレクトリsrc/content/
ディレクトリnewsletter/
- week-1.md
- week-2.md
ディレクトリauthors/
- grace-hopper.md
- alan-turing.md
詳しい使い方はAstroのコンテンツコレクションをご覧ください。
ファイルベースルーティング
Astroは、/src/pages/
ディレクトリ内の.md
(または対応する別の拡張子)または.mdx
ファイルをページとして扱います。
このディレクトリ、またはサブディレクトリにファイルを置くと、ファイルのパス名を使って自動的にページルートを構築します。
📚 Astroのファイルベースルーティングや、動的ルーティングを作成するオプションについてもっと読む。
Markdownの機能
Astroは、MarkdownとMDXファイルを使用する際に利用できる、追加のビルトインMarkdown機能を提供します。
フロントマター layout
Astroは、MarkdownおよびMDXページに、Astroレイアウトコンポーネントへの相対パス(またはエイリアス)を指定できる特別なフロントマター用のlayout
プロパティを提供します。
特定のプロパティは、Astro.props
を通してレイアウトコンポーネントで利用できます。たとえば、Astro.props.frontmatter
を通して、フロントマターのプロパティにアクセスできます。
また、レイアウトコンポーネントでMarkdownをスタイリングすることもできます。
📚 Markdownのレイアウトの詳細を見る。
見出しID
MarkdownとMDXで見出しを使用すると、自動的にアンカーリンクが作成され、ページ内の特定のセクションに直接リンクできます。
特殊文字のエスケープ
特定の文字は、MarkdownおよびMDXにおいて、特別な意味を持っています。それらを表示したい場合、異なる構文を使用する必要があるかもしれません。表示するには、これらの文字の代わりにHTMLエンティティを使用します。
たとえば、<
がHTML要素の先頭と解釈されないようにするには、<
と記述します。また、MDXで{
がJavaScriptの式の先頭と解釈されないようにするには、{
と記述します。
MDXのみで使える機能
AstroのMDXインテグレーション (EN)を追加すると、JSX変数、式、コンポーネントによってMarkdownオーサリングを強化できます。
また、MDXにおけるMarkdownスタイルのフロントマターのサポートなど、標準的なMDXにさらに機能を追加しています。これにより、フロントマター layout
プロパティなど、Astroの組み込みMarkdown機能のほとんどを使用できます。
.mdx
ファイルは、AstroのHTMLライクな構文ではなく、MDX構文で記述する必要があります。
MDXでエクスポートされた変数を使用
MDXは、export
文を使用してMDXコンテンツに変数を追加することをサポートします。これらの変数は、テンプレート自体でも、ファイルをどこかにインポートするときに名前付きプロパティとしてでもアクセスできます。
たとえば、MDXページやコンポーネントからtitle
フィールドをエクスポートして、{JSX expressions}
で見出しとして使用できます。
MDXでフロントマター変数を使用
Astro MDXインテグレーションには、MDXでフロントマターを使用するためのサポートがデフォルトで含まれています。Markdownファイルと同じようにフロントマタープロパティを追加すると、これらの変数はテンプレートやlayout
コンポーネント内において、あるいはどこかにファイルをインポートするときに名前付きプロパティとして使用する際にアクセスできます。
MDXでコンポーネントを使用
MDXインテグレーションをインストールすると、AstroコンポーネントとUIフレームワークコンポーネントの両方をMDX(.mdx
)ファイルにインポートして、他のAstroコンポーネントと同じように使用できるようになります。
必要であれば、UIフレームワークのコンポーネントにclient:directive
をつけ忘れないよう注意してください。
MDX docsでimportとexport文の他の使用例を確認してください。
カスタムコンポーネントをHTML要素に割り当てる
MDXを使用すると、標準のHTML要素の代わりに、Markdown構文をカスタムコンポーネントにマッピングできます。これにより、標準的なMarkdown構文で記述しながら、選択された要素に特別なコンポーネントスタイルを適用できます。
カスタムコンポーネントを.mdx
ファイルにインポートし、標準のHTML要素をカスタムコンポーネントにマップするcomponents
オブジェクトをエクスポートします。
カスタムコンポーネントとして上書き可能なHTML要素の全リストは、MDXのウェブサイトをご覧ください。
Markdownのインポート
MarkdownファイルやMDXファイルをAstroファイルに直接インポートできます。これにより、そのMarkdownコンテンツや、AstroのJSXライクな式で使用できるフロントマターの値などのプロパティにアクセスできます。
import
文で特定の1ページを、Astro.glob()
で複数のページをインポートできます。
AstroコンポーネントでMarkdownやMDXファイルをインポートすると、そのエクスポートされたプロパティを含むオブジェクトが取得されます。
MDXファイルでは、フロントマターとexport
文の両方からプロパティにアクセスできます。
オプションとして、TypeScriptのジェネリックを使用してfrontmatter
変数の型を指定できます。
エクスポートしたプロパティ
Astroの特別なフロントマターレイアウトを使用する際に、Astroレイアウトコンポーネントにエクスポートされるプロパティを参照してください。
.astro
コンポーネントでimport
文またはAstro.glob()
を使用した場合、以下のプロパティが使用できます。
file
- ファイルの絶対パス(例:/home/user/projects/.../file.md
)。url
- もしページなら、そのページのURL (例:/en/guides/markdown-content
)。frontmatter
- ファイルのYAML フロントマターで指定された全データを含みます。getHeadings
- ファイル内のすべての見出し(すなわちh1 -> h6
要素)の配列を返す非同期関数です。各見出しのslug
は、与えられた見出しに対して生成されたIDに対応し、アンカーリンクに使用できます。このリストは次の型に従います。{ depth: number; slug: string; text: string }[]
。Content
- ファイルのレンダリングされた完全なコンテンツを返すコンポーネントです。- (Markdownのみ)
rawContent()
- 生のMarkdownドキュメントを文字列として返す関数です。 - (Markdownのみ)
compiledContent()
- HTML文字列にコンパイルされたMarkdownドキュメントを返す関数です。これはフロントマターで設定されたレイアウトを含まないことに注意してください。Markdownドキュメント自身のみがHTMLとして返されます。 - (MDXのみ) - MDXファイルは、
export
文を使用してデータをエクスポートすることもできます。
Content
コンポーネント
Content
をインポートすると、MarkdownまたはMDXファイルを完全にレンダリングしたコンテンツを返すコンポーネントを使用できます。
例:動的ページルーティング
Markdown/MDXファイルをsrc/pages/
ディレクトリに置いてページルートを作成する代わりに、ページを動的に生成できます。
Markdownコンテンツにアクセスするには、Astroページのprops
に<Content/>
コンポーネントを渡します。そして、Astro.props
からコンポーネントを取得し、ページテンプレートにレンダリングできます。
エクスポート(MDXのみ)
MDXファイルでは、export
文を使用してデータをエクスポートできます。
たとえば、MDXページやコンポーネントからtitle
フィールドをエクスポートできます。
このtitle
はimport
やAstro.glob()
(EN)文からアクセスできます。
インポートしたMDXを使ったカスタムコンポーネント
インポートしたMDXコンテンツをレンダリングする際、components
プロパティでカスタムコンポーネントを渡せます。
MDXファイルで定義され、エクスポートされたカスタムコンポーネントは、インポートしてから、components
プロパティ経由で<Content />
コンポーネントに渡す必要があります。
MarkdownとMDXの設定
AstroのMarkdownサポートは、活発なエコシステムを持つ強力なパースおよび処理ツールであるremarkによって提供されています。Pandocやmarkdown-itなどの他のMarkdownパーサーは、現在サポートされていません。
AstroはデフォルトでGitHub-flavored Markdownプラグインを適用しています。これにより、テキストからクリック可能なリンクが生成されるなど、いくつかの利点があります。
remarkがMarkdownをどのように解析するかは、astro.config.mjs
でカスタマイズできます。Markdownの設定オプションの全リストをご覧ください。
Markdownプラグイン
Astroは、MarkdownおよびMDXのためのサードパーティのremarkおよびrehypeプラグインの追加をサポートしています。これらのプラグインにより、目次の自動生成、アクセス可能な絵文字ラベルの適用など、新しい機能でMarkdownを拡張できます。
人気のあるプラグインはawesome-remarkとawesome-rehypeを参照するのがおすすめです。具体的なインストール方法については、各プラグインのREADMEをご覧ください。
この例では、Astroのデフォルトプラグインを維持したまま、MarkdownとMDXにremark-toc
を適用し、MDXのみにrehype-accessible-emojis
を適用しています。
なお、デフォルトでは、remarkToc
は目次を表示するために、ページ上に「ToC」または「Table of Contents」の見出し(大文字小文字を区別しない)を必要とします。
見出しのIDとプラグイン
Astroは、MarkdownやMDXファイルのすべての見出し要素(<h1>
~<h6>
)にid
属性を注入し、MarkdownでエクスポートしたプロパティでこれらのIDを取得するためのgetHeadings()
ユーティリティを提供しています。
id
属性(rehype-slug
など)を注入するrehypeプラグインを追加することで、これらの見出しIDをカスタマイズできます。Astroのデフォルトではなく、あなたのカスタムIDがHTML出力とgetHeadings()
が返すアイテムに反映されます。
デフォルトでは、Astroはrehypeプラグインが実行された後にid
属性を注入します。もし、カスタムrehypeプラグインの1つがAstroによって注入されたIDにアクセスする必要がある場合、AstroのrehypeHeadingIds
プラグインを直接インポートして使用できます。rehypeHeadingIds
に依存するプラグインの前に必ずrehypeHeadingIds
を追加してください。
プラグインの設定
プラグインを設定するためには、ネストされた配列の中で、プラグインの後にオプションオブジェクトを指定します。
以下の例では、remarkToc
プラグインにheading
オプションを追加して目次の配置を変更し、rehype-autolink-headings
プラグインにbehavior
オプションを追加して、見出しテキストの後にアンカータグを追加しています。
プログラムによるフロントマターの変更
コンテンツコレクションを使用している場合は、「Remarkでフロントマターを修正」を参照してください。
remarkやrehypeのプラグインを使用することで、すべてのMarkdownファイルやMDXファイルにfrontmatterプロパティを追加できます。
-
プラグインの
file
引数のdata.astro.frontmatter
プロパティにcustomProperty
を追加してください。追加: astro@2.0.0
data.astro.frontmatter
は、与えられたMarkdownまたはMDXドキュメントからのすべてのプロパティを含んでいます。これにより、既存のフロントマタープロパティを修正したり、この既存のフロントマターから新しいプロパティを計算したりできます。 -
このプラグインを
markdown
またはmdx
のインテグレーション設定に適用します。または
これで、すべてのMarkdownまたはMDXファイルは、フロントマターにcustomProperty
を持ち、Markdownのインポート時やレイアウトのAstro.props.frontmatter
プロパティから利用できるようになります。
MDXからMarkdown設定を継承
AstroのMDX統合は、デフォルトでプロジェクトの既存のMarkdown設定を継承します。個々のオプションを上書きするには、MDXの構成で同等のものを指定します。
次の例では、GitHub-Flavored Markdownを無効にし、MDXファイルに対して異なるremarkプラグインのセットを適用しています。
MDXからMarkdownの設定を継承しないようにするには、extendMarkdownConfig
オプション (EN))(デフォルトで有効)をfalse
に設定します。
シンタックスハイライト
Astroは、ShikiとPrismをビルトインでサポートしています。これは、次のようなシンタックスハイライトを提供します。
- MarkdownまたはMDXファイルで使用されているすべてのコードフェンス(```)。
- 組み込みの
<Code />
コンポーネント (EN)内のコンテンツ (Shikiを使用)。 <Prism />
コンポーネント (EN)内のコンテンツ (Prismを使用)。
Shikiはデフォルトで有効になっており、github-dark
テーマであらかじめ設定されています。コンパイルされた出力は、余計なCSSクラス、スタイルシート、クライアントサイドJSのないインラインstyle
に限定されます。
Shikiの設定
Shikiはデフォルトのシンタックスハイライトです。すべてのオプションはshikiConfig
オブジェクト経由で以下のように設定できます。
独自テーマの追加
Shikiの定義済みテーマを使用する代わりに、ローカルファイルからカスタムテーマをインポートできます。
また、テーマ、ライトモードとダークモードの切り替え、CSS変数によるスタイリングについて詳しく調べるには、Shiki公式のテーマドキュメントを読むことをおすすめします。
デフォルトのシンタックスハイライトモードを変更する
デフォルトを'prism'
に切り替えたい場合、またはシンタックスハイライトを完全に無効にしたい場合は、markdown.syntaxHighlighting
設定オブジェクトを使用できます。
Prismの設定
Prismの使用を選択した場合、AstroはPrismのCSSクラスを代わりに適用します。なお、シンタックスハイライトを表示させるには、独自のCSSスタイルシートを用意する必要があります。
- 利用可能なPrismテーマから、あらかじめ用意されたスタイルシートを選択します。
- このスタイルシートをプロジェクトの
public/
ディレクトリに追加します。 - これをレイアウトコンポーネントの
<head>
に<link>
タグで読み込みます。(Prismの基本的な使い方を参照してください)
また、オプションや使い方については、Prismの対応言語一覧をご覧ください。
リモートにあるMarkdownの取得
Astroは主にプロジェクトディレクトリ内に保存されるローカルのMarkdownファイル用に設計されています。しかし、リモートソースからMarkdownを取得する必要がある特定のケースもあるかもしれません。たとえば、ウェブサイトを構築するとき(またはSSRを使用している場合、ユーザーがウェブサイトにリクエストを行うとき)、リモートAPIからMarkdownを取得してレンダリングする必要があるかもしれません。
Astroは、標準でリモートのMarkdownをサポートしていません! リモートのMarkdownを取得し、それをHTMLにレンダリングするには、npmから独自のMarkdownパーサーをインストールし、設定する必要があります。これは、カスタマイズしたAstroのビルトインMarkdownとMDXの設定をいずれからも継承しません。プロジェクトでこれを実装する前に、これらの制限を理解しておいてください。
Learn