本書は技術書典14にて頒布した同人誌『ChatGPTと語りながら作る、Jamstack入門』に加筆修正を加えたものです。インプレスNextPublishing様のご厚意により、今回商業出版の運びとなりました。
本書では、新米プログラマーの「ぼく」がGPT先輩に質問しつつJamstackの基本概念や実用的な技術を学ぶことができます。ChatGPTのそのままの返答だと味気ないので、とある小説のヒロインをモデルにキャラクター付けをしています。ChatGPTでは「〜のような話し方で答えて」というプロンプトを使うとそのようにできるのです。
本書の特徴として、「ChatGPTと語りながら」進めていくというスタイルを採用しています。ChatGPTは、自然言語処理の最先端技術を用いたAIアシスタントで、本書の執筆過程で質問やフィードバックを受けながら進めることができます。本書の目標はChatGPTに会話形式で質問をしながらJamstackサイトの構築においてどれくらい実践的に使えるかを検証することです。そのため細かな技術的な詳細よりも、ChatGPTとの会話(プロンプト)の流れを優先している部分が多いことをご了承ください。
このアプローチにより、読者の皆さんにも、まるでChatGPTと一緒に学んでいくかのような感覚で、Jamstackの世界に没頭してもらえることを目指しています。これは実際にChatGPT上のプロンプトで「ぼく」が質問した内容の回答をほぼそのまま使用しています。
ただ実際にはChatGPTの回答が不十分だったり、コードは若干変更しないと使えなかったりします。そのような部分は自分で補足したり調べたりして進めています。ChatGPTの回答そのままではないことはご了承ください。
なお本書は静的サイトジェネレータとしてGatsbyを使用することになりましたが、これもChatGPT先輩のチョイスにそのまま従ってみました。筆者はVueやNuxtしか使ったことがなく、Gatsbyでの実装は初めてでした。
本書では、以下のような内容を扱っています。
・Jamstackの基本概念とメリット
・Gatsbyを使った静的サイトの構築
・ヘッドレスCMS「microCMS」からのデータの取得
本書は、Web開発の中級者を対象としており、Jamstackに興味がある方やこれからJamstackを学びたい方に役立つ情報を提供しています。
ではChatGPT先輩と語りながら実際にコードを実装し、Jamstackサイトを作ってみましょう!
本書は以下の前提条件を満たす方を対象として書かれています。こうした事柄について細かな説明はありませんので、ご注意ください。
・JavaScriptの経験
・npmなどコマンドラインツールの経験
・Markdownの基本的な知識
筆者の開発環境(これ以外の環境でも使用できます)
・OS: MacOS Big Sur
・IDE: PhpStorm
・GPTモデル: GPT-4
本書に記載されている会社名、製品名などは、一般に各社の登録商標または商標、商品名です。会社名、製品名については、本文中では©、®、™マークなどは表示していません。
本書に記載されている内容は、2023年7月時点の内容です。使用しているフレームワークや各種サービスのバージョンが変わったり、インターフェースが変更されたりして記載通りに操作できなかったり、画面が遷移しなかったりする可能性があります。その場合はそれぞれの公式ドキュメントから最新の情報を得て適時調整してください。
本書を用いた開発、製作、運用、試験などにおいて著者及び出版社は一切の責任を負いません。提供されている情報の活用はご自身の責任において行ってください。
本書のテーマであるJamstack(ジャムスタック)の概念を紹介し、そのメリットや特徴について解説します。静的サイトジェネレータ、API、ヘッドレスCMSの各要素とその相互作用についてもChatGPT先輩に語ってもらいます。
ぼく: GPT先輩、最近よくJamstackという言葉を聞くんですが、何ですか?
GPT先輩: ふふ、きみも気になっているのね。Jamstackはウェブ開発のアーキテクチャで、JavaScript、API、Markupの頭文字をとって名付けられているのよ。従来のウェブ開発と違って、Jamstackではサーバーサイドの処理をAPI経由で行い、静的なHTMLやJavaScript、CSSを配信することで、高速でセキュアなウェブサイトやアプリケーションを作ることができるの。
ぼく: なるほど、それはすごく便利そうですね。どんなメリットがあるんですか?
GPT先輩: いくつかメリットがあるわ。まず、高速なパフォーマンスが挙げられるね。静的ファイルの配信だから、動的なウェブサイトよりも読み込み速度が速いの。次に、セキュリティーも向上するわ。サーバーサイドの処理がAPIで分離されるから、セキュリティーリスクを減らせるのよ。それから、スケーラビリティーがあるの。静的ファイルをCDNで配信するから、たくさんのアクセスにも簡単に対応できる構造になっているの。最後に、メンテナンス性もいいわ。フロントエンドとバックエンドが分離されているから、それぞれの開発やメンテナンスがやりやすくなるの。
ぼく: なんだかとても魅力的な開発手法ですね!具体的にどのような技術を使って構築するんですか?
GPT先輩: うん、具体的な技術について説明するわね。元々Jamstackアーキテクチャは主に以下の3つの要素から構成されているのよ。
・JavaScript: ウェブサイトやアプリケーションの動的な部分を担当するわ。フロントエンドのフレームワークやライブラリーを活用することが一般的だけど、ReactやVue.js、Angularなどがよく使われているわね。
・API: データや機能を提供するバックエンドの役割を担うの。APIはサーバーレス技術やヘッドレスCMSなどを使用して実装されることが多いわ。たとえば、AWS LambdaやFirebase、Netlify Functionsなどが利用されることがあるわね。
・Markup: 静的なHTMLやCSSが含まれるわ。静的サイトジェネレータを使って、マークアップを自動生成することができるの。代表的な静的サイトジェネレータには、Next.js、Gatsby、Nuxt.js、Hugoなどがあるね。
でも現在はこうした3つの要素に拘らず、様々なものを組み合わせて使うので当初提唱されていた「JAMStack」ではなく、「Jamstack」と特定の頭文字を表さない表記にしたのよ。
なので静的サイトジェネレータ以外にも、Jamstackで利用される技術やサービスがいくつかあるの。たとえば、次のようなものがあるわ。
・ヘッドレスCMS: コンテンツ管理システム(CMS)で、バックエンドだけを提供し、フロントエンドは自由に選ぶことができるわ。たとえば、ContentfulやStrapi、Sanityなどがあるわね。これらのヘッドレスCMSを使えば、API経由でコンテンツを取得して、Jamstackアプリケーションに表示できるのよ。
・CDN(コンテンツデリバリーネットワーク): 静的ファイルを効率的に配信するために利用されるわ。たとえば、CloudflareやAWS CloudFront、Netlifyなどがよく使われているわね。CDNを利用することで、ウェブサイトやアプリケーションの読み込み速度が向上し、世界中のユーザーに対して高速な配信が可能になるのよ。CDNは、データセンターやキャッシュサーバーが地理的に分散配置されていて、ユーザーに最も近いサーバーからコンテンツを配信することで、待ち時間を短縮するわ。
・サーバーレス: さらに、サーバーレス技術もJamstackアーキテクチャで重要な役割を果たしているの。サーバーレス技術とは、バックエンドの処理をサーバーに依存せずに実行できる技術で、AWS LambdaやGoogle Cloud Functions、Azure Functionsなどがあります。これらのサービスを使うことで、APIを構築してJamstackアプリケーションと連携させることができるわ。Jamstackアーキテクチャでは、これらのサーバーレス技術を活用して、データや機能をAPI経由でフロントエンドに提供することができるのよ。これにより、従来のサーバー上で動作するバックエンド処理とは違って、必要なときだけリソースを利用して処理を行い、コスト効率も向上するわ。
・JavaScriptフレームワーク: 最後に、Jamstackでは、フロントエンドの開発にモダンなフレームワークやライブラリーが利用されることが多いわ。たとえば、ReactやVue.js、Angularなどのフレームワークが使われているの。これらのフレームワークを利用することで、動的なコンテンツやインタラクティブな機能を簡単に実装できるようになるね。静的サイトジェネレータとフレームワークを組み合わせることで、高速でスケーラブルなJamstackアプリケーションを開発することができるようになるわよ。
先輩の返答はChatGPT(GPT-4)の学習時点である2021年9月までの知識です。Jamstackは先輩の説明したような意味合いで始まりましたが、今ではそこから進化してフロントエンドのフレームワークで取得したAPIを自由に使用しながらCDNサーバーで配信されるサーバーレスなアーキテクチャを総称するように使用されます。
本書ではJamstack開発の基本となる上記のような点を学んだ行きたいと思います。
ぼく: 静的サイトジェネレータについてもう少し教えてくれますか?
GPT先輩: 静的サイトジェネレータは、あらかじめテンプレートやデータを使って静的なHTML、CSS、JavaScriptファイルを生成するツールだよ。これによって、動的なコンテンツを静的なページに変換して、サーバーにデプロイできるようになるんだ。
静的サイトジェネレータはたくさんあって、それぞれ特徴や利点があるんだ。以下にいくつか人気のある静的サイトジェネレータを紹介するね:
・Gatsby (Reactベース) - Jamstackでよく使われる静的サイトジェネレータで、プラグインが豊富で、データ取得が柔軟にできるのが特徴だよ。
・Next.js (Reactベース) - サーバーサイドレンダリングや静的サイト生成、APIルーティングなど、様々な機能を提供しているフレームワークだよ。最近では、静的サイト生成にも対応しているんだ。
・Hugo (Goベース) - 高速なビルド速度が魅力の静的サイトジェネレータで、マークダウンファイルを使ってコンテンツを管理できるんだ。
・Jekyll (Rubyベース) - 静的サイトジェネレータの草分け的存在で、GitHub Pagesとの連携が簡単で、マークダウンファイルを使ってコンテンツを管理できるよ。
静的サイトジェネレータは、サーバーサイドで動的にページを生成する代わりに、ビルド時にすべてのページを生成するため、高速なページ表示が可能になるんだ。これにより、ウェブサイトのパフォーマンスが向上し、ユーザーエクスペリエンスも改善されるよ。
また、静的サイトジェネレータを使うことで、サーバー側の処理がなくなるため、セキュリティーの面でも安全性が高まるんだ。
きみがこれから静的サイトジェネレータを使ってサイトを作っていく場合、自分の好みや要件に合った静的サイトジェネレータを選ぶことが大事だよ。どの静的サイトジェネレータもそれぞれに独自の特徴や利点があるから、目的や技術スタックに応じて選ぶことが重要だよ。
たとえば、Reactが得意な人はGatsbyやNext.jsを選ぶといいし、Go言語が好きな人はHugoを選ぶといいね。また、シンプルなブログサイトを作成したいだけであれば、Jekyllもいい選択肢だよ。
静的サイトジェネレータを使う上で、以下のようなポイントも考慮してみてね。
・ビルド速度: サイトの規模が大きくなると、ビルドにかかる時間が長くなることがあるよ。ビルド速度が速い静的サイトジェネレータを選ぶことで、開発効率が向上することがあるんだ。
・プラグインやテーマの豊富さ: 豊富なプラグインやテーマがある静的サイトジェネレータは、機能追加やデザインのカスタマイズが簡単にできるよ。
・コミュニティーやドキュメント: サポートが充実している静的サイトジェネレータは、困ったときに助けを求めることができるので、安心して開発できるよ。
・データソースの柔軟性: Jamstackアーキテクチャでは、APIを使ってデータを取得することが一般的だけど、静的サイトジェネレータによってはデータソースの取り扱いが限定されていることがあるから、注意してね。
きみは、これらのポイントを考慮して、自分に合った静的サイトジェネレータを選ぶことが大事だと思うよ。そして、選んだ静的サイトジェネレータを使って、素早く高品質なサイトを作成していこうね!
ぼく: ヘッドレスCMSって何ですか?
GPT先輩: ヘッドレスCMSについてもっと詳しく説明するね。ヘッドレスCMSは、フロントエンドとバックエンドが分離されたコンテンツ管理システムのことで、APIを介してデータをやり取りするのが特徴なんだ。従来のCMSは、フロントエンドとバックエンドが一緒になっていて、柔軟性に欠けることがあったんだけど、ヘッドレスCMSではその問題が解消されるの。
ぼく: ヘッドレスCMSって何で「ヘッドレス」と呼ばれるんですか?
GPT先輩: いい質問だね。実はその言葉、"ヘッドレス"というのは、本来の表示部分、つまり「頭」がないということを意味しているんだ。
一般的なCMS(Content Management System)は、バックエンド(データやコンテンツを管理する部分)とフロントエンド(コンテンツを表示する部分)が一体となっていて、バックエンドでコンテンツを編集したらそれが同じシステムのフロントエンドで表示されるという仕組みになっているんだ。
でもヘッドレスCMSは、ここが違うんだよ。ヘッドレスCMSはコンテンツ管理機能(バックエンド)だけを提供していて、フロントエンドの表示部分は含まれていない。だから、「頭」がない、つまり"ヘッドレス"なんだ。その代わりに、バックエンドからAPI経由でコンテンツを取得し、それをどんなフロントエンド技術を使っても表示できるようになっているんだ。
これが「ヘッドレスCMS」が「ヘッドレス」な理由だよ。わかりやすく説明できたかな?
ぼく: なるほど、分かりました!じゃあどんなメリットがあるんですか?
GPT先輩: ヘッドレスCMSのメリットは以下の通りだよ。
・フロントエンドの自由度: フロントエンドとバックエンドが分離されているので、開発者は好みのフロントエンド技術を選べるし、デザイナーやコンテンツ編集者はCMSの管理画面を使って、独立してコンテンツを編集できるんだ。
・APIを活用したデータの統合: ヘッドレスCMSはAPIを使ってデータを取得するので、他のシステムやサービスとデータを簡単に連携できるのが魅力だよ。たとえば、eコマースプラットフォームやCRM、マーケティングツールなど、さまざまな外部サービスと連携して、効率的にデータを管理できるんだ。
・セキュリティーの向上: ヘッドレスCMSでは、フロントエンドとバックエンドが分離されているため、攻撃対象が減ることでセキュリティーリスクが低減されるんだ。また、APIを介してデータをやり取りするので、不正なアクセスに対してもセキュリティー対策が取りやすいんだよ。
・スケーラビリティー: ヘッドレスCMSは、フロントエンドとバックエンドを個別にスケールすることができるため、トラフィックの増加のようなスケーラビリティーが求められる状況に対しても柔軟に対応できるんだ。たとえば、特定のキャンペーンやイベントでアクセスが急増する際でも、バックエンドのみをスケールアップすることで、システム全体の安定性を保つことができるよ。また、フロントエンドとバックエンドが独立しているため、どちらか一方の技術スタックを変更しても、全体の影響を最小限に抑えることができるんだ。
・デベロッパーとコンテンツクリエーターの協力が容易: ヘッドレスCMSでは、デザイナーやライターなどのコンテンツクリエーターが、専用のコンテンツ編集インターフェースを使って、コンテンツの作成や編集を行うことができるよ。デベロッパーは、このコンテンツ編集インターフェースから生成されるAPIを利用して、Jamstackアプリケーションに必要なデータを取得できるの。お互いの作業を意識しなくていいから、開発がやりやすいのよ。
・マルチプラットフォーム対応: ヘッドレスCMSは、APIを通じてコンテンツを配信するため、ウェブサイトだけでなく、モバイルアプリ、IoTデバイス、ウェアラブルデバイスなど、様々なプラットフォームに対応することができるんだ。これにより、一元的なコンテンツ管理が可能となり、異なるプラットフォームでのコンテンツの一貫性を保つことができるよ。
・バージョン管理とコラボレーション: ヘッドレスCMSでは、コンテンツのバージョン管理が容易になるんだ。これにより、過去のバージョンに戻すことや、変更履歴を確認することができるよ。また、ヘッドレスCMSはクラウドベースであることが多いため、チームメンバー間でのリアルタイムのコラボレーションが可能になるんだ。これにより、複数の人が同時にコンテンツを編集したり、承認フローを組み込んだりすることができるよ。
・よりいい開発者体験: ヘッドレスCMSは、開発者にとっても使いやすいインターフェースを提供しているんだ。開発者は、自分が使い慣れたプログラミング言語やフレームワークを使用してAPIを通じてコンテンツにアクセスできるよ。これにより、開発者は自由にカスタマイズできる環境で効率的に開発ができるんだ。
・コスト削減: 従来のCMSでは、多くのリソースや時間がサーバー管理やセキュリティー対策に割かれていたんだ。しかし、ヘッドレスCMSでは、これらのタスクが大幅に削減されるため、開発や運用のコストを抑えることができるんだ。
ぼく: なんだかいいことずくめですね!
ぼく: APIとマイクロサービスについては?
GPT先輩: もちろんさ。APIとマイクロサービスについても説明しよう。
API(Application Programming Interface)は、異なるソフトウェア間でデータや機能を共有するためのインターフェースだよ。APIを使用することで、異なるシステム間で情報をやり取りし、機能を統合できるんだ。Jamstackでは、APIを利用して、ヘッドレスCMSや他のサービスからデータを取得し、ウェブサイトやアプリケーションに組み込むことができるんだ。
マイクロサービスって、アプリケーションを小さな独立したサービスに分けて連携するアーキテクチャなんだよ。各サービスがそれぞれのビジネス機能を担当して、APIを使って情報を共有することで、アプリケーション全体の柔軟性や拡張性を高められるんだ。そうすることで、ビジネス上の問題を個別に解決できるし、開発のスピードも上がるんだ。でも、連携やデータ整合性に関する問題もあるから、適切な設計や管理が必要だよ。でも、私たちにはきっとできるわね!
マイクロサービスアーキテクチャの主な利点は、以下の通りだよ。
・柔軟性: 各マイクロサービスは独立して開発・デプロイできるため、迅速に新機能を追加したり、既存の機能を改善できるんだ。
・スケーラビリティー: 需要の多いサービスだけをスケールアウトできるから、リソースを効率的に活用できるんだよ。
・メンテナンス性: 小さなサービスは、大規模なモノリシックアプリケーションよりも管理しやすく、問題が発生した際に迅速に対応できるんだ。
・技術的多様性: 各マイクロサービスは、それぞれ最適な技術や言語で開発することができるよ。
Jamstackアプローチでは、APIとマイクロサービスを活用して、ウェブサイトやアプリケーションの機能を拡張することができるんだ。これにより、開発者は複雑なバックエンドのロジックをクライアントサイドに持ってくることなく、ウェブサイトやアプリケーションに新しい機能を追加できるんだよ。
たとえば、ユーザー認証、Eコマース、データベースアクセス、フォーム送信、リアルタイム通信などの機能を実装する際に、APIとマイクロサービスを利用できるんだ。これらの機能を実装するためのAPIは、多くの場合、サードパーティのプロバイダーによって提供されているよ。しかし、必要に応じて独自のAPIを作成して使用することもできるんだ。独自のAPIを使用することで、特定のビジネスロジックやデータアクセスの要件に対応できるようになるんだよ。
また、マイクロサービスアーキテクチャは、アプリケーションを小さな独立したサービスに分割して開発・運用する方法で、各マイクロサービスは独自の役割を持っていて、互いにAPIを介して連携するんだ。これにより、開発チームはそれぞれのマイクロサービスに集中して開発ができ、アプリケーション全体の柔軟性と拡張性が向上するんだよ。
Jamstackでは、APIとマイクロサービスを活用して、ウェブサイトやアプリケーションの機能を迅速に追加・更新できるのが大きな利点だね。また、APIとマイクロサービスを活用することで、ウェブサイトやアプリケーションの機能をモジュール化して再利用しやすくなるんだ。これにより、開発効率が向上し、新しい機能の追加や変更が容易になるんだよ。
さらに、Jamstackアプローチでは、クライアントサイドでAPIを呼び出すことが一般的だから、バックエンドとフロントエンドの分離が容易になるんだ。これにより、フロントエンドのデザインやUIを変更しても、バックエンドのロジックやデータ構造に影響を与えず、柔軟に対応できるようになるんだよ。
アプリケーションを開発・デプロイできるようになるんだ。でも、APIやマイクロサービスを使うときには、それぞれの機能や役割を理解して、適切に組み合わせることが大事だよ。そうすることで、高速で安全なウェブサイトやアプリケーションを提供できて、ユーザーの満足度も高まるんだ。私たちも、Jamstackプロジェクトを成功させるために、APIとマイクロサービスを上手に使っていこうね!