【问题标题】:Does heavy use of methods within a view hinder caching?在视图中大量使用方法会阻碍缓存吗?
【发布时间】:2015-01-12 22:17:14
【问题描述】:

我正在尝试在我的 Rails 4 应用程序中实现 BEM 助手,以帮助我更愉快地编写视图。

假设我们有以下Haml 视图:

= block :user_bar, unregistered: current_user.unregistered? do |b|
  - if current_user.unregistered?
    = b.element :inner do
      You are not registered.

假设block和虚构类BEMBlockBuilder的方法#element(其中一个实例以b传递)被定义,并假设current_user.unregistered?true,我们应该得到以下 HTML 输出:

<div class="user-bar user-bar--unregistered">
  <div class="user-bar__inner">
    You are not registered.
  </div>
</div>

这种技术应该可以设置块、元素并对其应用修改器,而不必每次都重复块的名称,并且它可以简单地基于绑定到它们的值来应用修改器是真实的.

该技术本身与使用 form_for 帮助程序时发生的情况有些相似,因为它将FormBuilder 的实例传递给块。


此技术与 form_for 帮助器之间的主要区别在于,您最终可能会使用大量嵌套块来渲染视图,而其中的输出可能未知。

这种技术会影响 Rails(或 HAML)以负面方式执行缓存的能力,还是会损害总体渲染性能?

【问题讨论】:

  • 如果你的助手是纯函数——它不应该,因为函数的结果是可以预测的。但这一切都取决于您使用的助手的内部逻辑。在某些情况下,这可能是个麻烦。

标签: ruby-on-rails caching view haml bem


【解决方案1】:

不,您建议的实现不会对缓存产生负面影响 - 这包括页面缓存、动作缓存以及俄罗斯娃娃缓存。

虽然页面缓存或动作缓存的情况相当明显,但俄罗斯娃娃缓存也不受自定义视图构建器影响的原因是,如果模型的 cache_key 没有改变 - 传递给 cache 助手的块无论在下面调用的视图构建器如何,都不会重新评估。

以上假设您避免在构建器中使用隐式状态。 Alex 已经强调了 cmets 中可预测性的重要性。

除此之外,唯一的关键问题是streaming of templates 将难以处理。如果这与您的用例无关,那么您就可以开始了。特别是,如果您使用的是 HAML,那么您无论如何都要 can not use 流式传输。但是,您可以考虑探索线程以获取有关处理流模板的一些有趣想法。

如果你想避免这个问题,你可以考虑使用小的帮助函数来根据 BEM 生成类名。然后你可以使用类似的东西:

<div class="<%= bem_class(block: 'user-bar', el: 'inner', mods: ['unregistered']) %>">
</div>

这显然更冗长,但也可以轻松处理多个块应用于同一个 DOM 元素的情况,这在 BEM 中有效。

最后,以下是 Justin Weiss 的 extremely well written article 关于视图渲染性能评估的一些关键要点:

  • 为了性能的边际收益而牺牲可维护性并不是一个好的解决方案
  • 复杂的逻辑不属于视图
  • 分析工具是您的朋友。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-25
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    • 2012-11-06
    • 2012-02-23
    • 2015-08-03
    相关资源
    最近更新 更多