Rails 3.1资产pipe道和人工订购的Javascript需求

我试图将现有的应用程序转换为新的3.1资产pipe道布局,并且想要包含许多必须以特定顺序(underscore.js和主干为一对)的供应商文件。 因此,我不能只使用= require_tree . 拉入我的供应商文件,(不用重命名每个文件的前缀。

以下是我的app/assets/javascripts/application.js文件中:

 // =需要modernizr-1.7
 // =需要jquery-1.6.1
 // =要求下划线-1.1.5
 // =需要backbone-0.3.3
 // = require_tree。

我已经尝试了带/不带扩展的每个组合,带/不带require_tree和带/不带相对path,没有任何作用。 我所有的供应商文件都在/vendor/assets/javascripts/

我觉得我很愚蠢,因为这似乎是这样一个明显的用例,(包括命名中的特定文件是常见的JS,不是?),我必须做一些愚蠢的东西?

您可以按特定顺序要求每个文件,然后添加:

 //= require_self 

代替:

 //= require_tree . 

你有两种可能的结构:第一种和第二种。 通过以下两个示例,您将在/assets/externals.js处公开一个包。 你可以javascript_include_tag这个包,但你也可以在你的application.js文件中要求它。

第一个

 vendor/ ├── assets │ ├── javascripts │ │ ├── externals.js │ │ ├── modernizr-1.7.js │ │ └── underscore-1.1.6.js │ └── stylesheets └── plugins 

文件externals.js包含:

 //= require ./underscore-1.1.6.js //= require ./modernizr-1.7.js 

第二个

 vendor/ ├── assets │ ├── javascripts │ │ └── externals │ │ ├── index.js │ │ ├── modernizr-1.7.js │ │ └── underscore-1.1.6.js │ └── stylesheets └── plugins 

文件index.js包含:

 //= require ./underscore-1.1.6.js //= require ./modernizr-1.7.js 

我的答案适用于Rails 3.1rc4,我不知道它是否与其他版本的function相同。

不pipe.js文件是在app / assets / javascripts /还是vendor / assets / javascripts /

像这样:

 // this is in app/assets/javascripts/application.js //= require modernizr-2.0 //= require jquery //= require jquery_ujs //= require jqueryui-1.8.12 //= require jquery.easing-1.3 //= require jquery.noisy //= require jquery.jslide-1.0 //= require respond //= require smoke //= require_tree 

我在这里包含了require_tree,因为我有其他的javascript文件(pages.js.coffee,users.js.coffee)和一个用于站点范围的东西(site.js.coffee)

同时这里是文件结构。

 app/ ├── assets │ ├── javascripts │ │ ├── application.js │ │ ├── pages.js.coffee │ │ ├── users.js.coffee │ │ └── site.js.coffee │ └── stylesheets └── plugins vendor/ ├── assets │ ├── javascripts │ │ ├── jquery.easing-1.3.js │ │ ├── jquery.jslide-1.0.js │ │ ├── jquery.noisy.js │ │ ├── jqueryui-1.8.12.js │ │ ├── modernizr-2.0.js │ │ ├── respond.js │ │ └── smoke.js │ └── stylesheets └── plugins 

这使我可以控制供应商库的加载顺序(通常很重要),而不用担心我的内部JavaScript,其中订单通常不太重要。

更重要的是,我控制了一个经常使用的文件中的所有需要​​的语句,我发现既安全又清洁。

我相信你可以把一个library.js放在你的vendor/assets/javascripts ,然后简单地

 //= require library.js 

从你的application.js ,不是?

require_tree正是你所说的。 如果你给它

 //= require_tree . 

它将加载调用require_tree的当前目录中的文件。 如果你给它

 //=require_tree ../../../vendor/assets/javascripts 

那么你会得到在供应商下的JavaScript。

我不喜欢../../ ..表示法,所以我创build了一个名为vendor / assets / javascripts / vendor_application.js的文件,其中包含:

 //= require_tree . 

这加载在供应商目录下的JavaScript。

请注意,require会search文件所需的3个pipe道位置(app,lib,vendor)。 require_tree是字面的,这可能是应该的。

在这个railscast非常有用: http ://railscasts.com/episodes/279-understanding-the-asset-pipeline