【问题标题】:Angular build not working on serverAngular 构建无法在服务器上运行
【发布时间】:2023-03-15 17:50:01
【问题描述】:

我正在尝试在服务器上运行我的 AngularJS 前端。我正在使用 Yeoman 构建应用程序。我上传了非常基本的 hello world 应用程序,我得到了没有加载 JavaScript 的纯 HTML 文本。 Chrome 中的控制台这样说:

Error: Unknown provider: aProvider <- a
    at Error (<anonymous>)
    at http://../scripts/vendor/d10639ae.angular.js:2627:15
    at Object.getService [as get] (http://../scripts/vendor/d10639ae.angular.js:2755:39)
    at http://../scripts/vendor/d10639ae.angular.js:2632:45
    at getService (http://../scripts/vendor/d10639ae.angular.js:2755:39)
    at invoke (http://../scripts/vendor/d10639ae.angular.js:2773:13)
    at Object.instantiate (http://../scripts/vendor/d10639ae.angular.js:2805:23)
    at http://../scripts/vendor/d10639ae.angular.js:4620:24
    at update (http://../scripts/vendor/d10639ae.angular.js:13692:26)
    at http://../scripts/vendor/d10639ae.angular.js:8002:24 d10639ae.angular.js:5526

任何人有同样的经历并知道出路吗?

编辑:

'use strict';

yoAngApp.controller('MainCtrl',['$scope', '$window', function($scope, $window) {
    $scope.awesomeThings = [
        'HTML5 Boilerplate',
        'AngularJS',
        'Testacular'
    ];

    $scope.records = [{ title : 'one' }, { title : 'two' }, { title : 'three' }, { title : 'four' }];

    $scope.greet = function() {
        ($window.mockWindow || $window).alert('Hello ' + $scope.name);
    }
}]
);

【问题讨论】:

    标签: javascript angularjs yeoman


    【解决方案1】:

    我很确定您已经在生产服务器上使用了代码压缩器,对吗?

    无论如何,如果没有正确完成,使用 minifier 的 folks from Angular Js made pretty clear 可能会搞砸依赖注入。为什么会发生这种情况?看看:

    依赖注入与代码压缩器

    function MyController($scope, $log) { ... }

    在上面的 sn-p 中,您正在使用隐式 DI。 Angular 看到变量 $scope 并尝试将其与任何托管依赖项匹配。在本例中,它将匹配到 $scope 对象。

    然而,这在代码缩小后将不起作用,因为结果看起来像这样:

    function a(b, c) { ... }

    由于变量和函数名称被缩小,Angular 无法知道“a”到底是什么。

    解决方案

    使用显式依赖注入配置。

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

    在这个 sn-p 中,您通过将它们的名称数组附加到称为 $inject 的控制器(或服务)的特殊属性来定义应解决哪些依赖关系。现在 Angular 将知道它应该解析 $scope 并将其作为第一个参数传递给 MyController。然后它将解析$log 并将其作为第二个参数传递。 一切皆有可能,因为压缩器不会修改字符串变量的内容。

    【讨论】:

    • 如果我这样初始化控制器会怎样 -> yoAngApp.controller('MainCtrl', function($window, $scope) { ?
    【解决方案2】:

    正如@ŁukaszBachman 建议的那样,您可以使用 $inject 注释,或者如果您愿意,也可以使用内联注释:

    1. 让您的依赖注释接近您的函数定义(以提高可读性)。
    2. 远离污染全局命名空间。

     

    app.controller('UsersController',
      [
        '$scope', 'UserService', '$location', '$routeParams',
        function($scope, User, $location, $routeParams) {
          $scope.user = User.get({id: $routeParams.id});
          ...
        }
      ]
    );
    

    【讨论】:

    • 我按照你说的编辑了代码,但它似乎不起作用 - 同样的问题(我将代码添加到我的问题中)...
    • 您需要在每个要最小化的脚本中使用适当的注释。这是一个plunker demonstration,它证明内联注释在最小化的脚本中有效。此外,请确保您在同一周期内最小化您的角度源,以便在您的应用中使用相同的最小标识符(例如 angular.module 变为 a.m)。
    • 太好了,很高兴你们已经想通了! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 2014-05-04
    相关资源
    最近更新 更多