ruby-on-rails - 使用:coffescript filter inside HAML templates?对性能的影响

标签 ruby-on-rails coffeescript haml

所以HAML 4 includes a coffeescript filter,它使我们喜欢咖啡的人可以做这样的整洁的事情:

- word = "Awesome."

:coffeescript
  $ ->
    alert "No semicolons! #{word}"

我的问题:对于最终用户,这是否比使用等效的:javascript过滤器慢?使用coffeescript过滤器是否意味着会在每次页面加载时将coffeescript编译为javascript(这显然会导致性能下降),还是仅在启动应用程序时才发生一次?

最佳答案

这取决于。

Haml编译过滤器时,它将检查过滤器文本是否为contains any interpolation(#{...})。如果没有,则将在每个请求上转换相同的文本,因此转换在编译时执行一次,结果包含在模板中。

如果过滤器文本中存在插值,则要转换的实际文本将根据每个请求而有所不同,因此,每次都需要编译Coffeescript。

这是一个例子。首先没有插值:

:coffeescript
  $ ->
    alert "No semicolons! Awesome"

生成代码(使用haml -d查看生成的Ruby代码):

_hamlout.buffer << "<script>\n  (function() {\n    $(function() {\n      return alert(\"No semicolons! Awesome\");\n    });\n  \n  }).call(this);\n</script>\n";

这段代码只是向缓冲区添加了一个字符串,因此没有重新编译Coffeescript。

现在进行插值:

- word = "Awesome."

:coffeescript
  $ ->
    alert "No semicolons! #{word}"

这将产生:

 word = "Awesome."
_hamlout.buffer << "#{
find_and_preserve(Haml::Filters::Coffee.render_with_options(
"$ ->
  alert \"No semicolons! #{word}\"\n", _hamlout.options))
}\n";

在这里,由于Haml需要等待以查看插值的值,因此每次都会重新编译Coffeescript。

您可以通过在:coffeescript过滤器内不进行任何插值来避免在每个请求上编译Coffeescript。
:javascript过滤器的行为类似,检查是否存在插值,但是由于:javascript过滤器在运行时仅将一些文本输出到缓冲区,因此使用它对性能的影响要小得多。您可以结合使用:javascript:coffeescript过滤器,将插值数据放入:javascript中,并使:coffeescript保持静态:

- word = "Awesome"

:javascript
  var message = "No semicolons! #{word}";

:coffeescript
  alert message

关于ruby-on-rails - 使用:coffescript filter inside HAML templates?对性能的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17560864/

相关文章:

ruby-on-rails - Rails - Active Record 查询不查询变量赋值(想要立即加载)

ruby-on-rails - 在 Ruby/Rails 中动态定义方法 - 如何设置参数?

ruby-on-rails - 致命 : database "postgres" does not exist

javascript - Accordion 面板不应在 if 条件下打开 - coffeescript

node.js - Node_redis hgetall 回调函数上的 Coffeescript 变量范围

ruby-on-rails - Ruby on Rails 中的 HAML 能否以 "ordered hash"方式输出 HTML 属性?

ruby-on-rails - 在 Rails 3 中查找 session ID

javascript - Backbone.js:根据点击事件过滤集合

html - 如何使用 slim 语法转义 HTML 内容中的方括号?

ruby-on-rails - 考拉在帖子上获得点赞