我正在尝试将现有的应用程序转换为新的3.1资产管道布局,并希望包括许多必须按特定顺序排列的供应商文件(undercore.js和主干是一对)。因此,我不能只使用= require_tree .
来拉入我的供应商文件(而不使用前缀.Yuck重命名每个文件)。
以下内容在我的app/assets/javascripts/application.js
文件中:
//=需要现代化//=需要jquery-1.6.1//=需要下芯-1.1.5//=需要背板-0.3.3//=require_tree。
我已经尝试了使用/out扩展、使用/out require_tree和使用/out相对路径的每一种组合,但都不起作用。我的所有供应商文件都在/vendor/assets/javascripts/
中。
我觉得我很愚蠢,因为这似乎是一个明显的用例,(按名称按顺序包括特定文件在JS中很常见,不是吗?)我一定在做一些愚蠢的事情?
您有两种可能的结构:第一种和第二种。对于以下两个示例,您将在/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
您可以按特定顺序要求每个文件,然后添加:
//= require_self
而不是:
//= require_tree .
我的答案适用于Rails 3.1rc4,我不知道它的功能是否与其他版本相同。
实际上,您可以将所有require语句放在app/assets/javascripts/application.js中,无论.js文件是否在app/aassets/javaScript/或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.confee),还有一个用于整个站点的通用文件(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,因为顺序通常不那么重要。
更重要的是,我将所有require语句都控制在一个经常使用的文件中,我发现这既安全又干净。
我相信你可以在vendor/assets/javascripts
中放入一个library.js
,然后简单地
//= require library.js
从你的application.js
,不是吗?
require_tree完全按照你告诉它的去做。如果你给它
//= require_tree .
它将文件加载到调用requiretree的当前目录中。如果你给它
//=require_tree ../../../vendor/assets/javascripts
然后您将获得vendor下的javascript。
我不喜欢../../。。因此,我创建了一个名为vendor/assets/javascripts/vendor_application.js的文件,其中包含:
//= require_tree .
这将加载vendor目录下的javascript。
注意,require确实在3个管道位置(app、lib、vendor)中搜索需要的文件。require_tree是字面意思,这可能是它应该有的样子
关于这一点的railscast非常有用:http://railscasts.com/episodes/279-understanding-the-asset-pipeline