静的サイトジェネレーターについて考える座談会 第1回 「静的サイトジェネレーター」の変容の歴史

これまでフロントエンド開発に登場してきた「静的サイトジェネレーター」をキーにこれからのサイト制作の開発手法を展望する座談会です。第1回目は静的サイトジェネレーターの変容の歴史をざっくり話しました。

発行

  • 中村 享介
  • 高津戸 壮
  • 矢倉 眞隆
  • 中野 祐人
  • 丸山 陽子
静的サイトジェネレーターについて考える座談会 シリーズの記事一覧

はじめに

CodeGridではこれまで、複数の「静的サイトジェネレーター」と呼ばれたり、あるいはそのような機能をもったフレームワークやツールを紹介してきました。

この座談会ではこれまでフロントエンド開発に登場してきた主なフレームワークやツールを振り返りながら、現代の開発現場では、どのようなサイトのニーズに応えようとしているのか、またその理想的なサイトをどのような手法で構築しようとしているのかを考えます。

第1回目はCodeGridの中にも登場した主要なフレームワークやツールの発展の歴史を、開発者なりの視点から語り合っています。

参加者はピクセルグリッドの以下のメンバーです。

静的サイトジェネレーターとは

ーー今日は静的サイトジェネレーターについて、お話できればと思います。昨今、たくさんの静的サイトジェネレーター、または静的サイトジェネレーターの機能を持ったツールがありますよね。まず最初に「静的サイトジェネレーターって何? どういう定義?」ということがあるかと思うので、そこを確認できればと思います。

中野:僕は、作るときにはプログラム的なコードで書けて、ビルド時には静的なアセットとしてできるだけ吐き出す。配信するものとしては静的なHTML/CSSと、クライアントサイドのJavaScriptという状態にできるツールが静的サイトジェネレーター、という定義だと思っています。

ただ、Gatsbyは吐き出すものがSPAに近い挙動をするとか、Next.jsはSSRでレンダリングできる機能が揃っていたり、APIを構築できたりだとかしますよね。ツールによっては、静的サイトジェネレーターというよりもっと大きな枠という気がするのですよね。

中村:そうですね、僕は静的サイトジェネレーターは「何らかのソースファイルから、Webサイト的なものを生成するツール」なのかなと思いますね。

「1ページのSPAのようなものを生成する」というよりは「複数ページからなるWebサイトを生成する」というツールを、静的サイトジェネレーターと呼ぶのかなっていう印象ですかね。僕の中では。合っています?

矢倉:多分、正解はないと思います。

中村:ないと思いますね(笑)。どう説明したら、一言で説明できるんだろう。

矢倉:それこそ、Jamstackのサイトに静的サイトジェネレーターの説明って何て書いてあるんでしたっけ。えーと……

A tool which can be run as part of a build to transform content, data, and templates into files which can be deployed to a hosting environment as a ready-to-serve web site.

Static site generator | Jamstack

「そのままWebサイトとしてホスティング環境にデプロイできるように、コンテンツ、データ、テンプレートをファイルに変換する、ビルド時に使うツール」となってますね。

だからまあ、意味合いとしては広いですよね。

中村:ファイルに書き出すっていうのは、静的サイトジェネレーターの必須条件かな。たとえばWordPressってサーバーを起動してサーバーからHTMLを含めたデータを返しますけど、ファイルとして吐き出すわけではないじゃないですか。そういうものは静的サイトジェネレーターではないっていうことですよね。まずはそのあたりのことを考えるためにも、静的サイトジェネレーターを、昔のところから今までの理解を整理することから始めてみましょう。

静的サイトジェネレーターの登場前夜

ーー静的サイトジェネレーターがツールとして登場する前、というのはどういう状況だったのでしょうか?

中村:大昔のWebサイトの作り方は、「みんな手で書いてたよね」っていうのがありますよね。その後に、手で書くのが大変なので、サーバーに作らせようとかそういう流れがまず出てきたはずです。

