Railsの難所についてと、therubyracerはすでに終わっていた話
Railsを使うとwebアプリを効率よく開発できて捗るのだが、初心者に自信を持ってオススメできるかというと怪しいと考えている。
ひとつは、Railsのコアコンセプトに「規約」という形でコードの書き方に縛りを導入することで実装量を激減させるというものがあり、それはそれで非常にワークしているのだが、その規約の背景にあるwebの基礎知識や流儀が曖昧なままなんとなく実装できてしまう点だ。ある程度webのことがわかっている人向けのフレームワークと言えるかもしれない。
ふたつめは、開発環境構築が鬼門な点だ。rubyにはrubygemsというライブラリの管理システムがある。Railsはたくさんのライブラリ(gem)を起動前にインストールする必要があるのだが、これが理不尽なエラーとともに失敗することが頻発する。慣れると対応策は分かってくるのだが、初心者だと「立ち尽くすしかない」と思う。
中でも、高頻度でインストール時に問題を起こす定番のハメgemがいくつかある。画像処理のrmagick、XMLを処理するNokogiriが有名だが、個人的にブッチでやばいのは therubyracer である。
therubyracer gem
therubyracerは、Javascriptの実行エンジンであるv8を叩ける用にしてくれるgemだ。Javascriptはwebの第一言語(英語みたいなもの)と言ってよく、開発・本番環境を問わず結局どこかで使うことになるので、rubyからもJavascriptを叩ける必要がある。
therubyracerは内部的にlibv8というgemを使ってv8エンジンをインストールしようと試みる。しかし、therubyracerが扱っているlibv8のバージョンが古く、結果としてインストールが困難な上に脆弱性の問題も抱えていた。
時代はmini_racerだった
前置きが長くなりましたが以下が本題。今週久しぶりに環境構築をした所、案の定therubyracerで止まり、「はいはい、またキミね」という感じだったのだが、なんとtherubyracerの後継としてmini_racerが爆誕しており、Rails本家にもマージされていた。
mini_racerはかなり新しいlibv8をハンドリングしている。試してみた所簡単にインストールが成功した。最新のv8の方が安定・高速なので、パフォーマンス的にも美味しい。これで、世のRailsエンジニア(およびその卵)の生産性はリアルに上がったと思う。まだtherubyracerを使っているようであれば、お手元のGemfileをサクッと書き換えてみることをおすすめしたい。
サーバーにnodeを入れて対応することも可能(execjsが検出してくれる)で、そちらのほうがパフォーマンスが良いことも十分ありえる(というかかなりある)ので、ベンチを取ってみて、工数見合いで各々検討願いたい。
まとめ
・Railsはヌルくないが、定期的に最新情報をウォッチすれば直接的なメリットがすぐに得られることが多い(更新が活発なことの裏返し)。
・このように、あるgemが突然最新の新gemに入れ替わっていることはよくある。そして旧gemはメンテされず、いつの間にかレガシーを抱え込むことに。
・単にtherubyracerを使ってるだけなら、まずはmini_racerに変更しよう。