52

我正在尝试将现有应用程序转换为新的 3.1 资产管道布局,并希望包含许多必须按特定顺序排列的供应商文件(underscore.js 和主干是一对)。因此,我不能只使用 a= require_tree .来拉入我的供应商文件(而不用前缀重命名每个文件。呸)。

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

//= 需要modernizr-1.7
//= 需要 jquery-1.6.1
//= 需要下划线 1.1.5
//= 需要骨干网-0.3.3
//= 要求树。

我已经尝试了每一种有/无扩展、有/无require_tree和有/无相对路径的组合,但没有任何效果。我所有的供应商文件都在/vendor/assets/javascripts/.

我觉得我很愚蠢,因为这似乎是一个如此明显的用例,(包括按名称排列的特定文件在 JS 中很常见,不是吗?)我一定是在做一些愚蠢的事情?

4

5 回答 5

48

您有两种可能的结构:第一种和第二种。通过以下两个示例,您可以在/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
于 2011-05-27T14:46:59.917 回答
29

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

//= require_self

代替:

//= require_tree .
于 2011-06-26T08:15:17.967 回答
8

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

实际上,无论 .js 文件是否在 app/assets/javascripts/ 或 vendor/assets/javascripts/ 中,您都可以将所有 require 语句放入 app/assets/javascripts/application.js

像这样:

// 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,因为顺序通常不太重要。

更重要的是,我控制了一个常用文件中的所有 require 语句,我发现它既安全又干净。

于 2011-07-19T15:15:44.423 回答
6

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

//= require library.js

从你的application.js,不是吗?

于 2011-06-06T12:09:52.577 回答
4

require_tree 完全按照你说的做。如果你给它

//= require_tree .

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

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

然后你会得到供应商下的javascript。

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

//= require_tree .

这会在供应商目录下加载 javascript。

请注意,require 会在 3 个管道位置(app、lib、vendor)中搜索需要的文件。require_tree 是文字,这可能是它应该的方式。

对此的 railscast 非常有帮助:http ://railscasts.com/episodes/279-understanding-the-asset-pipeline

于 2011-12-31T08:28:52.467 回答