僕が最初に触ったものでいくとMovable Typeの2.6ですかね。それはCGIを使ってサーバーで、あらかじめHTMLを生成しておくっていうPerl製ツールで。静的サイトジェネレーターに近い動きをしてたと思うんですよね。

高津戸:確かに。

矢倉:Movable Typeでは、「再構築」っていっていましたもんね。

中村:そうそう。「再構築」っていうボタンを押すのが「全サイトを生成する」ことで、普段は更新した記事と関連するインデックスだけを生成する「インクリメンタルビルド」ですよ。記事とその関連ページを更新するんだけど、過去の記事は更新しないっていうのがMovable Typeの動きだったので、まあやっていることはサーバーで動く静的サイトジェネレーターだよねっていうイメージですね。

でも、それだと「再構築が時間かかるよね」という流れが出てきました。それで、WordPressなどのように、毎回データベースに問い合わせて生成するみたいなもののほうが主流になっていったな、という印象ですかね。

高津戸:そもそも、静的サイトジェネレーターっていう言葉がその頃ないですしね。

中村:そうですね、静的サイトジェネレーターとは呼んでいない。ただ、すごくアクセス数が多い場合とか、やっぱり静的サイトじゃないと運用が難しいことはありましたよね。僕が昔やっていたときは、静的サイトジェネレーターツールがあまりなかったので、ローカルでPHPを動かしてHTMLを大量に生成するみたいなことはやっていましたね。

中野:今の感じに近いですよね。

中村:そう。なんらかのプログラム言語で静的サイト生成するみたいなことはしていたと思います。

静的サイトジェネレーターの2つの流れ

ーーツールとして、静的サイトジェネレーターが登場してきたのはどのあたりからでしょう?

中村:静的サイトジェネレーターって言葉が出てきたなというのは、Jekyll*とかあのへんのツールが出てきたあたりかな。

*注:Jekyll

2013年6月にv1.0.0がリリースされています。CodeGridでは2013年にJekyll(ジキル)を取り上げています。

矢倉:やっぱり、JekyllやHugoがクラシックな静的サイトジェネレーターとして出てくるじゃないですかね。Markdownで書いたものを、別途用意したテンプレートに流し込んでコマンドラインでエンターを押せば、ばばっと一連のHTMLファイルができてくれる。

中村:そうですね。そのへんのJekyll系みたいなツールが、歴史的にはいわゆる静的サイトジェネレーターっていうものですよね。

その流れを汲んでるのが、今でいうとEleventy*かな。Eleventyで採用された、Front matterのついたMarkdownファイルで生成できるとか、そういうのはJekyllから来ているみたいですね。Eleventyは、Jekyllをかなり参考にして作られていたと思います。

*注:Eleventy

2017年12月頃にv0.1.0がリリースされています。CodeGridでは2019年11月からシリーズが開始されていました。2022年1月にメジャーバージョンアップしたv1.0.0がリリースされ、現在も開発が続いています。

Node.jsで作られたJekyll。Eleventyはそんな印象ですかね。

高津戸:僕は、当時Jekyllが流行ったけど、それは開発の人らがブログとかを書くのに「え、これイケてんじゃん!」みたいな感じで使うぐらいだったんじゃないかなって思って。CodeGridの記事にも書きましたけど。

GitHubもすごくJekyllを推していて、サーバーとか準備しなくてもGitHub Pagesに、ちょろっとビルドした結果を公開して「ほら、ブログができちゃいまっせ」みたいのが、当時は流行ったんですよね。開発的には「ちょっとクールに見える!」みたいな(笑)。

中村:そうそう。「ブログとか日記の公開ごときでサーバーのメンテなんかしたくないよね」という、静的に生成してそれを公開するだけで十分では? みたいな流れがあったんですよね。

高津戸:ただ、コーポレートサイトとかをそれで作るかっていわれると、Markdownで全部作れるようなことはあまりないので。ドキュメントとかブログとか、そういうので主に使われていたぐらいかなーっていう感じでしたけど。その頃は。

