AngularJS + Rails - 压缩资产时出现问题

时间:2012-05-18 21:18:29

标签: javascript ruby-on-rails-3 angularjs

我最近创建了一个带有Rails 3.2.3后端的AngularJS 1.0.0rc8应用程序,它在开发中运行良好,但在部署到Heroku后出现了未知提供程序错误 - 显然是应用程序无法看到服务对象。

我知道现在需要将angular-resource.js作为单独的文件包含在内,并将 ngResource 注入到app模块中,如下所示:

// main app javascript file

'use strict';

angular.module('contactapp', ['ngResource']).
  config(['$routeProvider', function($routeProvider) {
  $routeProvider.
      when('/contacts', {template: 'assets/app/partials/contact-list.html', controller: ContactListCtrl}).
      when('/contacts/new', {template: 'assets/app/partials/new-contact.html', controller: ContactListCtrl}).
      when('/contacts/:contact_id', {template: 'assets/app/partials/contact-detail.html', controller: ContactDetailCtrl}).
      otherwise({redirectTo: '/contacts'});      

}]);

我也知道,当文件被缩小时,控制器无法分辨它们的依赖关系,除非它们也被注入控制器对象,如下所示:

ContactListCtrl.$inject = ['$scope', '$http', 'Contacts'];

我也试过用Angular推荐的括号表示并传入这样的函数的另一种方式:

var ContactListCtrl= ['$scope', '$http', 'Contacts', function($scope, $http, Contacts) { /* constructor body */ }];

然而,这似乎都不起作用。

我的应用程序可以看到所提供资源的唯一方法是关闭Production.rb文件中的资产压缩,如下所示:

# Compress JavaScripts and CSS
  config.assets.compress = false

我需要花费几个小时来解决这个问题,但最近我看到另一个Rails + AngularJS应用程序出现了同样的问题。

Jens Krause得出了同样的结论并在他的博客上解释了它:http://www.websector.de/blog/2012/01/17/fun-with-angularjs-rails-coffeescript-sass-another-cafe-townsend-example/

如果我有一个相对较大的应用,并且我需要压缩资产,我如何使用Angular with Rails解决这个问题?

感谢。

3 个答案:

答案 0 :(得分:7)

如果您使用的是Rails 4,请将生产和登台环境中的js_compressor更改为:

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

答案 1 :(得分:3)

我认为问题在于你的minifier仍然是对控件本身的变量名称的晦涩(ContactListCtrl - > a或它做的任何事情)。

您是否尝试过使用module.controller函数定义控制器?

angular.module('myModule', [])
.controller('Controller1', ['dep1', 'dep2', function(dep1, dep2) {
    //code
}]);

答案 2 :(得分:2)

将此行添加到我的config / environments / production.rb为我做了诀窍:

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