眠れないから眠くなるまで JAMStack なるものを勉強する

現在真夜中の2:41分である。
真夜中の本番化ですっかり目が覚めてしまったため、JAMStack なる技術について勉強しようと思う。
今日から新卒も入ってくるので、新卒にも読めるように優しく書きたいと思う

## JAMStack とはなんだ
JAM(JavaScript, API, MARKUP)の頭文字を取って付けられた Web サイトの構築方法。
従来のインターネットでは、サーバーとやりとりをしてデータを構築していくのだが、JAMStackでは事前にサーバーからデータを取得したうえでまとめ、HTMLやCSSといった静的ファイルと一緒にブラウザに渡すようになっている。
それの何が優れているのかというと、サーバーサイドとのやりとりが初回のリクエストで済むことだ。
何度もサーバーと通信すればそれだけ遅くなる。通信が遅いとユーザーの満足度が下がり離脱率が上がる。平均的なユーザーは3秒まって開かないページからは離脱するという話を聞いたことがあるようなないような（まあ、要は重いページは読み込み完了前にユーザーが去ってしまうということだ）
さらに動的な箇所が極めて限られることから、セキュリティ面のコストも下げられる。FireBaseなどのサービスに乗っけてしまえばサーバーの維持が格段に楽になる。なお、これはJAMStackに限られた話ではない。
これ以上詳しく[こちら](https://www.pxgrid.com/jamstack/)
パフォーマンスが非常にいいのも特徴だ。具体的には、後述で作ったサイトでコンテンツが少ないとはいえ以下のパフォーマンスを叩き出している
![スクリーンショット 2021-04-01 5.42.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180652/367ed74d-c049-ce0d-4310-7e36e540f323.png)


## SSR(サーバーサイドレンダリング)と何がちがうのか？
SSRはリクエストが発生したタイミングで静的ファイルを生成するが、JAMStackは事前に静的ファイルを生成する。簡単にいうと、料理をその場で作って出すのがSSRで事前に準備しておいたものをスッと差し出すのがJAMStack。

## JAMStackはどんなサイトに有効か
動的にしたい部分だけ動的にできるので、更新箇所が少ないサイトに向いている。逆にごりごり動的に画面を書き換えるサイトは向かない

## JAMStackを使ってみる
### 今回用意するもの
- microCMS(headlessCMS)
- Gatsby.js(静的サイトジェネレーター)
- firebase(cloud function, firebase hosting)

### microCMS
日本製のheadlessCMS. headlessCMSとはViewを持たないCMSのこと。CMSとはコンテンツを管理、集積、配信するサービスのこと。有名どころだとwordpressで、wordpress API を使ってJAMStack を構築するやり方もあるらしい。
なぜheadlessCMSが必要かというと、こいつにAPIの配信とデータ集積を担当させるためである。加えてView部分は静的ファイルで作るのがJAMStackの旨味なので、wordpressのように動的にViewを作ってしまうと困るのである。

### Gatsby.js
React製の静的サイトジェネレーター。静的サイトジェネレーターとは事前にコンテンツをビルドして静的なファイルとして吐き出してウェブサイトを作る仕組みを実装したツールのこと。要はビルドコマンドを叩くと裏で動的に作っていた部分がいい感じにがっちゃんこされて静的なファイルが出来上がる生かしたツールのことで、最近（？）流行りのいかしたjsのフレームワークであるReact製の静的サイトジェネレーターともなればそれはもうイケイケである。採用例はあまり聞かないが。
今回はJAMStackのView部分生成のために利用する

### firebase
Googleが展開しているサービス。サーバーサイドで必要なサービスを多数内包しており、このサービスを利用することでサーバーサイドをそこまで気にすることなくフロントの開発に集中することができる。
今回はサイトの置き場としてと、postリクエストを仲介するcloud functionを使いたいために採用

## microCMSの準備
microCMSの準備をする
[公式のブログ](https://blog.microcms.io/getting-started/)にやり方が乗っているので、その通り登録する。
登録が完了したらスキーマ(構造)を定義する
私はニュースだけを更新するコーポレートサイトを想定し、以下の様に定義してみた
![スクリーンショット 2021-04-01 3.57.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180652/033cb2e7-269a-0c39-311e-83ec794c99b0.png)

スキーマを登録したら、早速記事を投入する
![スクリーンショット 2021-04-01 4.13.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180652/2ce7ec25-064b-21d5-acf6-85bc398e3ba1.png)
これでmicroCMS側の準備は完了である

## Gatsby.jsの準備
手前味噌だが[この記事](https://qiita.com/yyanagi/items/be8a922cf2bf27889c2b)を参考にしてインストールとプロジェクトの作成まで済ませる。
次に[こちらの公式記事](https://blog.microcms.io/gatsby-microcms-media/)を参考にしてアプリケーションを作り上げる

アプリケーションが正しく作れたら、以下の様なサイトが出来上がっているはずだ（入稿内容は人による）
![スクリーンショット 2021-04-01 5.26.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180652/14fe0b32-65d6-ef5e-3392-a93a29c8eed2.png)


![スクリーンショット 2021-04-01 5.26.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180652/1f8547ab-099e-fd31-4578-dd8221bfdb47.png)


## firebaseに登録
以前の記事でも参考にさせていただいた[こちらの記事](https://medium.com/@yonemoto/firebase-hosting-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E9%9D%99%E7%9A%84%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AE%E3%83%9B%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E6%96%B9%E6%B3%95-3e0bac58d09c)を参考にfirebaseにホスティングする

gatsby buildで

```
Problems with gatsby-source-microcms plugin options:
"apiKey" is required
```

と怒られたら、それはproduction用の .envファイルがないということなので、`.env.production`を作ってあげると解決する（実験的に作っているうちは中身は.env.developmentと一緒でいい）詳しくは[こちらの記事](https://ryusou.dev/posts/gatsby_environmentalVariables)に詳しくまとめられている。

## 後書き
ハンズオンが大分外部頼りで駆け足になってしまったが、モックを作るだけならJAMStackは非常に簡単に作れる。
問題はページネーションやpostリクエストを投げたい時など複雑なことをしようとする場合だが、こちらは後日tipsをこの記事に追記したいと思う。