有谁知道资产摘要值的确切计算方式?如果我有两个包含各种其他包含的JS脚本的JS文件,那么如果没有更改内部脚本,那么每个文件是否会保持相同的摘要哈希?或者是每次运行资产:预编译操作时计算的新摘要值?
答案 0 :(得分:43)
接受的答案并不完全正确。我们为登台,演示和生产服务器构建静态资产,并且在每种情况下为相同的资产提供不同的摘要值。
事实证明,Rails环境也被考虑在内。链轮创建摘要如下:
# 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,如下所示:
# Sprockets::Railtie
app.assets = Sprockets::Environment.new(app.root.to_s) do |env|
env.version = ::Rails.env + "-#{config.assets.version}"
...
end
因此rails正在创建一个Sprockets环境,其版本等于Rails环境,Sprockets在创建摘要类时使用该版本。
答案 1 :(得分:1)
当文件名是唯一的并且基于其内容时,HTTP标头可以 设置鼓励各地的缓存(无论是在CDN,ISP,在 网络设备,或在网络浏览器中)保留自己的副本 内容。更新内容后,指纹将发生变化。 这将导致远程客户端请求新的副本 内容。这通常称为缓存清除。
Rails用于指纹识别的技术是插入哈希 将内容写入名称,通常在最后。例如一个CSS 文件global.css可以使用 MD5内容摘要
重命名