避免在Rails清单文件中重复javascript版本号

时间:2012-05-02 10:50:24

标签: ruby-on-rails ruby manifest erb

我们需要许多不同的清单文件,以便只为我们网站的各个功能区域提供相应的JS文件,但是我目前不得不在每个文件中复制JS文件名和版本号,所以我们的清单看起来像:

libs.js

//= require json2
//= require underscore-1.3.1
//= require jquery
//= require jquery-ui-1.8.17.custom.min
//= require jquery_ujs
//= require farbtastic-1.3u.gizmos
//= require bootstrap-2.0.1
//= require highstock-1.1.4.src
//= require exporting-1.1.4.src
//= require modernizr-2.5.3
//= require application
//= require validation
//= require navigation
//= require styles

库-embedded.js

//= require json2
//= require jquery
//= require highstock-1.1.4.src
//= require exporting-1.1.4.src

我试图通过使用这些.js.erb等效项更改这些清单文件来解决这个问题:

libs.js

<%= ManifestHelper.require_json2%>
<%= ManifestHelper.require_underscore%>
<%= ManifestHelper.require_jquery%>
<%= ManifestHelper.require_jquery_ui%>
<%= ManifestHelper.require_jquery_ujs%>
<%= ManifestHelper.require_farbtastic%>
<%= ManifestHelper.require_bootstrap%>
<%= ManifestHelper.require_highstock%>
<%= ManifestHelper.require_exporting%>
<%= ManifestHelper.require_modernizr%>
<%= ManifestHelper.require_application%>
<%= ManifestHelper.require_validation%>
<%= ManifestHelper.require_navigation%>
<%= ManifestHelper.require_styles%>

库-embedded.js

<%= ManifestHelper.require_json2%>
<%= ManifestHelper.require_jquery%>
<%= ManifestHelper.require_highstock%>
<%= ManifestHelper.require_exporting%>

ManifestHelper类包括以下方法:

  def self.require_underscore
    '//= require underscore-1.3.1'
  end

这是为了允许我在一个地方管理JS文件和版本号,即使它们在许多清单文件中使用。

但是,当我尝试这样做时,我的libs.js文件看起来像:

//= require json2
//= require underscore-1.3.1
//= require jquery
//= require jquery-ui-1.8.17.custom.min
//= require jquery_ujs
//= require farbtastic-1.3u.gizmos
//= require bootstrap-2.0.1
//= require highstock-1.1.4
//= require exporting-1.1.4
//= require modernizr-2.5.3
//= require application
//= require validation
//= require styles
//= require navigation;

这有两个问题。首先,由于某种原因引入了分号。第二个是生成的.js文件没有使用// = requires指令中定义的连接的js文件填充....看起来虽然.erb替换发生在.js.erb文件中,但它出现了在清单文件读完指令后发生。

我的问题是......任何人都可以建议一种方法来解决这个问题,或者建议一个替代解决方案让我停止复制每个清单中的js文件和版本号...

谢谢, 伊恩

2 个答案:

答案 0 :(得分:0)

一种可能的解决方法是将共享的javascript文件移动到“共享”子目录中,然后从清单文件中使用require_directory指令来提取共享文件。

//= require_directory shared

此方法的一个好处是您只需将javascript文件放入“共享”目录,以使其可用于具有require_directory语句的所有父清单。没有更新清单或帮助文件。

如果您对这些文件具有加载顺序依赖性,那么只有潜在的问题是您无法控制加载共享文件的顺序。但是,可以使用子目录中的index manifest来静态列出文件的顺序,然后从父清单中指向索引清单,以便更加努力地解决这个问题。

答案 1 :(得分:0)

我们通过使用包装javascript库的gem来设法使用这个问题,例如我们一直在使用以下gem:   宝石'jquery-rails'   宝石'jquery-ui-rails'   宝石'twitter-bootstrap-rails'   宝石'select2-rails'   宝石'下划线'   gem'undercore-string-rails'

然后,您可以使用库的名称在清单中包含相关的JavaScript库。例如:// = require select2而不是// = require select2-x.y.z

显然,宝石做了许多好事,比如管理资产管道集成,但我们没有在我喜欢的地方拥有库版本号。