Web Framework「Astro」を触ってみた

Feb 12, 2023 15:10 · 2267 words · 5 minute read JavaScript Node.js Docker

UIT INSIDEやmozaic.fmで話題にあがっていたAstroを試してみました。
なかなか良さそうだったので、今後のためにメモを残しておきます。

目次

まずは動かしてみる

公式ドキュメントを参照しながら、Dockerでサクッと動かしてみます。

Getting Started 🚀 Astro Documentation

finch container run -it --name astro-sample --rm --publish 3000:3000  --mount type=bind,source="$(pwd)"/src/,target=/mnt node:18-bullseye-slim bash

Astroをインストール&プロジェクトの新規作成。
Houstonが可愛いですね。

npm create astro@latest
Need to install the following packages:
  create-astro@3.0.0
Ok to proceed? (y) 

╭─────╮  Houston:
│ ◠ ◡ ◠  Let's build something awesome!
╰─────╯

 astro   v2.0.10 Launch sequence initiated.

   dir   Where should we create your new project?
         ./

  tmpl   How would you like to start your new project?
         Include sample files
      ✔  Template copied

  deps   Install dependencies?
         Yes
      ✔  Dependencies installed

   git   Initialize a new git repository?
         Yes
      ✔  Git initialized

    ts   Do you plan to write TypeScript?
         Yes

   use   How strict should TypeScript be?
         Strict
      ✔  TypeScript customized

  next   Liftoff confirmed. Explore your project!
         Run npm run dev to start the dev server. CTRL+C to stop.
         Add frameworks like react or tailwind using astro add.

         Stuck? Join us at https://astro.build/chat

╭─────╮  Houston:
│ ◠ ◡ ◠  Good luck out there, astronaut! 🚀
╰─────╯

出来上がったプロジェクトのフォルダ構成はこんな感じ。

tree -L 2 .
.
|-- README.md
|-- astro.config.mjs
|-- node_modules
|   |-- @ampproject
|   |-- @astrojs
|   |-- @babel
(中略)
|   `-- zwitch
|-- package-lock.json
|-- package.json
|-- public
|   `-- favicon.svg
|-- src
|   |-- components
|   |-- env.d.ts
|   |-- layouts
|   `-- pages
`-- tsconfig.json
tree -L 2 ./src/
./src/
|-- components
|   `-- Card.astro
|-- env.d.ts
|-- layouts
|   `-- Layout.astro
`-- pages
    `-- index.astro

3 directories, 4 files

初期状態のconfigは非常にシンプル。

cat astro.config.mjs 
import { defineConfig } from 'astro/config';

// https://astro.build/config
export default defineConfig({});

公式ドキュメントに例が書いてあるので、つまらず設定変更できそうです。

Configuration Reference 🚀 Astro Documentation

起動

npm run dev -- --host 0.0.0.0

http://localhost:3000/ 」にアクセスすると、起動が確認できました。

index.astroとCard.astroの内容がこちら。パッと見で大体内容がわかり、とっつきやすそうです。

---
import Layout from '../layouts/Layout.astro';
import Card from '../components/Card.astro';
---

<Layout title="Welcome to Astro.">
	<main>
		<h1>Welcome to <span class="text-gradient">Astro</span></h1>
		<p class="instructions">
			To get started, open the directory <code>src/pages</code> in your project.<br />
			<strong>Code Challenge:</strong> Tweak the "Welcome to Astro" message above.
		</p>
		<ul role="list" class="link-card-grid">
			<Card
				href="https://docs.astro.build/"
				title="Documentation"
				body="Learn how Astro works and explore the official API docs."
			/>
			<Card
				href="https://astro.build/integrations/"
				title="Integrations"
				body="Supercharge your project with new frameworks and libraries."
			/>
			<Card
				href="https://astro.build/themes/"
				title="Themes"
				body="Explore a galaxy of community-built starter themes."
			/>
			<Card
				href="https://astro.build/chat/"
				title="Community"
				body="Come say hi to our amazing Discord community. ❤️"
			/>
		</ul>
	</main>
</Layout>

<style>
	main {
		margin: auto;
		padding: 1.5rem;
		max-width: 60ch;
	}
	h1 {
		font-size: 3rem;
		font-weight: 800;
		margin: 0;
	}
	.text-gradient {
		background-image: var(--accent-gradient);
		-webkit-background-clip: text;
		-webkit-text-fill-color: transparent;
		background-size: 400%;
		background-position: 0%;
	}
	.instructions {
		line-height: 1.6;
		margin: 1rem 0;
		border: 1px solid rgba(var(--accent), 25%);
		background-color: white;
		padding: 1rem;
		border-radius: 0.4rem;
	}
	.instructions code {
		font-size: 0.875em;
		font-weight: bold;
		background: rgba(var(--accent), 12%);
		color: rgb(var(--accent));
		border-radius: 4px;
		padding: 0.3em 0.45em;
	}
	.instructions strong {
		color: rgb(var(--accent));
	}
	.link-card-grid {
		display: grid;
		grid-template-columns: repeat(auto-fit, minmax(24ch, 1fr));
		gap: 1rem;
		padding: 0;
	}
