HTMLだけで作ると何が困る?
<!-- page1.html -->
<!DOCTYPE html>
<html>
<head>
<title>ページ1</title>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<header>
<nav>
<a href="/">ホーム</a>
<a href="/about">プロフィール</a>
<a href="/blog">ブログ</a>
</nav>
</header>
<main>
<!-- ここだけ違う -->
<h1>ページ1の内容</h1>
</main>
<footer>
<p>© 2025 ねつき</p>
</footer>
</body>
</html>
Astroなら「コンポーネント」で解決♪
---
// src/components/Header.astro
---
<header>
<nav>
<a href="/">ホーム</a>
<a href="/about">プロフィール</a>
<a href="/blog">ブログ</a>
</nav>
</header>
---
// src/components/Footer.astro
---
<footer>
<p>© 2025 ねつき</p>
</footer>
---
// src/pages/page1.astro
import Header from '../components/Header.astro';
import Footer from '../components/Footer.astro';
---
<!doctype html>
<html>
<head>
<title>ページ1</title>
</head>
<body>
<Header />
<main>
<h1>ページ1の内容</h1>
</main>
<Footer />
</body>
</html>
レイアウトでさらにスッキリ♪
---
// src/layouts/BaseLayout.astro
import Header from '../components/Header.astro';
import Footer from '../components/Footer.astro';
const { title } = Astro.props;
---
<!doctype html>
<html>
<head>
<title>{title}</title>
<link rel="stylesheet" href="/style.css" />
</head>
<body>
<Header />
<main>
<slot />
<!-- ここに各ページの中身が入る -->
</main>
<Footer />
</body>
</html>
---
// src/pages/page1.astro
import BaseLayout from '../layouts/BaseLayout.astro';
---
<BaseLayout title="ページ1">
<h1>ページ1の内容</h1>
<p>ここに本文を書くだけ!</p>
</BaseLayout>
Markdownでブログが書ける♪
---
title: 今日の日記
date: 2025-12-08
---
## 朝ごはん
今日は**お稀荷さん**を食べたよ!
- 油揚げがジューシー
- 酢飯が絶妙
- 3個ペロリ
おいしかった〜♪
ビルドすると普通のHTMLになる
npm run build
JavaScriptは必要なときだけ
---
import Counter from '../components/Counter.jsx';
---
<!-- これは静的HTML(JSなし) -->
<Counter />
<!-- これはインタラクティブ(JS送る) -->
<Counter client:load />