SlideShare a Scribd company logo
1 of 44
Download to read offline
僕はどうしてもlibsass
が使いたかったんだ!
@joe-re
自己紹介
• 名前: joe-re(じょー)
• freeeという会社で働いています
• この前までクラウド会計やってましたが、

今はクラウド給与計算やってます
前にもSprocketsを捨てたいLTした
ことがあるので資料貼ってみます
• http://www.slideshare.net/
masatonoguchi169/sprockets-49965435
Sprocketsを捨てるには
2つの道がある
Railsのassets pipelineを一切
使わない!の道
• gulp等のビルドツールを使い、concat、
minify、uglify、fingerprint付与などの
Sprocketsさんがやっている仕事を全部奪う
• 成果物はPublic配下に出力する
• まさしく理想の世界!
Railsのassets pipelineを一切
使わない!の壁
• fingerprintの解決が難しい
• フロント側で単純に付与しただけでは、Railsの
asset_pathヘルパーが一切効かなくなる
• manifest.jsonを生成することでRails側に伝えること
は可能だが、こいつはライブリロードされない
• 一気にやらないといけない作業の量やばすぎ
フロント側の成果物をapp/assets
に吐き出す!の道
• concat、uglify、minify、fingerprintなどの処
理は従来通りSprocketsにお任せ!
• まだフロントで解決できないものは、とりあ
えずapp/assets配下にそのままコピーしてお
けば何とかなるので、徐々に作業可能
フロント側の成果物をapp/assets
に吐き出す!の壁
• 結局Sprocketsから脱却できてない
• 常にSprocketsとの良好な関係を

意識し続けなければプロダクトが死ぬ
今回は
app/assets配下に
gulpで生成した成果物を
出力する道を選んだ
場合の話です
それから僕たちは少しづつ
Sprocketsから距離をおき始めたんだ
• jsのビルドはwebpackで!
• es6-modulesで依存関係を定義
• styleのビルドはnode-sass使う!
• などなど
jsのビルド構築にも数々の
ドラマがありましたが
今回はstyleのビルドの
話をします
そもそも僕たちの
プロダクトには
styleのビルド改善に
早く着手しなければならない
重大な問題があったのだ
Sprocketsで
出力しているassetsは、
ファイルに変更がないとき、
キャッシュが効きます!
つまり前回と同じassetsを
使うので、ビルドしません
しかしキャッシュが
効かない時、恐ろしい現象が
起きていました
普段10分ぐらいの
デプロイ時間がなんと
(゜Д゜) !?
やばい
原因は、複雑に処理を
定義していたscssファイルの
ビルド時間でした
そこに颯爽と登場するlibsass!
• Ruby に依存しないですげー早いyabeeeや
つ!
• libsassはC/C++ 実装なsassのコンパイラーだ
けど、node-sassでnode.jsの世界で扱うこと
ができる
Ruby Sass, LibSass – What's
the Difference?
http://sassbreak.com/ruby-
sass-libsass-differences/
ローカルで試しにかけて
みたところ、なんとstyle
のビルド時間は1分!
こいつだ、こいつしかねぇ
そこに立ちはだかる2つの壁
1. 複数エントリーポイントが
あるときの依存関係
(@import)の解決
2. asset_pathヘルパーの解決
複数エントリーポイントがあるときの
依存関係を解決するにあたっての課題
• いくら速いとはいえ、開発中にファイルを変更するた
びに1分のビルドが走るのは苦痛。差分だけビルドし
たい。
• もともとstyleはページ単位で分割していたため、エン
トリーポイントが複数ある。
• 単純に変更のあったファイルをビルドするだけだと、
@import元を れない
いや、でも待てよ
node-sassの
watchオプションって
@import ってるよな
あれどうやってるんだ??
というわけで解決した
• http://qiita.com/joe-re/items/
542b3f6fdc577cf50509
• node-sassは、sass-graphというnpmを使って っ
ていた
• こいつをgulp taskに組み込んだ
• ビルド時間が0.1secに!
こんな感じ
asset_pathヘルパーを
解決するにあたっての課題
• sassにはasset_pathヘルパーなんてもちろんない
ので、解決してくれない
• Sprocketsにはcssのプロセッサーがないので.css
ではasset_pathを解釈しない
• 自分でSprocketsのプロセッサー作ればいけるの
かも?
腕力で解決を図る
無理やり.css.erbに変換する
か。erbなら余計な処理もな
くて軽いでしょ
というわけで解決した
• http://qiita.com/joe-re/items/
a3366421b5fc538f6eae
• lib-sassをかけた上で、gulp task内で正規表現
を使ってsassのasset_helperの記法を無理やり
erbの記法に置換する
こんな感じ
お前それかっこいいと
思ってんの?
思ってませんすみません
もっと良いやり方ご存知の方
教えてください
是非お願いします
かくして僕たちは手に入れた
ワーイヽ(゚ ゚)メ(゚ ゚)メ(゚ ゚)ノワーイ
おわり

