アセットダイジェスト値がどのように正確に計算されるか知っている人はいますか?含まれている他のさまざまなJSスクリプトを含む2つのJSファイルがある場合、内部スクリプトが変更されていなければ、各ファイルは同じダイジェストハッシュを維持しますか?または、assets:precompile操作が実行されるたびに新しいダイジェスト値が計算されますか?
2 に答える
受け入れられた答えは完全に真実ではありません。ステージングサーバー、デモサーバー、本番サーバー用に静的アセットを作成します。同じアセットには、それぞれ異なるダイジェスト値が与えられます。
Rails環境も考慮されていることがわかります。Sprocketsは次のようにダイジェストを作成します。
# Sprockets::Environment::initialize
@digest_class = ::Digest::MD5
# Sprockets::Base::digest
@digest ||= digest_class.new.update(VERSION).update(version.to_s)
# Sprockets::Base::file_digest(path)
digest.file(path.to_s)
# Sprockets::Asset::initialize
@digest = environment.file_digest(pathname).hexdigest
Railsは次のようにスプロケットにフックします。
# Sprockets::Railtie
app.assets = Sprockets::Environment.new(app.root.to_s) do |env|
env.version = ::Rails.env + "-#{config.assets.version}"
...
end
したがって、railsはRails環境と同じバージョンのSprockets環境を作成しており、Sprocketsはダイジェストクラスを作成するときにそのバージョンを使用します。
Railsガイドから取得
ファイル名が一意であり、そのコンテンツに基づいている場合、HTTPヘッダーを設定して、あらゆる場所(CDN、ISP、ネットワーク機器、またはWebブラウザー)のキャッシュがコンテンツの独自のコピーを保持するように促すことができます。コンテンツが更新されると、指紋が変更されます。これにより、リモートクライアントはコンテンツの新しいコピーを要求します。これは一般にキャッシュバスティングとして知られています。
Railsがフィンガープリントに使用する手法は、コンテンツのハッシュを名前に挿入することです。通常は最後に挿入します。たとえば、CSSファイルglobal.cssは、その内容のMD5ダイジェストで名前を変更できます。