在HAML模板中使用:coffescript过滤器的性能影响?

Adr*_*eil 10 haml ruby-on-rails coffeescript

所以HAML 4包含一个coffeescript过滤器,它允许我们爱好咖啡的人们做这样的整洁的事情:

- word = "Awesome."

:coffeescript
  $ ->
    alert "No semicolons! #{word}"
Run Code Online (Sandbox Code Playgroud)

我的问题:对于最终用户来说,这比使用等效:javascript过滤器慢吗?使用coffeescript过滤器是否意味着coffeescript将在每次加载页面时编译为javascript(这显然会造成性能灾难),或者这只会在应用程序启动时发生一次?

mat*_*att 15

这取决于.

当Haml编译过滤器时,它会检查过滤器文本是否包含任何插值(#{...}).如果没有,则每个请求都将转换相同的文本,因此转换在编译时完成一次,结果包含在模板中.

如果在过滤文本插入,然后改造将在每个要求不同,所以CoffeeScript的需要的实际文本将每次编译.

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

:coffeescript
  $ ->
    alert "No semicolons! Awesome"
Run Code Online (Sandbox Code Playgroud)

这会生成代码(用于haml -d查看生成的Ruby代码):

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

此代码只是将一个字符串添加到缓冲区,因此不会重新编译Coffeescript.

现在插值:

- word = "Awesome."

:coffeescript
  $ ->
    alert "No semicolons! #{word}"
Run Code Online (Sandbox Code Playgroud)

这会产生:

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

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

您可以避免在:coffeescript过滤器内部进行任何插值,从而避免在每个请求中编译Coffeescript .

:javascript过滤器同样的行为,检查,看看是否有任何的插值,但是由于:javascript过滤器只输出一些文本到缓冲区当它运行有更使用它性能损失.您可以组合:javascript:coffeescript过滤,将插值数据放入:javascript并保持:coffeescript静态:

- word = "Awesome"

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

:coffeescript
  alert message
Run Code Online (Sandbox Code Playgroud)