More Related Content

What's hot

ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発Takafumi ONAKA
 
WindowsユーザのためのRails環境構築
WindowsユーザのためのRails環境構築WindowsユーザのためのRails環境構築
WindowsユーザのためのRails環境構築Hirata Tomoko
 
ぼくのかんがえたさいきょうの Rails スタートダッシュ
ぼくのかんがえたさいきょうの Rails スタートダッシュぼくのかんがえたさいきょうの Rails スタートダッシュ
ぼくのかんがえたさいきょうの Rails スタートダッシュKenji Mori
 
20101009 gunma.web#2 スタパさんをつくるはなし
20101009 gunma.web#2 スタパさんをつくるはなし20101009 gunma.web#2 スタパさんをつくるはなし
20101009 gunma.web#2 スタパさんをつくるはなしivoryworks .
 
Rails5クイックスタート
Rails5クイックスタートRails5クイックスタート
Rails5クイックスタートHirata Tomoko
 
Rails+Markdownでなにかつくる
Rails+MarkdownでなにかつくるRails+Markdownでなにかつくる
Rails+MarkdownでなにかつくるHirata Tomoko
 
Ember コミュニティとわたし
Ember コミュニティとわたしEmber コミュニティとわたし
Ember コミュニティとわたしRyunosuke SATO
 
How to relaunch "sapporojs.org" ~Introduction to middleman~
How to relaunch "sapporojs.org" ~Introduction to middleman~How to relaunch "sapporojs.org" ~Introduction to middleman~
How to relaunch "sapporojs.org" ~Introduction to middleman~Ryunosuke SATO
 
MySQL Fabricつらい
MySQL FabricつらいMySQL Fabricつらい
MySQL Fabricつらいyoku0825
 
Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発Koichi Shimozono
 
PHPでWebSocketを実装してみてわかったこと
PHPでWebSocketを実装してみてわかったことPHPでWebSocketを実装してみてわかったこと
PHPでWebSocketを実装してみてわかったことksimoji
 
Sinatra軽量Web開発 - LOUPE Study #1
Sinatra軽量Web開発 - LOUPE Study #1Sinatra軽量Web開発 - LOUPE Study #1
Sinatra軽量Web開発 - LOUPE Study #1Takuya Mukohira
 
Rubyで作るクローラー Ruby crawler
Rubyで作るクローラー Ruby crawlerRubyで作るクローラー Ruby crawler
Rubyで作るクローラー Ruby crawlerTakuro Sasaki
 
Railsバージョンアップを 段階的に行うために Rails3/4並行稼動させる仕組み を作ってる話
Railsバージョンアップを段階的に行うためにRails3/4並行稼動させる仕組みを作ってる話Railsバージョンアップを段階的に行うためにRails3/4並行稼動させる仕組みを作ってる話
Railsバージョンアップを 段階的に行うために Rails3/4並行稼動させる仕組み を作ってる話Masayuki Morita
 
Nodeにしましょう
NodeにしましょうNodeにしましょう
NodeにしましょうYuzo Hebishima
 
これからはじめるひとのためのdev.mysql.com
これからはじめるひとのためのdev.mysql.comこれからはじめるひとのためのdev.mysql.com
これからはじめるひとのためのdev.mysql.comyoku0825
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門Yasuko Ohba
 

What's hot (20)

片手間JS on Rails
片手間JS on Rails片手間JS on Rails
片手間JS on Rails
 
ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発
 
すこやかRails
すこやかRailsすこやかRails
すこやかRails
 
WindowsユーザのためのRails環境構築
WindowsユーザのためのRails環境構築WindowsユーザのためのRails環境構築
WindowsユーザのためのRails環境構築
 
ぼくのかんがえたさいきょうの Rails スタートダッシュ
ぼくのかんがえたさいきょうの Rails スタートダッシュぼくのかんがえたさいきょうの Rails スタートダッシュ
ぼくのかんがえたさいきょうの Rails スタートダッシュ
 
20101009 gunma.web#2 スタパさんをつくるはなし
20101009 gunma.web#2 スタパさんをつくるはなし20101009 gunma.web#2 スタパさんをつくるはなし
20101009 gunma.web#2 スタパさんをつくるはなし
 
