レイアウト
レイアウトは、ページテンプレートのような再利用可能なUI構造を作成するために使用されるAstroコンポーネントです。
ヘッダーやナビゲーションバー、フッターなど、ページ間で共有される共通のUIを提供するAstroコンポーネントには、慣習的に「レイアウト」という用語が使われます。典型的なAstroのレイアウトコンポーネントは、Astro、Markdown、またはMDXのページに以下を提供します。
- ページシェル(
<html>
,<head>
,<body>
タグ) - 個々のページコンテンツが挿入される場所を指定する
<slot />
ただし、レイアウトコンポーネントに何か特別なところがあるわけではありません。他のAstroコンポーネントと同様に、propsを受け取り、他のコンポーネントをインポートして使用できます。UIフレームワークコンポーネントやクライアントサイドスクリプトも含められます。ページ全体のシェルを提供する必要すらなく、代わりに部分的なUIテンプレートとしても使用可能です。
レイアウトコンポーネントがページシェルを含んでいる場合、レイアウトコンポーネントの<html>
タグは他の全てのタグの親である必要があります。また、全ての<style>
タグと<script>
タグは<html>
タグの中に記載される必要があります。
レイアウトコンポーネントは一般的にプロジェクト内のsrc/layouts
ディレクトリに配置されますが、これは必須ではなく、プロジェクト内のどこに置いても構いません。レイアウトコンポーネントをページと同じ場所に置くこともでき、その場合はレイアウト名の先頭に_
を付けます。
レイアウトのサンプル
セクションタイトル: レイアウトのサンプルMarkdownのレイアウト
セクションタイトル: Markdownのレイアウトページレイアウトは、ページフォーマットをもたないMarkdownページとMDXページに対して特に便利です。
Astroでは、layout
というフロントマターの特別なプロパティを使用して、ページのレイアウトとして使用する.astro
コンポーネントを指定できます。
MarkdownまたはMDXページの典型的なレイアウトは以下を含みます。
- MarkdownまたはMDXページのフロントマターとその他のデータにアクセスするための
frontmatter
プロパティ。 - ページのMarkdownやMDXコンテンツをレンダリングする場所を示すためのデフォルトの
<slot />
。
MarkdownLayoutProps
またはMDXLayoutProps
を使用して、レイアウトのProps
型を設定できます。
MarkdownレイアウトのProps
セクションタイトル: MarkdownレイアウトのPropsMarkdownとMDXレイアウトは、Astro.props
を介して次の情報にアクセスできます。
file
- ファイルの絶対パス(たとえば/home/user/projects/.../file.md
)。url
- ページであれば、そのページのURL(/en/guides/markdown-content
)。frontmatter
- MarkdownまたはMDXドキュメントのすべてのフロントマター。frontmatter.file
- トップレベルのfile
プロパティと同じ。frontmatter.url
- トップレベルのurl
プロパティと同じ。
headings
- MarkdownまたはMDXドキュメントの見出し(h1 -> h6
)と、関連するメタデータのリスト。このリストは次の型に従います:{ depth: number; slug: string; text: string }[]
。- (Markdownのみ)
rawContent()
- 生のMarkdownドキュメントを文字列として返す関数。 - (Markdownのみ)
compiledContent()
- HTML文字列にコンパイルしたMarkdownドキュメントを返す関数。
Markdownのブログ記事がレイアウトに渡すAstro.props
オブジェクトは以下のようになるでしょう。
MarkdownとMDXのレイアウトは、ファイルがエクスポートしたプロパティのすべてにAstro.props
からアクセスできますが、いくつかの重要な違いがあります。
-
見出し情報(つまり
h1 -> h6
要素)は、getHeadings()
関数ではなく、headings
配列を介して利用できます。 -
file
とurl
は、ネストされたfrontmatter
プロパティ(つまりfrontmatter.url
とfrontmatter.file
)としても利用できます。 -
フロントマターの外部で定義された値(たとえばMDXの
export
文)は利用できません。代わりにレイアウトをインポートしてください。
レイアウトを手動でインポートする(MDX)
セクションタイトル: レイアウトを手動でインポートする(MDX)MDXレイアウトに、フロントマターには存在しない(または存在しようがない)情報を渡す必要がある場合があります。この場合、代わりに<Layout />
コンポーネントをインポートして使用し、他のコンポーネントと同様にpropsを渡せます。
すると、レイアウトのAstro.props
を介して値が利用でき、MDXコンテンツは<slot />
コンポーネントが書かれている場所に挿入されます。
.md
、.mdx
、.astro
に対し同一のレイアウトを使用する
セクションタイトル: .md、.mdx、.astroに対し同一のレイアウトを使用する一つのAstroレイアウトで、.md
と.mdx
ファイルのfrontmatter
オブジェクトと、.astro
ファイルから渡された名前付きのpropsを受け取るように書くことができます。
以下の例では、レイアウトは、フロントマターのYAMLのtitle
プロパティまたはtitle
属性を渡すAstroコンポーネントからページタイトルを受け取ってそれを表示します。
レイアウトの入れ子
セクションタイトル: レイアウトの入れ子レイアウトコンポーネントは、ページ全体に相当するHTMLを含む必要はありません。レイアウトをより小さなコンポーネントに分割し、各コンポーネントを組み合わせてより柔軟なページレイアウトを作成できます。このパターンは、複数のレイアウト間でコードを共有したい場合に便利です。
たとえば、BlogPostLayout.astro
レイアウトはブログ記事のタイトル、日付、作者にスタイルを付けるとします。そして、サイト全体で共通のBaseLayout.astro
は、ナビゲーションやフッター、SEOメタタグ、グローバルスタイル、フォントなどのページテンプレートの残りを処理します。また、他の入れ子になったコンポーネントと同様に、ブログ記事から受け取ったpropsを他のレイアウトに渡すこともできます。