选择性Rails 3.2每个文件的资产管道压缩

时间:2012-08-12 13:54:15

标签: javascript ruby-on-rails asset-pipeline angularjs

我想有选择地压缩Rails 3.2应用程序中的一些javascript文件,但仍然在生产环境中从单个捆绑文件中提供所有js资源。

这样的语法,在app / assets / javascripts / application.js文件中,使用传递给最后3个链接:compress => false组成 require选项指令我希望解释我想要实现的目标。

// 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个文件将不会被压缩,但它们将被捆绑到application.js包中。

有没有办法可以做到这一点?

产品的动机是products.js文件包含一个angularjs控制器,该控制器利用angular的依赖注入,这需要特定的变量名称,如$scope$http不会改变。

3 个答案:

答案 0 :(得分:8)

我在 config / environment / production.rb 文件中使用此行

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

它会压缩我的控制器,但它不会更改方法签名,因此DI仍可按预期工作。

答案 1 :(得分:6)

要使用它与Rails 4一起使用,因为它使用了我使用的更新版本的链轮:

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

环境/ production.rb

中的

答案 2 :(得分:3)

请注意,出于这个特定原因,可以选择使用字符串而不是变量名来指定注入的服务。查看控制器下面的行。

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

取自http://docs.angularjs.org/guide/di

的示例