ーーエンジニア個人が楽しんで使う範疇で、まだ本格的に案件に使うというわけではなかったんですね。

SPA由来の静的サイトジェネレーター

中村:そういうJekyllみたいな昔ながらのツールの流れをくむ静的サイトジェネレーターとは別に、SPAからきた静的ジェネレーション機能の流れがあると思っています。

Webの世界ではGoogle Mapとか、Ajax*でWebでアプリ的なものを作るみたいな流れが別にありましたよね。

*注:Ajax

みなさんお馴染みの言葉なので、用語解説というより、歴史を語る上で注釈をつけておきます。Ajax(エイジャックス)はAsynchronous JavaScript And XMLの略で、2005年2月18日に情報アーキテクトであるジェシー・ジェームズ・ギャレット氏によって提唱された造語です。

フロントエンド的には、JavaScriptでできることが増えていって、Gruntなどのタスクランナーや、Backbone.jsなどのいろんなライブラリが出てきて、SPAを気軽に作ることが増えてきました。

*注:Grunt、Backbone.js

Gruntは初期バージョン0.4.0が2013年2月にリリース、Backbone.jsの0.1.0は2010年10月にリリースされています。CodeGridではGruntが2013年3月、Backbone.jsは2012年11月に連載されています。

今だとReactやSvelte、VueなどのUIフレームワークを採用したツールなどですね。

そういうSPAを作るツールが、ここ数年、静的ジェネレーション機能を搭載し始めてるんですよね。具体的にはNext.jsSvelteKitNuxtJSとかがそうだと思います。

静的ジェネレーション機能を使えば、静的サイトジェネレーターのようなことができるので、今は、そういうSPAの流れからの静的サイトを作るというのと、昔ながらのJekyllみたいな流れのものというのが混ざり始めていているかなと。

ーーSPAを作るツールが、静的ジェネレーション機能を搭載し始めたのはどうしてでしょう?

中村:主にパフォーマンスの問題かな?

中野:そうですね。SPAはユーザーがアクセスしてきてから、いったんHTMLを読んで、必要なデータがあればクライアントサイドのJavaScriptがAPI経由でアクセスします。それらのデータを使ってJavaScriptがHTMLを生成するので、アクセスしてから表示されるまでが遅いんですよね。

中村:要は、Flashみたいに最初にローディングが走ってるのでよければいいんだろうけど、そうじゃなくてアクセスしたらすぐに速く表示させられるようにしたい、という流れがあったんですよね。

そのためにはサーバーサイドでHTMLを事前に作る、いわゆるSSRみたいな流れが出てきた。でも、それだとサーバーの制限とか厳しいから、じゃあ静的に先に生成しておいたらどうだろうというのが静的サイトジェネレーターに至るまでの道なのかなと思っていますね。

高津戸:SPAが流行ったときは「静的にサイトを作ろうぜ!」みたいには盛り上がっていたわけじゃないという印象でしたね。巷で流行ってんのは「SPAでイケてるUI作ろうぜ!」みたいな(笑)。ピクセルグリッドの仕事としても多かったんじゃないかな。

ただ、HTMLをちまちま手書きで作っていた我々みたいな人間からすると、PugとかHandlebarsとか、そういうテンプレートエンジンをうまく使ってなんかできないかなーって思いつつ、別に何か仕事には、大してつながらないというか、そういう感じでした。その頃は。

中村:そうですね。その頃はそうだったかも。

世の中でも流行り始めたのは、静的なサイトがいろんなSPAのツールでも出せるようになったところあたりかな。

Jamstackが出てきて、静的サイトジェネレーターでサイトを作るという手法が広まり、各種SPAツールが機能を搭載していったという印象ですね。

Gatsbyと静的サイトジェネレーター

中村:Gatsbyはその流れとは違って、SPAのようなサイトを吐き出すんだけど、Eleventyとかの静的サイトジェネレーターよりですね。

