コンポーネント
Astroコンポーネントは、あらゆるAstroプロジェクトの基本的な構成要素です。クライアントサイドのランタイムを持たない、HTMLのみのテンプレートコンポーネントです。Astroコンポーネントは、.astro
という拡張子により判別できます。
Astroコンポーネントは非常に柔軟です。多くの場合、Astroコンポーネントは、ヘッダーやプロフィールカードのような、ページ上で再利用可能なUIを含むことになります。また、Astroコンポーネントには、SEO対策を容易にする共通の<meta>
タグのコレクションのような、小さなHTMLのスニペットが含まれることもあります。Astroコンポーネントは、ページ全体のレイアウトを含められます。
Astroコンポーネントについて知っておくべきもっとも重要なことは、クライアント上でレンダリングされないということです。コンポーネントはビルド時またはサーバーサイドレンダリング(SSR)によりオンデマンドにレンダリングされます。コンポーネントのフロントマターの内部に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ディレクティブ (EN)もサポートしています。コンポーネントスクリプトで定義されたデータと値をコンポーネントテンプレートで使用することで、動的に作成されたHTMLを生成できます。
コンポーネントベースの設計
コンポーネントは、再利用可能であり、他と組み合わせられるよう設計されます。コンポーネントの中に他のコンポーネントを使って、より高度なUIを構築できます。たとえば、Button
コンポーネントを使ってButtonGroup
コンポーネントを作成できます。
コンポーネントのprops
Astroコンポーネントは、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" />
にマッチするプレースホルダに渡します。
名前付きスロットは、UIフレームワークコンポーネントに渡すこともできます!
スロットのフォールバックコンテンツ
スロットは、フォールバックコンテンツをレンダリングすることもできます。スロットに渡される子要素がない場合、 <slot />
要素はそれ自身のプレースホルダーの子要素をレンダリングします。
HTMLコンポーネント
Astroは.html
ファイルをコンポーネントとしてインポートして使用したり、これらのファイルをページとしてsrc/pages/
のサブディレクトリに設置することをサポートしています。フレームワークなしで構築された既存のサイトからコードを再利用したい場合や、コンポーネントに動的な機能が確実に入らないようにしたい場合はHTMLコンポーネントを利用するといいでしょう。
HTMLコンポーネントは有効なHTMLしか含むことができず、そのためAstroコンポーネントの主要機能が制限されます。
- フロントマターやサーバーサイドのインポート、動的な記法をサポートしません
- すべての
<script>
タグはバンドルされずに残され、is:inline
を持つ場合と同じように扱われます。 public/
フォルダにあるアセットのみを参照できます。
HTMLコンポーネント内の<slot />
要素はAstroコンポーネントと同様に機能します。HTML Web ComponentのSlot要素を使うためには, <slot>
要素にis:inline
を追加します。
次のステップ
📚 AstroプロジェクトでのUIフレームワークコンポーネントの使用方法について学びます。
Learn