2012.12.07
静的サイト生成という「古くて新しい手法」の復活
この数年くらいで、主にプログラマのあいだに、「静的サイト生成(static site generation)」への人気が復活しつつあるようだ。

「静的サイト生成」の「静的サイト(static site)」とは、ウェブサイトのすべてのページが、あらかじめHTMLファイルになっているようなウェブサイトを指す。データベースなどを使わず、HTMLファイルを手作業で作っているようなサイトは、すべて「静的サイト」である。

「静的サイト生成」とは、手作りで「静的サイト」を作るのではなくて、HTMLファイルをプログラム的に「生成」する手法を指す。データベースやテキストファイルにある「データ」と、デザインを定義する「テンプレート」をプログラム的に結合して、HTMLページを生成する、というのが典型的な手法だ。この生成プロセスを受け持つソフトウェアが「static site generator」である(以下、これを「サイトジェネレータ」と呼ぶ)。

サイトジェネレータは、一種のCMS(コンテンツ管理システム)と見なせる。CMSとは、かんたんに言えば、人間がコンテンツを入力すれば、ウェブサイト全体が自動的に生成されるシステムのことだ。数あるブログサービスのシステムや、ウィキペディアで使われているWikiシステムなどは、すべてCMSの一種と言える。

CMSがウェブサイトを自動的に生成する方式として、大きく分けて「動的(dynamic)」と「静的(static)」がある。「動的」とは、あらかじめHTMLを生成するのではなく、ウェブサイトに対して要求(HTTPリクエスト)が来たときに、リアルタイムにHTMLを生成して返す方法である。「静的」とは、先ほども書いたように、ウェブサイトの全ページのHTMLをあらかじめ生成しておく方法である(関連:「弁当屋の弁当は 「動的」 コンビニ弁当は 「静的」」)。

CMSのシステムとしては、一般に「動的」な方法のほうが単純になる。しかし「動的」な方法では、配信時にもWebサーバのうしろでCMSを常時動かしておく必要がある。これに対して「静的」な方法は、あらかじめHTMLを生成しなければいけないぶん、CMSのシステム的には複雑になるが、配信時にはWebサーバだけがあればよく、CMSを動かす必要がない。

CMSは「動的」がいいか、「静的」がいいかというのは、それぞれにメリット・デメリットがあり、考慮すべきポイントも多岐にわたるので、一概には言えない。しかし、大まかな考え方としては、規模が大きく、更新が多いサイトでは「動的」が向いていて、規模が小さく、更新が少ないサイトは「静的」が向いている、とは言えると思う。

いわゆるブログは、おおむね「規模が小さく、更新頻度が少ないサイト」に分類できる。よってブログは、「静的サイト生成」に向いていると言える。最近、プログラマのあいだでサイトジェネレータが流行りはじめたのは、ブログ程度のサイトに動的なCMSは不要だと感じる人が増えてきて、手軽なツールを作ってしまおうという機運が高まり、道具や環境が充実してきた、といった流れがあるようだ。

