コンポーネント
Astroコンポーネントは、あらゆるAstroプロジェクトの基本的な構成要素です。クライアントサイドのランタイムを持たない、HTMLのみのテンプレートコンポーネントです。Astroコンポーネントは、.astro
という拡張子により判別できます。
Astroコンポーネントは非常に柔軟です。多くの場合、Astroコンポーネントは、ヘッダーやプロフィールカードのような、ページ上で再利用可能なUIを含むことになります。また、Astroコンポーネントには、SEO対策を容易にする共通の<meta>
タグのコレクションのような、小さなHTMLのスニペットが含まれることもあります。Astroコンポーネントは、ページ全体のレイアウトを含められます。
Astroコンポーネントについて知っておくべきもっとも重要なことは、クライアント上でレンダリングされないということです。コンポーネントはビルド時またはサーバーサイドレンダリング(SSR) (EN)によりオンデマンドにレンダリングされます。コンポーネントのフロントマターの内部にJavaScriptコードを含められますが、それらはすべて、ユーザーのブラウザに送られる最終的なページからは取り除かれます。その結果、デフォルトではJavaScriptが含められることはなく、より高速なサイトが実現します。
Astroコンポーネントがクライアントサイドでインタラクティビティを必要とする場合は、標準のHTML<script>
タグやUIフレームワークのコンポーネントを追加できます。
コンポーネント構造
セクションタイトル: コンポーネント構造Astroコンポーネントは、コンポーネントスクリプトとコンポーネントテンプレートという2つの主要な部分で構成されています。それぞれのパーツは異なる役割を担いますが、この2つを組み合わせることで、使いやすさと、どんなものにも対応できる表現力を兼ね備えたフレームワークを提供しています。
コンポーネントスクリプト
セクションタイトル: コンポーネントスクリプトAstroでは、Astroコンポーネント内のコンポーネントスクリプトを識別するためにコードフェンス(---
)を使用します。Markdownを書いたことがある方なら、すでにフロントマターという同様の概念に馴染みがあるかもしれません。Astroのコンポーネントスクリプトの考え方は、この概念から直接着想を得ています。
コンポーネントスクリプトを使用して、テンプレートをレンダリングするために必要なあらゆるJavaScriptコードを記述できます。
- 他のAstroコンポーネントのインポート
- 他のフレームワークコンポーネント(Reactなど)のインポート
- データ(JSONファイルなど)のインポート
- APIやデータベースからコンテンツを取得するコード
- テンプレートで参照する変数の作成
コードフェンスは、その中に書かれたJavaScriptを「囲い込む」ことを保証するために設計されています。コードがフロントエンドのアプリケーションに漏れたり、ユーザーの手に渡ったりしません。高コストなコードや機密性の高いコード(プライベートなデータベースの呼び出しなど)が、ユーザーのブラウザに届くことを心配せずに、安全にコードを書けます。
コンポーネントスクリプトの中には、TypeScriptも書けます!
コンポーネントテンプレート
セクションタイトル: コンポーネントテンプレートコンポーネントテンプレートはコードフェンスの下に置かれ、コンポーネントの出力するHTMLを決定します。
ここにプレーンなHTMLを書けば、そのコンポーネントはAstroのページでインポートされて使用される際にそのHTMLをレンダリングします。
ただし、Astroのコンポーネントテンプレート構文は、JavaScriptの式、Astroの<style>
と<script>
タグ、インポートしたコンポーネント、特別なAstroディレクティブもサポートしています。コンポーネントスクリプトで定義されたデータと値をコンポーネントテンプレートで使用することで、動的に作成されたHTMLを生成できます。
コンポーネントベースの設計
セクションタイトル: コンポーネントベースの設計コンポーネントは、再利用可能であり、他と組み合わせられるよう設計されます。コンポーネントの中に他のコンポーネントを使って、より高度なUIを構築できます。たとえば、Button
コンポーネントを使ってButtonGroup
コンポーネントを作成できます。
コンポーネントのprops
セクションタイトル: コンポーネントのpropsAstroコンポーネントは、propsを定義し、受け取れます。propsは、HTMLをレンダリングするためにコンポーネントテンプレートで利用できます。propsは、フロントマタースクリプトのグローバルな Astro.props
で利用できます。
以下は、greeting
とname
のpropsを受け取るコンポーネントの例です。受け取るpropsは、グローバルな Astro.props
オブジェクトから分割代入されることに注意してください。
このコンポーネントをインポートして、他のAstroコンポーネント、レイアウト、ページでレンダリングする場合、属性としてこれらのpropsを渡せます。
TypeScriptのProps
型のインターフェイスでpropsを定義できます。Astroはフロントマター内のProps
インターフェイスを自動的に検出し、型の警告やエラーを出します。propsは、Astro.props
から分割代入する際に、デフォルト値を与えることもできます。
コンポーネントのpropsは、何も提供されない場合に使用するデフォルト値を指定できます。
スロット
セクションタイトル: スロット<slot />
要素は外部HTMLコンテンツのプレースホルダーで、他のファイルからコンポーネントテンプレートに子要素を注入(はめ込む=スロット)できます。
デフォルトでは、コンポーネントに渡されたすべての子要素は、その<slot />
内でレンダリングされます。
Astroコンポーネントに渡される属性であり、Astro.props()
でコンポーネント全体から使用できるpropsとは異なり、slotは書かれた場所に子要素をレンダリングします。
このパターンはAstroレイアウトコンポーネントの基本です。HTMLコンテンツのページ全体を<Layout></Layout>
タグで囲んでレイアウトコンポーネントに送り、そこで定義された共通のページ要素の中にレンダリングさせられます。
名前付きスロット
セクションタイトル: 名前付きスロットAstroコンポーネントは、名前付きスロットも使えます。これを利用すると、対応するスロット名を持つHTML要素のみをスロットの場所に渡せます。
スロットはname
属性により名前を付けます。
特定のスロットにHTMLコンテンツを渡すには、任意の子要素のslot
属性によりスロット名を指定します。コンポーネントの他のすべての子要素は、デフォルトの(名前のない)<slot />
に渡されます。
子要素の slot="my-slot"
属性を使用して、コンポーネント内の <slot name="my-slot" />
にマッチするプレースホルダに渡します。
<div>
でラップせずに複数のHTML要素をコンポーネントの<slot/>
プレースホルダーに渡すには、Astroの<Fragment/>
コンポーネントのslot=""
属性を使用します。
slot=""
属性により"header"
と"body"
のコンテンツを指定して、複数の行と列のHTMLコンテンツを挿入します。個々のHTML要素にもスタイルを適用できます。
名前付きスロットは、コンポーネントの直接の子要素である必要があります。ネストされた要素を通して名前付きスロットを渡すことはできません。
名前付きスロットは、UIフレームワークコンポーネントに渡すこともできます!
Astroのスロット名は、map関数の中などで動的には生成できません。UIフレームワークコンポーネントの内部でこの機能が必要な場合は、フレームワーク側で動的なスロットを生成しておくのがベストです。
スロットのフォールバックコンテンツ
セクションタイトル: スロットのフォールバックコンテンツスロットは、フォールバックコンテンツのレンダリングもできます。スロットに渡される子要素がない場合、 <slot />
要素はプレースホルダーの子要素をレンダリングします。
フォールバックコンテンツは、slot=“name”属性を持つ対応する要素が名前付きスロットに渡されていない場合にのみ表示されます。
スロット要素は存在するが渡すコンテンツがない場合、Astroは空のスロットを渡します。空のスロットが渡された場合、フォールバックコンテンツをデフォルトとしては使用できません。フォールバックコンテンツは、スロット要素が見つからない場合にのみ表示されます。
スロットの受け渡し
セクションタイトル: スロットの受け渡しスロットは他のコンポーネントに渡すことができます。たとえば、以下のネストされたレイアウトを作成する場合について考えます。
名前付きスロットは、<slot />
タグのname
とslot
属性を使って、他のコンポーネントに渡すことができます。
これで、HomeLayout
に渡されたデフォルトのスロットとhead
スロットは、BaseLayout
の親へと渡されます。
HTMLコンポーネント
セクションタイトル: HTMLコンポーネントAstroは.html
ファイルをコンポーネントとしてインポートして使用したり、これらのファイルをページとしてsrc/pages/
のサブディレクトリに設置することをサポートしています。フレームワークなしで構築された既存のサイトからコードを再利用したい場合や、コンポーネントに動的な機能が確実に入らないようにしたい場合はHTMLコンポーネントを利用するといいでしょう。
HTMLコンポーネントは有効なHTMLしか含むことができず、そのためAstroコンポーネントの主要機能が制限されます。
- フロントマターやサーバーサイドのインポート、動的な記法をサポートしません
- すべての
<script>
タグはバンドルされずに残され、is:inline
を持つ場合と同じように扱われます。 public/
フォルダにあるアセットのみを参照できます。
HTMLコンポーネント内の<slot />
要素はAstroコンポーネントと同様に機能します。HTML Web ComponentのSlot要素を使うためには, <slot>
要素にis:inline
を追加します。