DIST.40 「Jamstackの実際とミライ」での発表資料です。 https://dist.connpass.com/event/284922/
#dist40柴田 和祈Webフロントエンドの進化とJamstackアーキテクチャの変遷
View Slide
自己紹介2#dist40柴田 和祈 / Kazuki Shibata@shibe97株式会社microCMSの共同創業者 / CXO元デザイナー兼フロントエンドエンジニア
ご利用企業数ご契約継続率以上99%6,000社以上編集者も使いやすい日本製ヘッドレスCMS3
4#microcms_meetup
5What’s Jamstack?※以前、公式サイトに載っていた図
- 技術の移り変わりによって、公式サイト(jamstack.org)の中身も変化している- Netlify社が作り出した概念のため、営利的に解釈は変化していくものと捉えている(個人的感想)- jamstack.wtfでもVercelの登場によりJamstackの意味合いは曖昧になってきたと記載がある- フロントエンド・エッジ技術は従来のJamstack定義のはるか先まで進んでしまっている6Jamstackの曖昧さ
歴史を辿りながらWebフロントエンドの進化を見ていきましょう7
8SPA(Single Page Application)の登場- JavaScriptのXHR(XMLHttpRequest)を利用して、クライアントサイドでのページ遷移を可能にした- 2005年2月「Ajax: A New Approach to Web Applications」論文- ページ遷移時に真っ白な画面で待つ必要がなくなり、ユーザー体験が向上した- サーバーサイドで行っていたロジックがクライアントサイドに移り、JS実装の複雑性が増した- MVC系フレームワークの登場- Backbone, Angular, Vue, React, etc...
9SSR(Server Side Rendering)の登場- 従来のSSRではなく、SPA込みでのSSRの話- サーバーサイドからクライアントサイドに各種状態の連携(ハイドレーション)- SPAの下記の問題点を解決- 最初に大きなバンドルJSを読み込む必要があるため、初期ロードが遅い問題- SSRと比較するとクローラーにIndexされづらい問題- Next, Nuxtが登場- SSRの難しいところを全部吸収したフレームワークとして人気に
10SSG(Static Site Generate)の登場- モダンJSフレームワークによるサイト全体の静的化が人気に- Nuxt v2.13でFull Static Generationが登場し、ページ遷移時のAPIレスポンスも静的化- もちろんハイドレーションしてSPAとしても動作する- リンク先のプリフェッチも導入され、超高速サイトが作れるようになる
11新たなホスティングサービスの登場- 静的ビルドしたファイル群をCDNから配信できるサービスが相次いで登場- Netlify / Vercel / Amplify Console / etc…- Atomic Deploys- すべてのコード、アセットが一気に更新されるため、ウェブサイトが部分的に更新された状態にはならない- FTPアップロードの問題を解決- ここでJamstackに火が点いた
- APIでコンテンツ管理ができるヘッドレスCMSが登場- Jamstackで静的ページを作れるようになったが、非エンジニアが運用できないという問題を解決12ヘッドレスCMSの登場
- オリジンサーバーへの物理的な通信遅延を解決するための分散型サーバーのネットワーク- CDNの一部として機能する個々のサーバーをエッジサーバーと呼ぶ13CDN(Content Delivery Network)オリジンサーバーユーザーエッジサーバー50ms200msエッジサーバーエッジサーバー
- ビルドが遅い- 1ページ更新すると全ページビルドが走ってしまう- 大量のページがある場合、1時間以上かかることも・・・- 速報性のあるページや、時間きっかりに公開したいページとの相性が良くない- CMSのプレビューの実装を自前で行う必要がある14Jamstackの課題
- CDNのキャッシュが古い or 無い場合はバックグラウンドでデータを取りにいく- Stale While Revalidate という仕組み- ページ更新時も全体ビルドが不要になり、ビルド時間の問題は解決- revalidate=1などとすれば、時間きっかりもまぁ問題なしと言える- Next + Vercel 時代に突入15ISRの登場
16ISRの仕組み(キャッシュが有効な場合)オリジンユーザー エッジ①リクエスト②キャッシュ返却
17ISRの仕組み(キャッシュが古い場合)オリジンユーザー エッジ①リクエスト②キャッシュ返却③リクエスト④キャッシュ更新キャッシュが古いかどうかはrevalidateTimeで判断一度古いキャッシュが返却される二度目以降のアクセスで更新されたキャッシュが返却される
18ISRの仕組み(キャッシュがない場合)オリジンユーザー エッジ①リクエスト④キャッシュ返却②リクエスト③キャッシュ更新キャッシュがない場合は返却するものがないので取得しに行く
- ルーティングごとにレンダリング方式を変えられるハイブリッド方式が登場- 記事など大量ページがあり、更新も多い部分はSSR or ISR- 会社概要ページなど書き換えが極めて少ないページはSSGなど- 実装時はサーバー、クライアントのどちらで処理が動いているのかをよく考える必要がある- 最近のフレームワークはだいたいハイブリッドな流れに向かっている- Next, Nuxt, SvelteKit, Astro, etc19ハイブリッド方式
結果整合性20結果整合性と強整合性強整合性全ての更新が最終的には全ての参加者に伝播することを保証する。→ 大規模な分散システムに向いている全ての読み取りが最新の書き込みを常に反映するという保証する。→ 絶対的な制御が必要なシステムに向いている- SNS- メディア系- 銀行などの金融系サービス- 航空予約システム- 在庫管理システムSSRやCSRはこちらSSGやISRはこちら
- ページ内でも静的部分と動的部分を同居させることができる- 静的部分を海、動的部分を島としたイメージ- Deno FreshやAstroで採用されている - 部分的なハイドレーションが可能 - 必要なタイミングでJSがロードされる - スクリーンサイズが○○○px以下になったタイミング - ビューポートに入ったタイミング - etc 21アイランドアーキテクチャhttps://docs.astro.build/ja/concepts/islands/
- アイランドアーキテクチャに近い- サーバーサイドだけで動作させるコンポーネント- useState等のReact Hooksが使えない- サーバーで処理する分、クライアントに渡すバンドルサイズを削減できる- 表示系ライブラリの読み込み(highlight.jsなど)- コンポーネント定義- 最近のNext.js 13 App Routerではこの辺りの知識が必須- より細かい単位での制御へ22RSC(React Server Components)
- エッジは静的コンテンツをキャッシュするだけの場所ではなくなってきた- Cloudflare Workersの登場で潮の目が変わった- V8(JavaScript実行エンジン)を採用しているため、エッジ上でJavaScriptが動く- ただし、Node.js特有のAPI(fsなど)が使えない制約はあり- バンドルサイズの制約(1MBなど)- CPU runtimeの制約(10msなど)- Next.js の middleware もエッジ上にコードを展開できる23エッジコンピューティングの加速
- コード実行- Cloudflare Workers- Remix, SvelteKit, qwik, Hono- CloudFront Functions- Vercel Edge Functions- etc- DB- Cloudflare D1(SQLite)- ストレージ- Cloudflare R2(オブジェクトストレージ)- Cloudflare Workers KV(Key - Value store)24エッジ上で動かせるものたち
フロントエンドアーキテクチャはエッジをできる限り活用する方向に進化している25
- Jamstackという概念は技術の進歩と共に曖昧になってきている- フロントエンドアーキテクチャはCDNをフル活用する方向に進化している- 静的ファイルだけでなく、あらゆる処理・通信がCDN上で行われるようになってきている- できる限りレイテンシをなくしつつ、整合性の取れたアプリケーションを作るためにエンジニアに求められる知識は益々増加している26まとめ
Thanks :)27#dist40https://discord.gg/K3DPqw4EJ2@micro_cms