【Astro】静的サイトの作成に必要最低限な要素だけを確認してみる
はじめに
フロントのモダンフレームワーク・Astro を用いて静的サイトをサクッと作ってみましょう。
API 連携等はせず、簡易的な静的サイトを作るという点だけにフォーカスして、必要最低限の要素を確認してみたいと思います。
インストールとセットアップ
まずは新しいプロジェクトを開始しましょう。以下のコマンドをターミナルで実行します。
npm create astro@latest
プロジェクト名や npm の依存関係インストールについてなど、いくつかの質問への回答が済んだら、無事にプロジェクト作成完了です。
以下のコマンドで開発サーバーを起動しましょう
npm run dev
特にエラーがなければ、http://localhost:4321/でサイトを閲覧できるようになっているはずです。
新規ページの作成
src/pages/ディレクトリがページファイルの格納場所になります。ここに astro ファイルを作成していくことで、自動でルーティングが設定されます。(.astro以外にも、いくつかサポートされているファイルタイプがあります。今回は.astroで統一します。)
src/pages/index.astroがトップページとなるので、例えば同じ要領でsrc/pages/about/index.astroを作成してみましょう。http://localhost:4321/aboutでページが閲覧できるようになっていると思います。
これで、任意のディレクトリに新規ページを作成することができるようになりました。
コンポーネント
Astro では、再利用可能な UI パーツをコンポーネントとして作成できます。top ページと about ページを行き来できるように、ナビゲーションコンポーネントを作成して全ページ共通パーツとして配置してみましょう。
src/components内にHeader.astroを作成し、以下のようにリンクを配置します。
<header>
<nav>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/about">About</a></li>
</ul>
</nav>
</header>
ヘッダーやナビゲーションバー、フッターなど、全ページ共通の UI を読み込ませるにはlayouts/Layout.astroを利用します。Layout は、複数のページで共通の HTML 構造を定義するための仕組みです。layouts/Layout.astroに、以下のような記述を追加します。
---
import Header from '../components/Header.astro';
const title = Astro.props;
---
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="generator" content={Astro.generator} />
<title>{title}</title>
</head>
<body>
<Header />
<main>
<slot />
</main>
</body>
</html>
Headerコンポーネントを import して、body内の任意の位置で呼び出します。mainタグ内のslotには、各ページ固有のコンテンツが代入される形になります。
Layout.astroの設定が完了し、全ページ共通のレイアウトを用意できました。あとは、各ページで読み込んで反映させましょう。
---
import Layout from '../layouts/Layout.astro';
---
<Layout title="Home">
<p>top</p>
</Layout>
---
import Layout from '../layouts/Layout.astro';
---
<Layout title="About">
<p>about</p>
</Layout>
コードフェンス内でLayout.astroを import し、<Layout></Layout>で呼び出します。Layoutタグ内に記述した内容が、先述した<slot>の内容として代入される、と言う形になります。
props の仕組みについて
props(プロパティ)は、コンポーネント間でデータを渡すための仕組みです。今回の例では、Layout に props を渡すことで、ページタイトルを動的に設定しています。
Layout.astro での受け取り方
---
const title = Astro.props;
---
<title>{title}</title>
各ページでの渡し方
<Layout title="Home">
<p>topページのコンテンツ</p>
</Layout>
<Layout title="About">
<p>aboutページのコンテンツ</p>
</Layout>
動作の流れ
- ページファイルで
<Layout title="Home">のように props を渡す - Layout コンポーネント内で
Astro.props.titleとして受け取る -
{title}の部分に "Home" や "About" が代入される - 結果として、各ページに適切なタイトルが設定される
この仕組みにより、同じ Layout コンポーネントを使いながら、ページごとに異なるタイトルを設定できます。
ページ遷移アニメーション
ここまでの要素でも静的サイトの作成は充分可能なのですが、少しリッチな演出としてページ遷移アニメーションを足してあげましょう。
実装自体はかなり簡単で、<ClientRouter />ルーティングコンポーネントをインポートし、<head>内に追加するだけで OK です。
---
import Header from '../components/Header.astro';
import { ClientRouter } from 'astro:transitions';
const title = Astro.props;
---
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="generator" content={Astro.generator} />
<title>{title}</title>
<ClientRouter />
</head>
<body>
<Header />
<main>
<slot />
</main>
</body>
</html>
まとめ
この記事では、Astro を使った静的サイト作成の基本要素を確認しました。
-
プロジェクトのセットアップ:
npm create astro@latestでプロジェクト作成 -
ページ作成:
src/pages/ディレクトリにファイルを配置して自動ルーティング - コンポーネント: 再利用可能な UI パーツの作成
- レイアウト: 全ページ共通の HTML 構造の定義
- ページ遷移アニメーション: リッチな演出の追加
静的サイト開発に必要な最低限の機能について見てきました。もちろんさらに便利な機能が多くありますので、次のステップとして公式ドキュメントを参照してみてください。
Discussion