Rails5クイックスタート
Rails5クイックスタートRails5クイックスタート
Rails5クイックスタート
 
Rails+Markdownでなにかつくる
Rails+MarkdownでなにかつくるRails+Markdownでなにかつくる
Rails+Markdownでなにかつくる
 
Ember コミュニティとわたし
Ember コミュニティとわたしEmber コミュニティとわたし
Ember コミュニティとわたし
 
How to relaunch "sapporojs.org" ~Introduction to middleman~
How to relaunch "sapporojs.org" ~Introduction to middleman~How to relaunch "sapporojs.org" ~Introduction to middleman~
How to relaunch "sapporojs.org" ~Introduction to middleman~
 
MySQL Fabricつらい
MySQL FabricつらいMySQL Fabricつらい
MySQL Fabricつらい
 
Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発
 
RSpecしぐさ
RSpecしぐさRSpecしぐさ
RSpecしぐさ
 
PHPでWebSocketを実装してみてわかったこと
PHPでWebSocketを実装してみてわかったことPHPでWebSocketを実装してみてわかったこと
PHPでWebSocketを実装してみてわかったこと
 
Sinatra軽量Web開発 - LOUPE Study #1
Sinatra軽量Web開発 - LOUPE Study #1Sinatra軽量Web開発 - LOUPE Study #1
Sinatra軽量Web開発 - LOUPE Study #1
 
Rubyで作るクローラー Ruby crawler
Rubyで作るクローラー Ruby crawlerRubyで作るクローラー Ruby crawler
Rubyで作るクローラー Ruby crawler
 
Railsバージョンアップを 段階的に行うために Rails3/4並行稼動させる仕組み を作ってる話
Railsバージョンアップを段階的に行うためにRails3/4並行稼動させる仕組みを作ってる話Railsバージョンアップを段階的に行うためにRails3/4並行稼動させる仕組みを作ってる話
Railsバージョンアップを 段階的に行うために Rails3/4並行稼動させる仕組み を作ってる話
 
Nodeにしましょう
NodeにしましょうNodeにしましょう
Nodeにしましょう
 
これからはじめるひとのためのdev.mysql.com
これからはじめるひとのためのdev.mysql.comこれからはじめるひとのためのdev.mysql.com
これからはじめるひとのためのdev.mysql.com
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門
 

Viewers also liked

Gulp入門 - コーディングを10倍速くする
Gulp入門 - コーディングを10倍速くするGulp入門 - コーディングを10倍速くする
Gulp入門 - コーディングを10倍速くするHayashi Yuichi
 
gulp-sprockets、あるいはRailsのAssetsのビルドについて
gulp-sprockets、あるいはRailsのAssetsのビルドについてgulp-sprockets、あるいはRailsのAssetsのビルドについて
gulp-sprockets、あるいはRailsのAssetsのビルドについてyo_waka
 
Linux tuning to improve PostgreSQL performance
Linux tuning to improve PostgreSQL performanceLinux tuning to improve PostgreSQL performance
Linux tuning to improve PostgreSQL performancePostgreSQL-Consulting
 
Visual Studio Code 入門
Visual Studio Code 入門Visual Studio Code 入門
Visual Studio Code 入門Saki Homma
 
雑なMySQLパフォーマンスチューニング
雑なMySQLパフォーマンスチューニング雑なMySQLパフォーマンスチューニング
雑なMySQLパフォーマンスチューニングyoku0825
 

Viewers also liked (6)

Gulp入門 - コーディングを10倍速くする
Gulp入門 - コーディングを10倍速くするGulp入門 - コーディングを10倍速くする
Gulp入門 - コーディングを10倍速くする
 
gulp-sprockets、あるいはRailsのAssetsのビルドについて
gulp-sprockets、あるいはRailsのAssetsのビルドについてgulp-sprockets、あるいはRailsのAssetsのビルドについて
gulp-sprockets、あるいはRailsのAssetsのビルドについて
 
CSS Living StyleGuide
CSS Living StyleGuideCSS Living StyleGuide
CSS Living StyleGuide
 
Linux tuning to improve PostgreSQL performance
Linux tuning to improve PostgreSQL performanceLinux tuning to improve PostgreSQL performance
Linux tuning to improve PostgreSQL performance
 
Visual Studio Code 入門
Visual Studio Code 入門Visual Studio Code 入門
Visual Studio Code 入門
 
雑なMySQLパフォーマンスチューニング
雑なMySQLパフォーマンスチューニング雑なMySQLパフォーマンスチューニング
雑なMySQLパフォーマンスチューニング
 

僕はどうしてもLibsassが使いたかったんだ!