Adr*_*eil 10 haml ruby-on-rails coffeescript
所以HAML 4包含一个coffeescript过滤器,它允许我们爱好咖啡的人们做这样的整洁的事情:
- word = "Awesome."
:coffeescript
  $ ->
    alert "No semicolons! #{word}"
我的问题:对于最终用户来说,这比使用等效:javascript过滤器慢吗?使用coffeescript过滤器是否意味着coffeescript将在每次加载页面时编译为javascript(这显然会造成性能灾难),或者这只会在应用程序启动时发生一次?
mat*_*att 15
这取决于.
当Haml编译过滤器时,它会检查过滤器文本是否包含任何插值(#{...}).如果没有,则每个请求都将转换相同的文本,因此转换在编译时完成一次,结果包含在模板中.
如果是在过滤文本插入,然后改造将在每个要求不同,所以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
| 归档时间: | 
 | 
| 查看次数: | 2591 次 | 
| 最近记录: |