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)