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

bes*_*eku 52 ruby-on-rails-3 sprockets asset-pipeline

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

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

//= require modernizr-1.7
//= require jquery-1.6.1
//= require underscore-1.1.5
//= require backbone-0.3.3
//= require_tree .

我尝试了with/out扩展的每个组合,带有/ out的require_tree和with/out的相对路径,没有任何效果.我的所有供应商文件都在/vendor/assets/javascripts/.

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

Rom*_*bes 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
Run Code Online (Sandbox Code Playgroud)

该文件externals.js包含:

//= require ./underscore-1.1.6.js
//= require ./modernizr-1.7.js
Run Code Online (Sandbox Code Playgroud)

第二个

vendor/
??? assets
?   ??? javascripts
?   ?   ??? externals
?   ?       ??? index.js
?   ?       ??? modernizr-1.7.js
?   ?       ??? underscore-1.1.6.js
?   ??? stylesheets
??? plugins
Run Code Online (Sandbox Code Playgroud)

该文件index.js包含:

//= require ./underscore-1.1.6.js
//= require ./modernizr-1.7.js
Run Code Online (Sandbox Code Playgroud)

  • 有一点需要补充,这对我来说很困惑; 一旦设置了外部,您可以在application.js中使用简单的// = require externals或通过javascript_include_tag('externals')在视图/布局中引用它 (2认同)

小智 29

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

//= require_self
Run Code Online (Sandbox Code Playgroud)

代替:

//= require_tree .
Run Code Online (Sandbox Code Playgroud)

  • 我最近开始使用RoR,但很快就注意到了require_tree.因为你最终加载了许多未使用的JS/CSS,所以你自己就是在大型项目中投入自己...手动需要每个文件,如果需要,将它们分组到带有自己索引文件的"库文件夹"中...... (2认同)

Oli*_*can 8

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

您可以将所有require语句放在app/assets/javascripts/application.js中,无论.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
Run Code Online (Sandbox Code Playgroud)

我在这里包含了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
Run Code Online (Sandbox Code Playgroud)

这允许我控制供应商库的加载顺序(这通常很重要)而不用担心我的内部javascript,其中顺序通常较少.

更重要的是,我控制一个常用文件中的所有require语句,我发现既安全又清洁.


mux*_*mux 6

我相信你可以把它放进library.jsvendor/assets/javascripts,然后简单地说

//= require library.js
Run Code Online (Sandbox Code Playgroud)

来自你application.js,没有?

  • 请原谅,应该是`vendor/assets/javascripts` (2认同)