中野:Gatsbyが最初に静的サイトジェネレーターというか、SSGみたいなことをいっていたと思いますけど、Next.jsに静的サイトジェネレーター機能がつくのってそれよりちょっとあとですね。

補足:Next.jsのSSG機能

Gatsbyが2017年にv1をリリースした当初は「モダンな静的サイト生成」を可能にするツールとして自らを定義していたようです。Next.jsがSSG機能をサポートしたのは、2020年3月にリリースされたNext.js9.3からです。

中村:そうですね。

中野:Next.jsは、もともとはSSRのフレームワークだったのが、バージョンアップによってそういう機能が搭載された、という感じだったと思います。

中村:Next.jsは、以前は完全にSSRのライブラリだったんですよね。Gatsbyは、静的サイトジェネレーターに少しSPA的な要素を取り入れて、「静的とは呼べない動的なサイトを生成するジェネレーター」っていう感じかなと思っていて。多分、静的サイトジェネレーターの流れとそのSPAの流れと、両方取り込んだものだと思うんですよね。

高津戸:そうといえばそうですね。動的っていう言葉が、こうサーバーサイドで生成する動的って意味と、その画面上でダイナミックにUIが遷移するみたいな動的っていう意味があって、その意味でいうと、Gatsbyは静的。

中村:静的なファイルで、動的なサイトを構成するというイメージですよね。

高津戸:ページ間の遷移を、History APIなんかを駆使して画面上で済ませてしまい、パフォーマンスをマックスにするみたいな、そういう思想みたいな感じですね。その機能についていえば。

Gatsbyのドキュメントを見てもらうと、左のナビゲーションとかぼちぼちするとダイナミックにこうページが切り替わるんですよね。これはSPAみたいな設計、実装上はまあ、ひとつひとつHTMLを書くのに近いんだけど、それだけでこうダイナミックなSPA的な挙動を実現できるみたいになってんすよ。

中野:たとえば、top.htmlからabout.htmlへの遷移だとしたら、実際にabout.htmlという違うファイルを見に行っているのではなくて、クライアントサイドのJavaScriptがtop.htmlとabout.htmlの内容の差分を書き換えているという感じですね。

ーーいわゆる、SPA的意味での動的って意味ですよね。

高津戸:そうです。ダイナミックな挙動をしているけど、使うファイルっていうのは、あらかじめビルド時にJSONとかHTMLとか静的に生成されたもの使っていると。

でもややこしいのが、そこでサーバーサイドで動的に処理したい部分もあるってことですよね。だから、今のフレームワーク、Next.jsとかGatsbyとかは、そういう部分もカバーした存在になっているんですよ。

ーーなるほど、機能としてはありますよ、ということですね。

高津戸:そう、やろうと思えばできますよと。だから昔のJekyllとかそういうのと比べると、かなり包括的に広い範囲をカバーするような存在になって。もはやそれ自体のことはフレームワークと呼ぶようになっていて、静的サイトジェネレーターとあえて彼らは名乗らない。Gatsbyも、以前は「静的サイトジェネレーター」といってた気がしたんだけど。

補足:静的サイトジェネレーターとしてのGatsby

v1をリリースした当初のブログを参照してください。

中野:最近はいっていませんよね。

高津戸:ちょっと前までトップページに「フルスタックのフロントエンドフレームワーク」というようなことが書かれていた記憶があります。

AstroとEleventy

ーー最近の話でいうと、Astroはどうでしょうか。Eleventyとも、GatsbyやNext.jsともアプローチが違うのかな?

中村:Astroは、もともと静的サイトジェネレーターとして作られていて、最近はまたSSRの機能が付いたりしていますね。もうすぐ1.0が出る、新しい静的サイトジェネレーターですね。

Astro 1.0のリリース

この座談会は2022年7月に行われましたが、Astroは8月に1.0がリリースされています。Astroの詳細は、次のシリーズを参照してください。

