Rails 3.1资产管道和手动订购的Javascript需要



我正在尝试将现有的应用程序转换为新的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

相关内容

  • 没有找到相关文章

最新更新