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