AstroはSPAへの開発のフロー的なもの、コンポーネントだとかいいところは全部取り込んでるんだけど、吐き出したときにデフォルトではJavaScriptなしになるんですよね。Astroが目指してるのは「JavaScriptを減らして速いサイトにしよう」というところがあるのかなと。

最近Reactなどを使うのが当たり前になってきて、なんでもない、ただの静的サイトでもReactが読み込まれたりするじゃないですか。「静的なサイトだったらJavaScriptは必要ないのではないか? それのせいでパフォーマンスが悪くなっているんじゃないのだろうか?」として解決しようとしてるのが、Astroですかね。

中野:GatsbyとかNext.jsで、JavaScriptを使ってたくさんの機能を持ったサイトを作るようになったのに対する、なにかアンチテーゼ的なポジションだなって僕は思っていて。

そもそも、そういう大きいことをするのにそういうJavaScriptを使ったりするのはいいにしろ、静的サイトにはいらないよねってことかなと。

Eleventyがその仕組み自体は似たようなことしていて、JavaScriptがあまりないファイルを吐き出せるようなものでしたよね。でも、Eleventyは書き味が、モダンなReactやらVue.jsに備わる「コンポーネント化」っていう感じではない。Jekyllから来たHTMLのテンプレート言語で書くようなものだったので、それがやっぱりデベロッパー的にはつらい部分ではあったんです。

Astroはそういう部分がモダンなので「Astroが使いやすいな!」って、僕はなるんですね(笑)。

中村:僕は古い人なのでテンプレートベースの書き味は悪くないんですけど(笑)。でもEleventyを使ってて困るのが、現代のWebサイトで「JavaScriptは、やっぱりちょっと入れたいよね」っていうポイントはいっぱいあるところなんですよね。

たとえば、なんでもないサイトでも、モバイル時はハンバーガーのメニューでちょっとメニューが出せるとか、ちょっと検索の窓がついてるとかそういうことってあると思うんですね。

そういった場合にJavaScriptを使いたくてもEleventyは何もサポートしてくれないので、自分でどうJavaScriptを入れるかを考えないといけない。何かビルドするものを作るんだとしたら、全部自分でビルドプロセス組んでなんか考えなきゃいけない。そういうところが、Eleventyのちょっとつらいところだなと思っていますね。

そういう点からいうと、Astroのほかにも、Next.jsやGatsbyもReact限定になりますけどJavaScriptが前提になってるんでやりやすいのかなと思ってはいますね。

高津戸:担当した案件でもEleventyを使っていますけど、ビルドが結構めんどくさいんですよね。小さなパッケージみたいのを組み合わせたりしていて。

中村:JavaScriptの部分はSvelteでちょっとしたツールを作って自分でビルドして、ってなっていますよね。

それって、自由にできるっちゃあできるんですけど、組み合わせとかを自分で考えないといけないのはちょっとめんどくさいポイントですね。

高津戸:うん、そのめんどくささはあると思います。

ーーピクセルグリッドのコーポレートサイトは、EleventyからAstroに置き換えたんでしたよね。次回はそのあたりの実作業から得られたことをうかがいます。

現在、ピクセルグリッドで採用を検討する静的サイトジェネレーター(中村)

今回の座談会では古いものも含めて多くのツールの名前が挙がりました。中には現時点では古すぎたり、開発が継続されていなかったりするものもあり、今から採用はしないだろうなというツールもあります。

そこで、さまざまなツール名でいっぱいになっている頭をちょっとクールダウンしてもらうために、今、Webフレームワークや静的サイトジェネレーター(以下ツール)を選ぶとしたら、という視点で、今回出てきたツールの中からいくつかピックアップしてみます(記事公開時2022年9月の状況です)。

Next.js

SPAを作ろうとするなら、現在のトレンドからいくと、まず選択肢として挙がるツールです。現在も活発に開発がされています。

SvelteKit

