【问题标题】:Rails asset pipeline and digest valuesRails 资产管道和摘要值
【发布时间】:2012-04-18 18:58:26
【问题描述】:

有人知道资产摘要值是如何计算的吗?如果我有两个 JS 文件,其中包含各种其他包含的 JS 脚本,那么如果没有更改任何内部脚本,每个文件是否会保持相同的摘要哈希?还是每次运行 assets:precompile 操作时都会计算一个新的摘要值?

【问题讨论】:

    标签: ruby-on-rails ruby rake asset-pipeline sprockets


    【解决方案1】:

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

    事实证明,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 如下:

    # 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 在创建摘要类时使用该版本。

    【讨论】:

    • 感谢这个。我必须更改资产的摘要以使 Cloudflare 缓存无效,而无需更改资产文件的内容。将 config.assets.version 从“1.0”更改为“1.1”会更改签名;)
    • 这适用于哪个版本的 Rails?如果 Rails 5 发生了变化,最好更新它
    【解决方案2】:

    取自rails guides

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

    Rails 用于指纹识别的技术是插入哈希 将内容的名称放入名称中,通常放在末尾。例如一个 CSS 文件 global.css 可以用 其内容的 MD5 摘要

    来重命名

    【讨论】:

    • 那么在所有的合并和压缩完成之后,是对最终文件执行一个简单的 md5_file() 操作吗?该 md5 值最终成为文件的摘要是否正确?
    • 根据文档,是的。详情可以参考another guide
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    相关资源
    最近更新 更多