Astroの便利な機能まとめメモ

フレームワーク初心者の私が便利だなと思った機能たちをご紹介します。

データの受け渡し

Astro.propで、親コンポーネントからデータを渡すことができます。
例えばLayout.astroでデータを受け取るように指示します。

---
const { pageTitle, description } = Astro.props;
---
<head>
//省略
  <title>{pageTitle}</title>
  <meta name="description" content={description}>
</head>

その後、子ページでpageTitleやdescriptionを定義して渡します。

<BaseLayout pageTitle="各ページのタイトル" description="ディスクリプション">
//省略
</BaseLayout>

スロット機能

テンプレートに対して、特定の子要素を入れ込むことができます。
スロットに名前をつけることで、対応する場所にのみ渡すことができます。
また、<slot></slot>の中にあるコンテンツは、もし渡されるデータがない場合の代替になります。

src/layouts/Layout.astro
<header>
  <slot name="header">
    <h1>デフォルトヘッダー</h1>
  </slot>
</header>

<main>
  <slot /> <!-- デフォルトスロット(メインコンテンツ) -->
</main>
src/pages/index.astro
---
import Layout from '../layouts/Layout.astro';
---
<Layout>
  <header slot="header">
    <p>カスタムヘッダーです。デフォルトのヘッダーではなく、これが入ります。</p>
  </header>
  <p>これはメインコンテンツです。デフォルトスロットに入ります。Layout.astroに代替コンテンツがないため、このpタグがもしなければ何も表示されません。</p>
</Layout>

また、名前付きのスロットは他コンポーネントに渡すことも可能です。

画像の自動最適化

Astroのコンポーネントを利用すると、自動的にwebpに変換されます。
利用するにはImageコンポーネントと画像をインポートする必要があります。

---
import { Image } from 'astro:assets';
import sample from "../img/sample.png";
---
<Image src={sample} alt="srcとaltは必須です" />

画像は基本的に/srcディレクトリに配置する。
/publicディレクトリからも読み込み可能ですが、最適化は行われません。また、この場合/publicディレクトリに存在する画像に対して、Astroはwidthとheightを解析できないため、指定が必要です。
/srcディレクトリだと勝手にwidthとheightを入れてくれるので、CLSに対しても最適化されてかなり便利です。

CSSについて

astroファイル内で利用する<style>は自動的にスコープされ、その中でのみ適用されるので、コンポーネントごとの管理が楽です。逆に、is:globalを付与することでスコープを無効にすることも可能です。

また、langを指定するとscssで書くことができます。

<style lang="scss">
.box {
  margin: 0 auto;
  &:first-child {
    color: #222;
  }
  span {
    font-weight: bold;
  }
}
</style>

参考
https://docs.astro.build/ja/getting-started/