西日暮里.rbでSprocketsを捨てたいという内容のLTをした

西日暮里.rbの1周年記念LT大会でSprocketsを捨てたいというLTをさせてもらった。

かれこれ2週間ぐらい前の話。ただでピザ食べられて、ビールも飲めて、ほんと最高だった。

資料

www.slideshare.net

今回資料結構詳しく書いた(発表する時間が全然足りなかった。。反省。)ので、内容は置いといて気持ちを中心に追記する。

Sprocketsを捨てたいという気持ちについて

最近のフロントエンド衰勢はほんとに早い。
気を抜くとすぐ「まだxxで消耗してるの??」と言われて、むきー!となる。

あと煽り属性強めな人多い。(それはそれでいいところ、というか僕は好き。でもある程度の煽り耐性必要。)

そんな環境の中でSprocketsというのは、はっきりいってしまえば邪魔。

reactを使うためには、react-railsを使わなければいけない?
browserifyを使うために、browserify-railsを使わなければいけない?

そんな世界はもういやだ!

このruby gems達は果たして、常に最新を追っていけるのか。
reactやbrowserifyならば、今は人気もあって、メンテしていくモチベーションもあるだろう。
しかし、それがどこまで続くのかは保証がない。

ライブラリが廃れても、今走っているプロダクトは止まれない。
好きなライブラリを使う!という意思表示は、プロポーズと似ている。

一度選んだからには、真摯に付き合わなくてはならない。(とはいえ移行計画は進めつつ。。)

例えgemは最新を追っていたとしても、依存関係のあるgemやRailsのバージョンなどが、なんらかの事情ですぐに最新にあげるのが難しい場合もあるだろう。

Railsのバージョンとgemのバージョンが合わなくて最新ライブラリ使えません。 ><

そんなハメには陥りたくないんです!!

という気持ち。

資料の最後に書いた課題について

以下の3つが課題かなー、と資料に書いた。

  1. 移行するにあたってSprocketsの付与しているmd5フィンガープリントをどうするか
  2. Sprocketsのrequireディレクティブをどうやって撲滅するか
  3. gemにassetsが含まれているやつらの対処

その後の展望的なものを備忘録的に記す。

移行するにあたってSprocketsの付与しているmd5フィンガープリントをどうするか

もちろんgulpタスクでファイルの末尾に何らかの文字列を付与するのは簡単。

なんだけど、それを愚直にやってしまうと、Railsのasset_pathヘルパーメソッドが効かなくなるという問題が発生する。

会社でこれ問題だなーって話してたら、先輩とか同僚とかに色々アイディアもらった。
「筋がいいなー、これがいいなー」と思ったのは、gulpでビルドした時に付与した文字列を一旦どこかに出力しておいて、それをRailsが見に行くようにするというアイディア。

この仕組み作れればこれはなんとかなりそう。今度asset_pathメソッドの仕組み読んでみて、実装を模索しよう。

Sprocketsのrequireディレクティブをどうやって撲滅するか

Sprocketsのrequireディレクティブとbrowserifyのrequireは共存できない。
Sprocketsのrequireディレクティブが存在する状態でbrowserifyかけると、Sprocketsのrequireディレクティブは死ぬ。

これを解決するためには、browserify-railsを使うか、単純にファイル単位で置き換えて、置き換えできたものにだけbrowserifyをかければ良い。

ファイル単位に置き換えていくのはつらい作業だけど、xxxx-railsなgemは使いたくない。必要なのは気合いと根性だ。

gemにassetsが含まれているやつら

jsライブラリなら殆どはnpmにあるので困らないと思う。 だけどviewをgenerateする機能があって、styleもあててるようなやつはどうするか。 (管理画面作る系のgemにありがちな気がする。。)

資料にも書いたけど、そのgemやめるのが近道。それかそのgemのassetsだけリポジトリにコミットして管理する荊の道を歩くか。

Sprockets完全撤廃にこだわらないのであれば、この解決だけSprocketsでもいいかも。

最後に

西日暮里.rb、1周年ほんとにおめでとうございます!