2012-08-12 24 views
3

我想选择性地压缩Rails 3.2应用程序中的一些JavaScript文件,但仍然拥有生产环境中单个捆绑文件提供的所有js资源。选择性导轨3.2每个文件的资产流水线压缩

语法这样,应用程序/资产/ Java脚本/ application.js中的文件里,使用传递给最后3个链轮require指令我希望编造:compress => false选项解释什么,我想要的目的。

// Contents of app/assets/javascripts/application.js 
// 
//= require jquery 
//= require jquery_ujs 
//= require angular-1.0.1/angular, :compress => false 
//= require angular-1.0.1/angular-resource, :compress => false 
//= require products, :compress => false 

那么的jquery.js和jquery_ujs.js文件将被压缩(由Rails的资产编译,它默认使用UglifierJS),其余3个文件将不会被压缩,但它们将被捆绑到应用程序中.js包。

有没有办法做到这一点?

动机是products.js文件包含一个angularjs控制器,该控制器利用角度的依赖注入,这需要特定的变量名称,例如$scope$http未被更改。

回答

8

我用这条线在我配置/环境/ production.rb文件

config.assets.js_compressor = Sprockets::LazyCompressor.new { Uglifier.new(:mangle => false) }

它压缩我的控制器,但它不会改变方法签名,以便DI仍然按预期工作。

+0

非常感谢米兰,在Rails 3.2.6中为我工作,angularjs现在工作正常。 – 2012-08-14 20:08:32

+0

出于好奇,'Sprockets :: LazyCompressor'部分是做什么的? – 2013-04-23 14:00:10

+0

几乎在rails中的所有东西都只是“shell”,每个特定模式的具体实现都是一般化的,因此您可以切换到其他选项。链轮是做压缩,sass /少量预编译......以及许多其他事情的引擎。 Sprockets :: LazyCompressor.new行为js压缩创建了惰性加载器,您可以使用任何东西。默认情况下,使用uglifier来压缩文件,上面的行只是告诉uglifier避免重命名方法参数的方法。 – 2013-04-23 22:08:21

3

请注意,由于这个特定的原因,有一个选项可以用字符串而不是变量名来指定注入的服务。看到控制器下的线。从http://docs.angularjs.org/guide/di

6

采取

var MyController = function(renamed$scope, renamedGreeter) { 
    ... 
} 
MyController.$inject = ['$scope', 'greeter']; 

实例为了得到这个使用Rails 4的工作,因为它使用链轮较新版本的我用:

config.assets.js_compressor = Uglifier.new(mangle: false) if defined? Uglifier

在环境

/production.rb

相关问题