Astro x MicroCMSを使ったら爆速でブログができた

:::note info
この記事は[TLB Enjoy Developers Advent Calendar 2022](https://qiita.com/advent-calendar/2022/tlb-enjoy) 19日目の記事です。
:::

こんにちは！このカレンダーでは2度目の登場のゆっきーです！

さて、あることがきっかけで昨日(12/18)からAstro x MicroCMSでブログ作成を始めてみました！
そして、僅か2日で最低限の機能が実装できたので一旦AstroとMicroCMSの紹介も兼ねて先んじて色々公開しちゃおう！ということで、AstroとMicroCMSの紹介をメインに記事を書いてみることにしました。

これからササっと自作ブログを作ってみたい人やAstro触ってみたい人の参考になれば幸いです、、！

# 対象読者

- ササっと自作ブログを作ってみたい人
- Astro製のWebページを軽く触ってみたい人
- Astroに興味がある人
- MicroCMSに興味がある人


# デプロイしたブログ

デプロイしたブログはこちらです。12/19時点では記事ページと記事一覧ページがあります。


:::note warn
~~独自ドメインの反映が済んでいないため、一旦プレビュー版のURLを貼っています。更新が済んだらささっと差し替えます、、:sob:~~
:::

(12/22 追記) 独自ドメインを反映しました！

https://yukky-sandbox.dev/

技術構成としては、ブログのUIにAstro、バックエンドにMicroCMS、デプロイにはCloudflare Pagesを使用したJAM Stackになっています。

記事ページのUIには`tailwindcss`の`typography`プラグインを使用しており、そのおかげでほとんど何もせず超楽に実装できています！

https://tailwindcss.com/docs/typography-plugin

具体的には、記事の親要素である`section`タグに↓こんな感じにクラスを当てるだけで

```html
<section
      class="prose dark:prose-invert md:prose-h1:text-4xl prose-h1:text-2xl md:prose-h2:text-3xl prose-h2:text-xl prose-h1:border-b-yellow-700 prose-h1:border-b-2 prose-h1:font-semibold prose-h2:border-l-8 prose-h2:border-l-orange-500 prose-h2:pl-2 prose-p:text-lg font-sans py-10"
>
```

自動でこんな感じの見た目がレンダリングされます。

![スクリーンショット 2022-12-20 0.11.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091686/a0233e2f-cea5-5146-1f22-d86b921a1755.png)

めっちゃ便利ですね！！

なお、ブログのUI全体のソースコードはこちらです。

https://github.com/Yoshino-Yukitaro/yukky-sandbox

ここからは、タイトルにもある`Astro`と`MicroCMS`の紹介をしていきます！

# Astroって？

Astro.jsは、MPAの静的サイトをレンダーするJavaScriptのフレームワークです。
AstroはJSXのような形式で書ける`.astroファイル`を使ってレンダリングできるのですが、従来のフレームワークとの大きな違いとして、**`.astro`に縛られない**といった特徴があります。
具体的には、ReactやVueといった特定のライブラリに依存せず、**React, Vue, Markdown, SolidJSといった様々なライブラリ・ファイルをサポートしているのです**！

そんなAstroの特徴をもう少し見ていきましょう！

## Astro Island

Astro Islandsは静的なHTML上のインタラクティブなUIコンポーネントのことです。
AstroではHTML上のインタラクティブなUIコンポーネントを島に見立てて「Astro Island」と呼んでいます。インタラクティブでないHTML(海)の上にインタラクティブなAstro Island(島)が浮かんでいる、というイメージのようです。
Astro Islandは一つのページに複数存在することが可能です。

![スクリーンショット 2022-12-20 0.32.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091686/a56d277d-53d9-6535-3e04-700f97af2557.png)
Astro Islandのイメージ([Astroのドキュメント](https://docs.astro.build/en/concepts/islands/)より)

Astroでは、それぞれのAstro Islandを`React`や`Vue`といったUIフレームワークを用いいてレンダリングすることが可能です。つまり、**使い慣れた技術を使ってコンポーネントを作れたり、既存のフレームワークから容易に移行したり**できるのです！

さらに、**レンダリングの過程で不要と判断されたJavaScriptは削除されます**。それによって、ページの読み込み時間を大幅に減らすことができるのです！


## 大体どこでもデプロイできる

Astroは、静的サイト出力（SSG）とサーバーサイドレンダリング（SSR）の両方をサポートしています。どのような構築を選択しても、Astroの柔軟なアダプターシステムにより、デプロイのセットアップと構成が簡単になります！
また、デプロイ先ごとに詳しいドキュメントが存在するため、デプロイ時に悩むことはほとんどないと思います！

筆者はこちらのページを参照しながらCloudflare Pagesにデプロイしましたが、何も悩むことなく超楽にデプロイできました！

https://docs.astro.build/ja/guides/deploy/cloudflare/

## ほぼJSXな`.astro`ファイル

Astroでは`.astro`ファイルを中心にコンポーネントやページを書いていくのですが、この文法がほぼJSXなため、**JSXがわかる人はほとんど学習コスト0で描き始めることができます！**

例えば、自分の記事ページの実装はこんな感じです。

```jsx:[postId].astro
---
import PostLayout from "../../layouts/PostLayout.astro";
import { getPostDetail, getPosts } from "../../library/postFetcher";

export async function getStaticPaths() {
  const response = await getPosts({ fields: ["id"] });
  return response.contents.map((content: any) => ({
    params: {
      postId: content.id,
    },
  }));
}

const { postId } = Astro.params;
const post = await getPostDetail(postId as string);
---

<PostLayout
  title={post.title}
  createdAt={post.createdAt}
  description={post.description}
>
  <div set:html={post.content} />
</PostLayout>
```
**ほとんどJSXですよね！**
このおかげで筆者もほとんど学習せずにブログ作成を始めることができました！

# MicroCMSって？

microCMSはAPIベースの**日本製ヘッドレスCMS**です！
Wordpressのような一般的なCMSと違って管理画面とAPIだけを提供しているため、今回のように外部向けのインターフェースは自作したい、といったときなどに使えます！

https://microcms.io/

こちらももう少し特徴を見ていきましょう！

## カスタマイズ可能な管理画面

管理画面はこんな感じになってます！

![スクリーンショット 2022-12-19 21.58.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091686/5a812e62-c3b9-7c87-b352-b4722940d4c3.png)

このリッチなエディタに直接書き込んでいくことで、APIで提供したい内容を記述することができます！

ちなみにAPIから取得できる情報はこんな感じです

```json
{
    "id": "ajk76u1v6umk",
    "createdAt": "2022-12-19T12:53:37.460Z",
    "updatedAt": "2022-12-19T13:26:43.019Z",
    "publishedAt": "2022-12-19T12:53:37.460Z",
    "revisedAt": "2022-12-19T13:26:43.019Z",
    "title": "（サンプル）まずはこの記事を開きましょう",
    "content": "<h2 id=\"hdb41525ba7\">ブログテンプレートから作成されました🎉</h2><p>ブログテンプレートからAPIを作成しました。<br>おつかれさまでした🎉<br></p><h2 id=\"hf45076424a\">APIプレビューを試そう🚀</h2><p>最初に「APIプレビュー」をしてみましょう。<br>入稿したコンテンツはAPI経由で取得し、Viewに繋ぎ込みます。<br>APIプレビューでは実際のAPIレスポンスを確認でき、あなたの開発を加速させます。<br><br>👇まずはここをクリックします。<br><img src=\"https://images.microcms-assets.io/assets/f26a8cecd1784f58806fc7439dab1edb/39cea4a8ae7d4440a695184f0b96cbff/blog-template-description1.png\" alt=\"\"><br><br>APIプレビュー画面が開いたら、<strong>「取得」</strong>ボタンでリクエストを試してみましょう。<br><img src=\"https://images.microcms-assets.io/assets/f26a8cecd1784f58806fc7439dab1edb/43d882b202424e93b830a8c65b6cd2bf/blog-template-description2.png\" alt=\"\"><br><br>この記事の内容がAPIで取得できていることがわかります。<br><img src=\"https://images.microcms-assets.io/assets/f26a8cecd1784f58806fc7439dab1edb/a8b2c39f381c4fa9b8a599582d62ddd4/blog-template-description3.png\" alt=\"\"></p><h2 id=\"h88398f2fb7\"><br>次にやること🏃</h2><p>APIプレビューで確認したレスポンスを参考に、あなた自身のWebサイトを構築しましょう。<br>microCMSはAPIでコンテンツを取得するため、お好きな言語・フレームワークで画面を構築できます。<br></p><ul><li><a href=\"https://document.microcms.io/tutorial/javascript/javascript-top\" target=\"_blank\" rel=\"noopener noreferrer\">JavaScript SDK</a></li><li><a href=\"https://document.microcms.io/tutorial/nuxt/nuxt-top\" target=\"_blank\" rel=\"noopener noreferrer\">Nuxt SDK</a></li><li><a href=\"https://document.microcms.io/tutorial/gatsby/gatsby-top\" target=\"_blank\" rel=\"noopener noreferrer\">Gatsby SDK</a></li></ul><p><br>その他に<a href=\"https://microcms.io/features/sdk\" target=\"_blank\" rel=\"noopener noreferrer\">サーバーサイドSDK（PHP / Go / Ruby）やモバイルSDK（iOS / Android）</a>もございます。<br><br>お困りなことや疑問点などございましたらお気軽にご連絡ください。<br><br>サポート窓口：<a href=\"mailto:support@microcms.io\" target=\"_blank\" rel=\"noopener noreferrer\">support@microcms.io</a><br>よくある質問：<a href=\"https://help.microcms.io/ja/knowledge\" target=\"_blank\" rel=\"noopener noreferrer\">https://help.microcms.io/ja/knowledge</a></p>",
    "eyecatch": {
        "url": "https://images.microcms-assets.io/assets/f26a8cecd1784f58806fc7439dab1edb/580b033b35bf4e7abe7c323dcc4615a3/blog-template.png",
        "height": 630,
        "width": 1200
    },
    "category": {
        "id": "r-ey8qn2-vt",
        "createdAt": "2022-12-19T12:53:35.871Z",
        "updatedAt": "2022-12-19T12:53:35.871Z",
        "publishedAt": "2022-12-19T12:53:35.871Z",
        "revisedAt": "2022-12-19T12:53:35.871Z",
        "name": "更新情報"
    }
}
```

ちなみに画像の管理画面は**ワンクリックで作れました**。
以下の「ブログ」をクリックすると、先ほどのような管理画面が**一瞬で**作れます！

![スクリーンショット 2022-12-19 21.53.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091686/30171334-6aab-aff6-3735-36f07a724dc4.png)

もちろんカスタマイズも容易で、画面上部の「カスタムフィールド」から「名前」や「レイアウト」などのわずかな項目を設定するだけで追加の項目を作成することができます！

![スクリーンショット 2022-12-19 22.22.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1091686/6f8c9a3c-c906-06a9-4775-e0527ebe9268.png)

便利すぎますね、、！

## 公式のSDKが提供されている

公式のSDKと実装例が豊富なため、**提供されたAPIの使い方に悩むことはほぼないです**。
こんなきの実装も、自分は以下の記事を参考に**全くハマることなく実装することができました**！

https://blog.microcms.io/astro-microcms-introduction/

## ほぼタダ
これだけ便利なmicroCMSですが、Hobbyプランなら**なんとタダです**。しかもAPIの呼び出し回数が無制限、、:innocent:
個人でこれだけのものを実装するとなると、DB代が高くなったり、パフォーマンスや可用性に問題のある構成になったりするので、この料金設定は本当にありがたいです、、、:sob:

https://microcms.io/pricing

# まとめ

今回はAstroとMicroCMSでブログを作って公開したときに感じたことなどをまとめてみました！
AstroもMicroCMSも本当に便利なので、機会があったらぜひ触っていただきたいです、、！

明日(？)は@loremipsumさんの記事です！お楽しみに！！

# 参考文献

https://qiita.com/tronicboy/items/4c10f98a60d4c4f0044c

https://astro.build/

https://tailwindcss.com/docs/typography-plugin

https://zenn.dev/datchlive/articles/50e556d27d68b4

https://microcms.io/