プログラマが使うサイトジェネレータで最も人気があり、サイトジェネレータ流行のきっかけにもなったのが、Rubyで書かれた「Jekyll」である(「ジキルとハイド」の「ジキル」)。Jekyllの作者、Tom Preston-WernerGitHub(ギットハブ)社の創業者・CEOでもあり、JekyllはGitHubというサービスの人気化とあわせて、定番化していった。いまのところ、まだJekyllがいちばん人気があるようだが(関連:「Poll: What's your favorite static site generator?」)、Jekyllに影響を受けたサイトジェネレータが多数出てきている。

静的サイト生成という手法そのものは、CMSの初期から存在していた。ブログツールの走りだった初期「Movable Type」も、静的サイト生成型だった。しかしこの頃は、レンタルサーバが主体で、自前でCMSのサーバを常時起動できない、といった制約が大きかった。マシンパワーも非力で、動的サイトでは一定以上のアクセスをさばけない、といった理由もあったと思う。つまり、この頃の静的サイト生成というのは、主に「制約」から導かれた手法だった面が大きい。

しかし最近の静的サイト生成の流行は、「制約」から導かれたというよりも、「よりシンプルなソリューション」を求めるという、プログラマ的な動機から出ている。サイトジェネレータを作ったり、使ったりしているプログラマは、概して技術力が高く、技術的にはなんの制約もない。いまはマシンパワーもありあまっているので、動的なシステムを動かすのが苦しいわけでもない。単に、「よりシンプルなソリューション」を求めるという動機から、ブログシステムを単純化していった結果、静的サイト生成に回帰したような感じだ。

もうひとつ、最近のサイトジェネレータの特徴は、「データベースを使わない」という点である。データベースを使うタイプのサイトジェネレータもあるにはあるが、Jekyllをはじめとして、多くのサイトジェネレータは、データベースを使わない。単にテキストファイルを使って、そこにブログエントリを書いていくのだ。記述フォーマットはHTMLではなく、Markdownなどの簡易フォーマットが主流である。これは動的なブログシステムやWikiでもよく使われている。

データベースを使わず、ただのテキストファイルを使う利点は、主に次のようなものだ。

1)データベースサーバを動かさなくてもいい
2)ブラウザの管理画面が不要で、テキストファイルに直接書き込めばいい
3)テキストファイルベースなので、バージョン管理がしやすい

この3点は、プログラマであればよくわかるのだが、ほんとうに大きな違いを生む。逆にいえば、プログラマであれば、この3点は大きな違いを生むのだが、ユーザが一般の人である場合、この方法はなかなか使えないのだ。

サイトジェネレータを使うには、およそこういう手順を踏む。

- Jekyllなどのサイトジェネレータをインストール
- Gitなどでローカルリポジトリを作る
- テキストエディタを開く
- Markdownなどでブログを書く
- コマンドでHTMLを生成
- ローカルリポジトリにコミット
- リモートリポジトリにプッシュ

プログラマであれば、こういう一連の作業は、それほど苦労せずにできる。しかし、システムのユーザが一般の人で、かつ複数である場合は、これをやらせるわけには行かない。やはり、ブラウザベースの管理画面があって、そこからウェブサイトのHTMLを生成する、といったシステムが必要になる。これだと、いわゆるCMSとあまり変わらないし、大抵の場合はデータベースが必要になる。

つまり、サイトジェネレータというのは、ユーザが基本的に1人であり、かつそのユーザがプログラマのようなIT技術を持った人である、ということを前提にしているのだ。だからこそ、システムを簡略にできる。

しかし、いまのところはプログラマのあいだだけで流行しているサイトジェネレータだが、この「静的サイト生成」復活の流れは、いわば「パラダイムシフト」であり、今後おそらくウェブベースの情報システム全体に波及していくだろう、と私は考えている。「静的サイト生成」は、配信時のシステムを簡略にして、パフォーマンスや可用性(サービスが止まらないこと)を大きく上昇させる。現在でも、動的サイトではさまざまなキャッシュを使うなど工夫が凝らされているが、静的サイトを生成してしまうのが、いちばんシンプルである。

ブログサービスなどで、よくメンテナンス中に見れなくなっているものがある。こういうサービスも、静的サイト生成になっていれば、メンテナンス中であっても、見るだけはできるはずなのだ。サイト自体がまったく見れないというのは、ビジネス的にも大きな損失だろう。社会のなかでネットがますます大きな役割を果たすようになるにつれ、サイトがまったく見れないということは、社会的損失にもつながりかねない。最低でも「見るだけはできる」という状態をキープすることは、今後ますます重要になってくるだろう。よって、静的サイト生成という「古くて新しい手法」は、今後ますます普及していくものと思う。


関連:
Hacker News - Poll: What's your favorite static site generator?
http://news.ycombinator.com/item?id=4857473
GitHub - Jekyll
https://github.com/mojombo/jekyll

関連エントリ:
GitHubはオープンソースの世界をどう変えたか
http://mojix.org/2011/03/09/github-open-source
CMSにおける「コンテンツ」のフォーマット問題
http://mojix.org/2008/07/23/cms_content_format
弁当屋の弁当は 「動的」 コンビニ弁当は 「静的」
http://mojix.org/2006/01/06/202935