【问题标题】:Rails 4 fragment caching with stylesheet_link_tagRails 4 片段缓存与 stylesheet_link_tag
【发布时间】:2015-01-01 03:40:24
【问题描述】:

Rails 4 使用 cache_digests (https://github.com/rails/cache_digests) 来协助片段缓存失效:cache_digests 创建一个模板及其所有已知依赖项的 MD5 哈希,允许在模板或其依赖项时分配一个新键来使片段缓存失效变化。

我的问题是:如果 application.css 文件的 MD5 哈希在 rake assets:precompile 期间发生变化,包裹 stylesheet_link_tag 的片段缓存是否会失效?现在在我们的标题中执行此操作:

<% cache("header-cache-key") do %>
  <%= stylesheet_link_tag "application" %>
  <%= javascript_include_tag "application" %>
<% end %>

这样安全吗?我担心当 CSS 或 JS 发生变化时,application-xxxxxxx.css 会变成application-yyyyyyy.css,但是我们的 header 会被旧的application-xxxxxxx.css 缓存。那么如果application-xxxxxxx.csspublic/assets 中消失,这将导致一个丑陋的页面。

【问题讨论】:

    标签: ruby-on-rails caching ruby-on-rails-4 memcached sprockets


    【解决方案1】:

    不,缓存不会在更改已编译的 CSS/JS 时被破坏/失效。

    Rails 在代码更改时破坏缓存的方式是通过将文件的哈希插入到视图的缓存键中来完成的。

    例如,假设您在app/views/layouts/application.html.erb 有一个视图文件。 Rails 从文件的内容(即 HTML/Ruby 代码,而不是执行的输出)生成哈希。假设生成的哈希是“abdefg123”。

    如果application.html.erb有如下缓存代码:

    <% cache("header-cache-key") do %>
      <%= stylesheet_link_tag "application" %>
      <%= javascript_include_tag "application" %>
    <% end %>
    

    实际生成的缓存键类似于"views/layouts/application-abcdefg123/header-cache-key"

    由于编译后的 CSS/JS 中的更改实际上不会更改文件中的 Ruby/HTML,因此布局代码的计算哈希值不会更改,因此“header-cache-key”的缓存键是同样,这意味着缓存没有被破坏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-23
      • 1970-01-01
      • 2016-07-18
      • 2012-03-07
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      • 2014-08-02
      相关资源
      最近更新 更多