Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在HAML模板中使用:coffescript筛选器的性能影响?_Ruby On Rails_Coffeescript_Haml - Fatal编程技术网

Ruby on rails 在HAML模板中使用:coffescript筛选器的性能影响?

Ruby on rails 在HAML模板中使用:coffescript筛选器的性能影响?,ruby-on-rails,coffeescript,haml,Ruby On Rails,Coffeescript,Haml,所以,这让我们喜欢喝咖啡的人可以做这样整洁的事情: - word = "Awesome." :coffeescript $ -> alert "No semicolons! #{word}" 我的问题:对于最终用户来说,这比使用等效的:javascript过滤器慢吗?使用coffeescript筛选器是否意味着每次加载页面时都会将coffeescript编译为javascript(这显然会导致性能灾难),或者这只在应用程序启动时发生一次?视情况而定 当Haml编译一个过滤器

所以,这让我们喜欢喝咖啡的人可以做这样整洁的事情:

- word = "Awesome."

:coffeescript
  $ ->
    alert "No semicolons! #{word}"
我的问题:对于最终用户来说,这比使用等效的
:javascript
过滤器慢吗?使用coffeescript筛选器是否意味着每次加载页面时都会将coffeescript编译为javascript(这显然会导致性能灾难),或者这只在应用程序启动时发生一次?

视情况而定

当Haml编译一个过滤器时,它会检查过滤器文本(
{…}
)。如果没有,那么在每个请求上转换的文本都是相同的,因此在编译时转换一次,结果包含在模板中

如果过滤器文本中有插值,那么要转换的实际文本将根据每个请求而变化,因此每次都需要编译Coffeescript

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

:咖啡脚本
$ ->
警报“没有分号!太棒了”
这将生成代码(使用
haml-d
查看生成的Ruby代码):

\u hamlout.buffer
警告“没有分号!#{word}”
这将产生:

word=“太棒了。”
_哈姆洛特缓冲区
警告\“没有分号!#{word}\”\n“,_hamlout.options))
}\n”;
在这里,由于Haml需要等待以查看插值的值,因此每次都会重新编译Coffeescript

通过在
:Coffeescript
过滤器中不进行任何插值,可以避免在每次请求时编译Coffeescript

:javascript
过滤器的行为类似,检查是否存在任何插值,但由于
:javascript
过滤器在运行时只向缓冲区输出一些文本,因此使用它对性能的影响要小得多。您可以将
:javascript
:coffeescript
过滤器组合起来,将插入的数据放入
:javascript
并保持
:coffeescript
静态:

-word=“很棒”
:javascript
var message=“没有分号!#{word}”;
:咖啡脚本
警报消息

马特的回答很清楚发生了什么。我制作了一个助手,从散列中向
:coffeescript
过滤器添加局部变量。这样,您就不需要使用全局JavaScript变量。顺便说一句:在Linux上,速度的减慢实际上可以忽略不计。但是,在Windows上,对性能的影响非常重要(每个块的编译速度很容易超过100ms)


由于没有插入,因此代码实际上是按正常方式编译的。

。谢谢
module HamlHelper
  def coffee_with_locals locals={}, &block
    block_content = capture_haml do
      block.call
    end

    return block_content if locals.blank?

    javascript_locals = "\nvar "
    javascript_locals << locals.map{ |key, value| j(key.to_s) + ' = ' + value.to_json.gsub('</', '<\/') }.join(",\n    ")
    javascript_locals << ";\n"

    content_node = Nokogiri::HTML::DocumentFragment.parse(block_content)
    content_node.search('script').each do |script_tag|
      # This will match the '(function() {' at the start of coffeescript's compiled code
      split_coffee = script_tag.content.partition(/\(\s*function\s*\(\s*\)\s*\{/)
      script_tag.content = split_coffee[0] + split_coffee[1] +  javascript_locals + split_coffee[2]
    end

    content_node.to_s.html_safe
  end
end
= coffee_with_locals "test" => "hello ", :something => ["monde", "mundo", "world"], :signs => {:interogation => "?", :exclamation => "!"} do
  :coffeescript
    alert(test + something[2] + signs['exclamation'])