</style>
---
export interface Props {
	title: string;
	body: string;
	href: string;
}

const { href, title, body } = Astro.props;
---

<li class="link-card">
	<a href={href}>
		<h2>
			{title}
			<span>&rarr;</span>
		</h2>
		<p>
			{body}
		</p>
	</a>
</li>
<style>
	.link-card {
		list-style: none;
		display: flex;
		padding: 0.25rem;
		background-color: white;
		background-image: none;
		background-size: 400%;
		border-radius: 0.6rem;
		background-position: 100%;
		transition: background-position 0.6s cubic-bezier(0.22, 1, 0.36, 1);
		box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1);
	}

	.link-card > a {
		width: 100%;
		text-decoration: none;
		line-height: 1.4;
		padding: 1rem 1.3rem;
		border-radius: 0.35rem;
		color: #111;
		background-color: white;
		opacity: 0.8;
	}
	h2 {
		margin: 0;
		font-size: 1.25rem;
		transition: color 0.6s cubic-bezier(0.22, 1, 0.36, 1);
	}
	p {
		margin-top: 0.5rem;
		margin-bottom: 0;
		color: #444;
	}
	.link-card:is(:hover, :focus-within) {
		background-position: 0;
		background-image: var(--accent-gradient);
	}
	.link-card:is(:hover, :focus-within) h2 {
		color: rgb(var(--accent));
	}
</style>

ブログテンプレートも動かしてみる

プロジェクト作成時の選択肢に「Use blog template」があったので、そちらも試してみます。

ブログテンプレートを起動した様子がこちら。シンプルながら必要な要素がまとまっている印象です。ここに手を加えたらオリジナルのブログも簡単に作れそうですね。

configの内容が少し変わっていて、sitemapやmdxの機能が追加されていました。 インテグレーションを追加することで、Lazy Loadなども追加できます。

インテグレーションを使う 🚀 Astroドキュメント

cat astro.config.mjs 
import { defineConfig } from 'astro/config';
import mdx from '@astrojs/mdx';

import sitemap from '@astrojs/sitemap';

// https://astro.build/config
export default defineConfig({
	site: 'https://example.com',
	integrations: [mdx(), sitemap()],
});

公式ドキュメントの気になった箇所

公式ドキュメントをパラパラと見た中で、気になった内容のメモ書きです。

インテグレーションを使う 🚀 Astroドキュメント

  • 簡単にAstroに機能を追加できる

Astroサイトのデプロイ 🚀 Astroドキュメント

ページ 🚀 Astroドキュメント

  • /src/pages/以下にファイルを追加することでページの追加ができる
  • mdやjsが使える

ルーティング 🚀 Astroドキュメント

  • 動的ルーティングも可能
  • Pagination機能も標準装備

Themes | Astro

  • テーマが色々公開されている。目的に合わせて参考にできる

データフェッチ 🚀 Astroドキュメント

  • 外部CMSとの連携に使える

Build your first Astro Blog 🚀 Astro Documentation

  • ブログの作成から公開までのチュートリアル

Testing 🚀 Astro Documentation

  • Playwrightを使ったテストのサンプル

Next.jsとの比較

Astroを少し触って、「Next.jsと用途が重なっている部分がありそう」と感じたので、AstroとNext.jsを比較している記事をいくつか読みました。

Astro.js - Next.jsからWebアプリケーションを移行してみた感想 - Qiita

  • 認証やSSR周りで筆者の詰まった点が書いてあって参考になりました

AstroとReactアプリのNext.jsの比較 (morioh.com)

  • AstroとNext.jsを総括的に比較した記事

静的サイトジェネレーターを Next.js から Astro に乗り換えた 🧑‍🚀 | rakuishi.com

  • 速度比較がわかりやすかった

SSGとしてのAstroとNext.jsを比較してみた (zenn.dev)

  • 1000ページの静的サイトをビルドして比較

静的コンテンツ作成という面ではAstroが光る部分があり、SSRを使ったり多機能なアレコレを実装したい場合は、機能や事例の多いNext.jsに軍配が上がる、といった感じでしょうか。

最後に

各所で話題のAstroを触ってみました。静的なサイトを作るときに良い選択肢の1つになりそうですね。 今回はチュートリアルと事前調査だけでしたが、今後なにかお題を見つけて簡単なWebサイトを作ってみたいと思いました。

tweet Share