Rails资产管道和摘要值

mat*_*sko 6 ruby rake ruby-on-rails sprockets asset-pipeline

有谁知道资产摘要值究竟是如何计算的?如果我有两个包含各种其他包含的JS脚本的JS文件,那么如果没有更改内部脚本,那么每个文件是否会保持相同的摘要哈希?或者是每次资产:预编译操作运行时计算的新摘要值?

kra*_*zky 42

接受的答案并不完全正确.我们为登台,演示和生产服务器构建静态资产,并且在每种情况下为相同的资产提供不同的摘要值.

事实证明,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
Run Code Online (Sandbox Code Playgroud)

Rails按如下方式挂钩到Sprockets:

# Sprockets::Railtie
app.assets = Sprockets::Environment.new(app.root.to_s) do |env|
  env.version = ::Rails.env + "-#{config.assets.version}"
  ...
end
Run Code Online (Sandbox Code Playgroud)

因此rails创建了一个Sprockets环境,其版本等于Rails环境,Sprockets在创建摘要类时使用该版本.


小智 1

从导轨上抓取

当文件名是唯一的并且基于其内容时,可以设置 HTTP 标头以鼓励各处缓存(无论是在 CDN、ISP、网络设备还是 Web 浏览器中)保留自己的内容副本。当内容更新时,指纹也会发生变化。这将导致远程客户端请求内容的新副本。这通常称为缓存清除。

Rails 用于指纹识别的技术是将内容的哈希值插入到名称中(通常在末尾)。例如,CSS 文件 global.css 可以使用其内容的 MD5 摘要进行重命名