【问题标题】:AngularJS + Rails - Problems when compressing assetsAngularJS + Rails - 压缩资产时的问题
【发布时间】:2012-05-18 21:18:28
【问题描述】:

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

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

// 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 和 Rails 解决这个问题?

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 帮助了我(Heroku 上的 Angular + Rails 应用程序)。
    【解决方案2】:

    我认为问题在于您的缩小器仍在混淆控件本身的变量名称(ContactListCtrl -> a 或其他任何功能)。

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

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

    【讨论】:

    【解决方案3】:

    将此行添加到我的 config/environments/production.rb 对我有用:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      • 2018-10-23
      • 1970-01-01
      相关资源
      最近更新 更多