所以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/