【SSG】なぜAstroは素晴らしいのか

Astroというフレームワークをご存知でしょうか。

https://astro.build/

昨年リリースされた比較的新しいフレームワークで、静的サイト生成を行うためのフレームワークです。
従来は静的サイト生成を行うためには、`EJS`や`Pug`といったテンプレートエンジンを利用するか、Next.jsやNuxtのようなフルスタックフレームワークのSSGモードを利用する選択肢が一般的でした。

Astroはフルスタックフレームワークよりも少ない学習コストで直感的に使えつつも、従来のテンプレートエンジンに比べ豊かな表現力を持ちつつ、アプリケーション開発に近い書き味でWebサイト制作を行える素晴らしいフレームワークだと感じたので採用するメリットなどをまとめてみようと思います。

## Astroのメリット

- 各種コンポーネントライブラリに対応
    - [React](https://reactjs.org/)
    - [Preact](https://preactjs.com/)
    - [Svelte](https://svelte.dev/)
    - [Vue](https://vuejs.org/)
    - [SolidJS](solidjs.com)
    - [AlpineJS](https://alpinejs.dev/)
    - [Lit](https://lit.dev/)
- デフォルトでTypeScript対応
- [インテグレーション（プラグイン機能）](https://astro.build/integrations/featured/)が豊富
- アイランドアーキテクチャを採用しており高速

また、これはフレームワーク自体のメリットからは外れますがドキュメントページの大半が日本語化されており非常に情報を探しやすい状態になっているのもおすすめポイントの一つです。

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

## アイランドアーキテクチャとはなにか

https://docs.astro.build/ja/concepts/islands/

公式ドキュメントがすでに日本語化されており、読みやすいので興味のある方はこちらを読んでいただきたいです。

アイランドアーキテクチャはReactなどで作られたSPAの仕組みなどを踏まえた上でないと、なかなか利点や特徴などが掴みづらいと思います。
特にハイドレーションなどは静的なHTMLでサイトを制作する際は気にする機会も少ないため、テンプレートエンジンからの移行を考えているエンジニアにとっては最低限のJSだけがロードされるようにしてパフォーマンスを上げるための手法（もしくは考え方）、ぐらいの認識でもいいのかと思っています。

アプリケーション領域からアイランドアーキテクチャをより知りたいという方は[こちらの記事](https://zenn.dev/morinokami/articles/islands-architecture-with-astro#astro-%E3%81%A8-islands-architecture)が非常に詳しく解説されていたので掲載させていただきます。

https://zenn.dev/morinokami/articles/islands-architecture-with-astro#astro-%E3%81%A8-islands-architectur

## インテグレーション機能について

Astroではインテグレーション機能と呼ばれているプラグイン機能が提供されています。
Next.jsやNuxtなどでは普及している機能ですが、Astroも同じような機能を揃えています。

https://docs.astro.build/ja/guides/integrations-guide/

様々なインテグレーションが用意されていますが、`React`などのUIフレームワークを使用する場合などは追加でインテグレーションをインストールする必要があります。
下記は`@astro/react`をインストールした際のコンソールのログですが、単純に依存パッケージを追加するだけでなく設定ファイルの書き換えも自動的に行なってくれるためパッケージ追加したはいいが設定方法を調べるのに結果的に時間がかかってしまう、ということがないのもありがたいポイントです。

![astro add astro/react 実行後のログ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397258/95a0c866-320f-5b81-6e2b-206a727f5689.png)

記事執筆時点では、[`@astro/image`](https://docs.astro.build/ja/guides/integrations-guide/image/)や[`@astro/sitemap`](https://docs.astro.build/ja/guides/integrations-guide/sitemap/)や[`@astro/mdx`](https://docs.astro.build/ja/guides/integrations-guide/mdx/)などのWebサイトの制作時に欲しい機能などは公式インテグレーションとして配布されています。

https://astro.build/integrations/


## テンプレートエンジンとの比較

テンプレートエンジンを主体とした静的サイト生成フレームワークで有名なものとしてはEleventyなどが挙げられると思います。
こちらもリリースされたのは最近で、`EJS`や`Pug`などのテンプレートエンジンを利用しつつ様々なプラグインなどを利用しながら開発が行なえます。

https://www.11ty.dev/

従来からテンプレートエンジンを使用している組織においては書き慣れた記述で、より開発を効率化するという観点ではテンプレートエンジンを利用したフレームワークは非常に便利です。
しかし、普段ReactやVueを利用しているエンジニアからすると、スタイルのカプセル化や`slot`の使用など利用したい機能がうまく使えないなど機能不足に感じる部分もあったり、UIは`JSX`で記述したいという要望も多いと思います。

一方でAstroは最近のコンポーネント指向のライブラリ（React・Vue・Svelte)を使ったり、独自のAstroコンポーネントという書き方なども利用できるため、とりあえずAstroコンポーネントで開発を始めてみてReactやVueを書ける人が増えてきたら`JSX`や`Vue SFC`形式のコンポーネントでも書いてみるといった非常に柔軟な選択ができるようになります。

## フルスタックフレームワークとの比較

単純にReactやVueを使用しつつ静的サイト生成を行いたい場合は、Next.jsのようなフルスタックフレームワークを利用することが多いかと思います。
しかしながらフルスタックフレームワークははじめにコンポーネントを作るためにReactやVueの学習をして、その後にフレームワークの知識をつけていく必要があり学習コストが高い傾向にあります。
フルスタックフレームワークはSSRを基本としてSSGの機能も揃えていることが多いですが、Astroは静的サイト生成にのみ特化しているため機能がシンプルで学習コストを低く抑えつつ様々なUIの書き方（`JSX`・`Vue SFC`など）を学ぶことができます。

## 使いづらい箇所

使いづらい箇所はそこまでありませんが、強いて挙げるとすればやはりSSG専用のフレームワークであるため後からSSRをする必要が出てきた場合はかなり辛いことになるかと思いますがそのような技術選定ミスは他のフレームワークでも辛さは変わらないと思います。

また、ハイドレーションのタイミングを指定する場合に`client:*`などの固有のディレクティブを使用する必要があるため、少し従来のフレームワークとは違う考え方をしながらコードを書く必要があるかもしれませんがこれについてもそこまで辛いものではないと感じます。

https://docs.astro.build/ja/core-concepts/framework-components/

ただ、個人的にはAstroコンポーネントは若干癖が強いように感じたためチームで使う場合は`JSX`（React）を第一選択にしておいたほうがよいと考えます。

:::note warn
イベントリスナーの付与が`querySelectorAll`で要素を取得して`addEventListener`で定義する方法しかない（関数を属性値に渡せない）点や、コンポーネントが複数回読み込まれることを前提として単一の要素であっても`querySelectorAll`で取得して、`forEach`などで配列として扱うようにコードを書いていかない点などにクセがある気がします。
:::


## 使用してみた感想

単純に使用してみた感想ですが、必要十分という言葉がふさわしいフレームワークだと感じました。
必要なものは一式揃っているが無駄が少ないため実際に動かすための学習コストは高くなく、やりたいことが決まっている人にとっては素晴らしいフレームワークだと思います。
静的サイト生成を行うための仕組みだけを提供して、UIの記述は既存の仕組み（`JSX`や`Vue SFC`）を取り込むことで、この技術がなんのための技術なのかという点が明確なのも個人的に好きなポイントです。

私自身もそうだったのですが、普段Webサイトをテンプレートエンジンで作っているフロントエンドエンジニアがアプリケーション開発をしようとした場合、コンポーネントに対しての捉え方であったり、Reactの書き方やTypeScriptの学習など覚えることが一気に増えてしまいます。
Astroを利用することでアプリケーション開発に近い文脈でWebサイトの開発を行うことができ普段の業務の中でアプリケーション開発に必要な感覚を養うことができるのではないかと感じました。