ついにRails 3.1がリリース、体感速度が速くなる!?
Ruby on Railsの最新バージョン、Ruby on Rails 3.1.0が日本時間だと昨日(2011年8月31日)、リリースされました。今日(9月1日、米国時間だと8月31日)になってから公式ブログにもアナウンスが出ました。
英語の情報源になってしまいますが、読むべきWebページを列挙しておきましょう。
- 公式ブログのリリースノート:変更点が簡潔にまとまっています
- RailsGuidesのRails3.1 リリースノート:ズラズラズラっと解説+コード+箇条書きで変更点がまとまっています。RailsGuidesのほかの項目同様に力作です
- RailsGuidesのAsset Pipelineの解説:Asset Pipelineについていちばん良くまとまっています
このブログでも何度か取り上げていますが、今回のバージョンアップは非常に大きなものです。すでにRails 3.0系でメジャーバージョンアップは果たしているわけですが、3.0は、本当のRails3とも言うべき3.1への準備のステップでした。3.1に入った機能が枯れて落ち着くバージョン3.2こそが、Rails3の長らく使われるバージョンになるだろう、というのは、日本人としてRailsに最も多くパッチをコミットしている松田明さんの読みです。
Rails 3.1の注目ポイントを簡単にまとめると、
- デフォルトのJavaScriptライブラリがPrototype.jsからjQueryに変更
- Asset Pipelineと呼ぶ仕組みの採用
- JavaScriptへコンパイルできるRubyっぽい文法のCoffeeScriptの採用
といったところでしょうか。
実は体感速度が上がる?
先日、松田さんとの会話で指摘されて気付いたことですが、Rails3.1では、開発者が使うAPIもいろいろと変わっていますが、何よりも「Railsで書いたWebアプリの体感速度が速くなる」のが大きな違いかもしれません。
Rails3.1が速くなる最大の理由は、Asset Pipelineによって、ゴチャゴチャとたくさんあったサイズの小さなファイル群がまとめられることで、HTTPリクエストの数が大幅に減ると期待できるからです。「HTTPのリクエスト数を減らせ」というのは、Yahoo!のYslowチームがWebサイト高速化の最優先テクニックとしているものですよね。
Asset Pipelineを使えば、JavaScriptやCSS、画像などのファイル(asset:アセットと呼んでいます)を、asset以下のサブディレクトリに整理して配置できます。“パイプライン”と呼んでいるのは、HTTPでこれらのアセットをサーブするときに、何らかの処理を施しつつ出せる「パイプ」の役割を果たすからです。処理というのは具体的には、CoffeeScriptのコンパイル、複数JavaScriptファイルの連結やminify、CSSテンプレート言語(SCSS)の変換、そしてCSSファイルの連結や圧縮(無駄な記述の消去)、CSSスプライティングといったことです。
今までpublicの下に放り込んであって「Railsアプリの外」という感じで雑然と扱われていたファイルたちが、きちんと整理されるという意味で、スッキリします。開発時にはCSSファイルを意味的に分離しておいて、実際にサーブするときにはapplication.cssだけにまとめるという処理が自動的にできるようです。これまでのRailsにも連結機能があったものの、それを使わない開発者も多かったといいます。
Asset Pipelineには「Sprockets」という既存ライブラリが使われていますが、同様の役割を果たすものは、ほかにも「Jammit」「Stitch」などがありました。それぞれに強みや思想が異なっていたようで、Sprocketsが本当にベストだったのかというような議論もあるようですね。特に、CSSスプライティングについては、今のところSprocketsでは上手く機能していないという話です(情報求ム)。であれば、Asset Pipelineも取り替え可能なモジュールであれば良いのに、という気がしなくもありません。
ともあれ、Rails3.1になることでHTTPのリクエスト数が減りそうだということは間違いありません。
もう1つ、体感速度の向上に貢献しそうなのは、HTTP Streamingです。HTTPセッションを維持したまま、チャンクで次々とクライアントにデータを送る方法ですが、Railsで使って何が嬉しいかというと、サーバ上でページのレンダリング(SQLによるデータのレトリーブやテンプレート適用)をしている最中にもJavaScriptやCSSをクライアントのブラウザに送り出し始められることです。場合によっては、100msecぐらい稼げてしまうかもしれませんよね。
さて、やや無理矢理、Rails3.1ではWebアプリが速くなるかもしれないと書きましたが、Rails3.2では体感速度に影響しそうなPjaxの取り込みも控えていますし、「体感速度向上」は、1つの方向性じゃないかなと思います。Pjaxについては、以下の3つのブログ記事が参考になると思います。