Rails的javascript_include_tag可以忽略以前加载的脚本吗?

时间:2011-01-04 17:04:23

标签: ruby-on-rails ruby-on-rails-3

我正在使用这一行:

= javascript_include_tag :all, :recursive => true, :cache => true

在Rails应用程序的页脚中执行以下操作:

  • 递归加载public / javascripts下的所有脚本
  • 在制作中,将它们全部归为一个文件(:cache部分)

但是,我想在头部加载其中一个脚本,因为一些内联JS依赖于它。

javascript_include_tag是否可以选择排除已加载的文件?

我知道默认情况下它不会这样做,因为我现在看到源HTML中引用了两次的脚本。

2 个答案:

答案 0 :(得分:4)

javascript_include_tag是一个简单的html帮助程序,不跟踪天气或者页面上已经包含某些内容,所以不,没有选项,很糟糕。

代替这一点,您可以通过以下几种方式解决问题:

  1. 使用Jammit之类的东西,我现在使用它,这是一种绝对的快乐。它将生产中的所有javascripts打包到一个文件中,允许你压缩它们的shit,并为CSS做同样的事情。您可以在配置目录中使用.yml文件对其进行配置,使其可移植且易于递归地包含目录中的脚本,同时仍然控制它们包含在页面上或附加到包中的顺序。 Jammit的替代方案(不太棒的恕我直言)是Asset Packager

  2. 在头部使用javascript_include_tag。不是真正的世界末日。稍后优化。

  3. 不是特定的Rails,而是使用head.jshead.js非常新,但允许您快速并行地加载许多脚本,同时保留执行顺序并在脚本加载之后但在dom准备好之前触发回调。它包含一些其他好东西,如旧浏览器中的HTML5友好性。此选项很有趣,因为您将脚本分开,或者至少在不同的包中保持最大的并行下载速度。我不确定天气是否在<head>甚至在页脚右侧连续下载一个巨大的压缩包,或者使用head.js并行加载内容会更快,但它确实使管理这些事情变得更容易。

  4. 我最近使用了head.js和Jammit,我必须说,对于繁重的Javascript应用程序,它们让事情变得非常简单。

答案 1 :(得分:1)

config/application.rb中,您可以在:defaults中设置javascript_include_tag的含义:

# JavaScript files you want as :defaults (application.js is always included).
config.action_view.javascript_expansions[:defaults] = %w(rails, jquery)

然后,您可以使用:defaults参数在application.erb.html中使用该标记,或者您喜欢的地方:

<%= javascript_include_tag :defaults %>

在视图模板的底部完成此操作后,您当然可以在其之前包含单个脚本。

现在,我意识到您想要使用:all参数,并以递归方式加载,但是这个解决方案确实为您提供了更多控制权,我认为您将需要这些控制权。

相关问题