RailsでSass Sourcemapを使ってみる

/ 24日目/ 5週目・学習週 コメント

Rails4だと、

を使うと、最新のChromeでSassのSourcemap(v3)が使える

Gemfileに

group :development, :test do
  gem 'sass-rails-source-maps'
end

と書いて、

$ bundle update sass

として、サーバをリスタート。ChromeのDeveloper Tools > 設定(ギアアイコン) > General > Enable CSS source maps をオンにしておく。 これで、通常どおりの要素のインスペクトでscssファイルが表示されるはず(*.sassには未対応なのか普通のcssが表示される)。

参考:

[追記:2013-11-23]

Safari7でも同様にscssのインスペクトができた。

さらに追記。*.sassファイルのSourcemapが作られないのは、どうやらSprocketsのメソッドのオーバーライドに失敗してるかららしい。RubyのインスタンスメソッドをModuleのメソッドでオーバーライドするにはちょっとしたノウハウが必要らしい。

参考:

*.scssの場合に動いてるのは、Sprockets::ScssTemplateSprockets::SassTemplateを継承していて、定義にはメソッドがないから、includeしたモジュールのメソッドが優先されるためかな・・・。*1

ということで、Pullreqを送ってみた。

Pullreq送るときは緊張する・・・。

Compassを一緒に使う場合、バージョンに注意

sass-rails-source-mapsがsassの3.3.0.alpha以上に依存しているので、Gemfileで次のようにバージョン指定する。

gem 'compass', '~> 0.13.alpha.10'

あと、余談ですが、compass-railsというGemを使えば設定なしでCompassが使えるはずなんだけど、

`require': cannot load such file -- sass/script/node (LoadError) 

とか、compassのimportエラーが出てうまく行かない。

にあるように、initializers/compass.rbなどに

Rails.configuration.assets.paths << Compass::Frameworks['compass'].stylesheets_directory

と書くことでCompassが使えるようになった。

*1

の検証のために次のようなコードを書いてみたが、予想と異なる結果に。こうなると、元のコードがどうして動いているのかがわからない。デバッガも入れて動作を追ってみたけれど、結局分からずじまい。見逃している点がありそうで不安。まあ、間違ってたらPullreqのDiscussionで指摘してくれるだろう。

追記:予想通りの動作が再現出来ました

module Original
  class Klass
    def overridden
      puts 'original'
    end
  end
  class Successor < Klass
  end
end

Original::Klass.new.overridden #=> 'original'
Original::Successor.new.overridden #=> 'original'

#
# Override1
#
module Override1
  module Klass
    def overridden
      puts 'override 1'
    end
  end
end

Original::Klass.class_eval do
  include Override1::Klass
end

Original::Successor.class_eval do
  include Override1::Klass
end

Original::Klass.new.overridden #=> 'original'
Original::Successor.new.overridden #=> 'original' ここがoverride1になると期待してた :(

#
# Override2
#
module Override2
  module Klass
    def self.included base
      base.class_eval do
        def overridden
          puts 'override 2'
        end
      end
    end
  end
end

Original::Klass.send(:include, Override2::Klass)
# Original::Successor.send(:include, Override2::Klass) # This isnt needed

Original::Klass.new.overridden #=> 'override 2'
Original::Successor.new.overridden #=> 'override 2'

コメント