3

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

像这样的语法,在 app/assets/javascripts/application.js 文件中,使用传递给最后 3 个 sprockets指令 的虚构选项,我希望能解释我想要实现的目标。:compress => falserequire

// 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不会更改。

4

3 回答 3

8

我在我的config/environment/production.rb文件中使用了这一行

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

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

于 2012-08-12T18:06:37.550 回答
6

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

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

在环境/production.rb

于 2013-03-23T03:50:54.350 回答
3

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

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

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

于 2012-12-07T12:46:32.147 回答