Jamstackってなんだろう？ Cloudflare Pagesにホスティングしてみた !

# Jamstack
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/778e05de-1859-0434-6e7c-1fb3231801d7.png" width="350px" />

* [Jamstack](https://jamstack.org/)とは、事前にデータを埋め込んだ静的なHTMLに、JavaScriptを利用し、APIより動的なコンテンツを取得するWebアプリ・Webサイトのアーキテクチャです。
* ちなみに、Jamstackの**Jam**はJavaScript, API, Markupの頭文字を取ったものです。
* なぜ、それらの頭文字から取ったのかというと、それぞれの**役割**にあります。

[役割を考えると?]

* **JavaScript**, **API** => 動的なコンテンツを扱う
JavaScriptなら、Request, Responseの動的プログラムの制御を行うし、APIなら、サーバーサイドの処理やデータベースへのRequestを行います。

* **Markup** => 静的コンテンツを扱う
デプロイ時にビルドされるテンプレート化されたMarkupです。

**つまり、あらかじめAPIからデータを取得して、表示するページの内容を静的なHTMLとして書き出しておくことで迅速にレスポンスを返すことができます。**

## メリット/デメリット

### メリット

#### セキュリティ
* サーバー側のプロセスがAPIに集約されるので、攻撃対象が減ります。
* ページとアセットを事前に生成されたファイルとして提供するので、読み取り専用のホスティングが可能になります。

#### 規模
* 人気のあるサイトは、人気のあるページ, リソースをキャッシュするロジックを追加することで、大量のトラフィック負荷に対処します。 => CDN
* Jamstackはデフォルトでこれを提供します。

#### パフォーマンス
* Jamstackのサイトでは、ビルド中に事前にページを生成するので、要求時にサーバー上でページを生成する必要がなくなります。

#### 保守性
* ホスティングの複雑さが軽減されるので、メンテナンスにかかる負荷が減ります。

#### スケーラビリティ

* Jamstackのサイトは、事前に生成されています。
* つまり、さまざまなホスティングサービスに簡単にホストできます。


### デメリット

#### ユーザーロールの切り替えができない
* JAMstackサイトはユーザー管理ができないようです。
* 書き込み権限設定（パーミッション設定）ができないようです。

#### buildに時間がかかる
* 静的サイトジェネレーターは変更が一部分だけでもウェブサイト全部のページ生成を毎回行うためbuildに時間がかかります。

#### インタラクティブにできない
* ユーザーに応じてコンテンツを表示したり、コンテンツの変化が激しくなる場合、こちらもビルドの負荷が高まるため向いていません。

## Jamstackではないもの
* WordPressなどのサーバーサイドで動くCMSにより管理及び公開されているWebサイト
* PHPなどによりサーバーサイドでHTMLが作られ、公開されるようなWebサイト
* Ruby on RailsによりサーバーサイドでHTMLが作られるWebアプリ
* SSRされるSPA

**=> つまり、サーバーサイドでHTMLが作られるようなWebサイト, WebアプリはJamstackではない**

## これまでのWebとの比較
### SPAなど
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/1cd9d799-8c95-e5d3-fe2c-75bf6ebc031f.png" width="150px" />
### Jamstack
1. 事前にHTMLを生成する時にAPIから情報を取得して埋め込みビルド、デプロイを行います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/b4cebfc8-28d3-0172-7191-1c9cfc41e319.png" width="350" />

2. Jamstackは静的なコンテンツを配信するだけなので、これで済みます。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/5d15b2a2-d9e1-5d17-f7b0-60ac63dcf914.png" width="150" />

## Jamstackを構成するための技術スタック
### 静的サイトジェネレータ
* コンテンツデータとテンプレートからサイトを生成するためのものです。
* 有名どころだと、[Gatsby](https://www.gatsbyjs.com/)が挙げられます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/1afbc9f0-96a8-44ba-89f8-5ab5e727e6b9.png" width="250px" />

[静的サイトジェネレータのリスト](https://jamstack.org/generators/)

### CMS
* コンテンツの管理を行うシステムです。
* APIを通してデータの入出力を行います。
* 有名どころだと、[netlifycms](https://www.netlifycms.org/)が挙げられます。

### ホスティング
* ビルド、静的コンテンツをCDN上にデプロイする環境です。
* 有名どころだと、[netlify](https://www.netlify.com/)が挙げられます。

# Cloudflare Pages
* 昨日、クラメソさんで[Jamstackのホスティングの記事](https://dev.classmethod.jp/articles/cloudflare-pages/)が出ていて僕的に気になったので、試してみようと思います。
* それが[Cloudflare Pages](https://blog.cloudflare.com/cloudflare-pages/)というものです。
* CDNやセキュリティのSaaSで有名なCloudflareが提供する静的サイトのホスティングサービスだそうです。

## Deployしてみた
1. あらかじめGatsbyで作成したものをGitHubにpushしておく。
2. [cloudflareの公式ページ](https://www.cloudflare.com/)の右上にある(Sign up)を押し、アカウントを作成します。
3. ログイン後に右端にある、Pagesをクリックします。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/ce558906-ab49-18ed-4102-15cd424dcd82.png)
4. Githubとの接続認証画面があるので、その設定を行い、Deployするためのソースが格納されているリポジトリを選択します。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/868778c9-1680-7369-d5aa-d198f8fc3de7.png)
5. Freamework presetを選択する画面があるので、**Gatsby**を選択し、(Save and Deploy)を押しましょう！
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/8dd3d924-f019-770e-542b-981597630dd4.png)
6. 無事、Deployが完了しました。
![スクリーンショット 2021-03-05 1.55.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/db3a6b68-81fa-c092-fac7-af52996e317e.png)
7. Deployしたページを見てみましょう！ かなり簡単にDeployできましたね！
![スクリーンショット 2021-03-05 1.58.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/3bc3f372-0c0a-c1f3-d061-2ac6e71973be.png)

# 参考文献
* https://jamstack.org/what-is-jamstack/
* https://qiita.com/ozaki25/items/4075d03278d1fb51cc37
* https://www.mitsue.co.jp/knowledge/blog/frontend/201912/10_0000.html