もうすぐ1.0になる予定で現在RCが公開されています。1.0になっていないため「安定しているツール」とはいえません。しかし、パフォーマンスが重要なら採用を検討するツールです。

Eleventy

HTMLをテキストとして扱い完全にコントロールしながら生成するツールとして、採用を検討します。また、本文ではJavaScriptを追加しづらいという話になっていますが、2022年6月に<is-land>という仕組みができ、Svelte、Vue、PreactなどのコンポーネントをAstroのように追加できるようになったようです。 (社内プロジェクトはAstroに移行済みのため、社内ではまだ試せていません)

Astro

Astroは1.0になり、いわゆるWebアプリケーションよりはWebサイトに近いものを作るのであれば、社内にノウハウも溜まっていますし、利用する可能性の高いツールです。

Gatsby

Gatsbyが用意した範囲で構築でき、初回アクセス速度ではなく、ページ遷移の速度が最重要ということであれば採用するかもしれません。

中村 享介
PixelGrid Inc.
Jamstackエンジニア

2009年、JavaScriptの会社として株式会社ピクセルグリッドを設立。 多数のWebリニューアル、新規立ち上げを取り仕切った経験を持ち、情報設計、フロントエンド、クラウド活用、開発フローの効率化を得意とする。 Webをより発展させるため、新しくブラウザに実装された機能の活用事例を数多く生み出しつつ、日々、クラウドサービスを利用した効率のよい制作・開発手法の試行錯誤を続けている。現在の興味はWeb Componentsを使ったマークアップの改善とJamstack。 著書に『WebクリエイティブのためのDOM Scripting』(単著:毎日コミュニケーションズ、2007年)など。ここ数年は書籍の執筆をせず、フロントエンド技術情報メディア「CodeGrid」で精力的に執筆活動を行っている。

高津戸 壮
PixelGrid Inc.
テクニカルディレクター

Web制作会社、フリーランスを経て、株式会社ピクセルグリッドに入社。数多くのWebサイト、WebアプリケーションのHTML、CSS、JavaScript実装に携わってきた。受託案件を中心にフロント周りの実装、設計、テクニカルディレクションを行う。スケーラビリティを考慮したHTMLテンプレート設計・実装、JavaScriptを使った込み入ったUIの設計・実装を得意分野とする。 著書に『改訂版 Webデザイナーのための jQuery入門』(技術評論社、2014年11月14日)がある。 CSS Nite 2011ベストセッションにおいて、全170セッションの中から、ベスト10セッションに、CSS Nite 2013ベストセッションでは、全278セッション中、ベスト20セッションに選出。

矢倉 眞隆
PixelGrid Inc.
フロントエンド・エンジニア

2016年10月にピクセルグリッドへ入社。Web標準技術やブラウザの実装動向に明るく、イベントでの講演や雑誌・オンラインメディアへの原稿執筆、書籍の監修・監訳などを数多く経験。 Google Developer Expertとしても活動中。

中野 祐人
PixelGrid Inc.
Jamstackエンジニア

大学在学中にWeb制作に興味を持ち、アルバイトとしてWeb制作会社で勤務するほか、趣味でいくつかのWebサイトを制作する。最近ではJamstackでの開発に関心があり、Nuxt.jsやGridsomeなどのフレームワークを使ったWebサイトの制作を始める。2020年にピクセルグリッドに入社。

丸山 陽子
PixelGrid Inc.
編集

Mac雑誌の編集者を経験後、フリーランスのエディター/ライターとして独立。パソコン系雑誌やデジタルカメラ雑誌、iPhone/iPadの初心者向け書籍などの編集や執筆に携わる。2015年にピクセルグリッドへ入社し、「CodeGrid」の編集を担当する。

Xにポストする Blueskyにポストする この記事の内容についての意見・感想を送る

全記事アクセス+月4回配信、月額880円(税込)

CodeGridを購読する

初めてお申し込みの方には、30日間無料でお使いいただけます