我对利用编译器工具自动化/简化角度项目感兴趣,这可能适用于其他所有事情,但角度注入和命名空间很难以逃避编译器知识。这样做的最佳/专业方法是什么?
谢谢,最后一件事,
app.controller('ctrl',['$rootScope',function($rootScope){
...
}]);
在缩小时起作用,但我如何缩小
app.config(['$routeProvider', function($routeProvider){
}]);
当我缩小连续的动作时它会起作用吗?
app.controller(...).directive(...).run(...)
答案 0 :(得分:11)
在Angular中,您需要为注入器注释函数,以了解要在函数中注入的依赖项。在官方角度网站上描述的函数中基本上有三种方法可以注入依赖项。这三种方式是:
1.使用内联数组注释
yourModule.controller('yourController', ['$scope', function($scope) {}]);
2.使用$ inject属性注释
var yourController = function($scope) {};
yourController.$inject = ['$scope'];
yourModule.controller('yourController', yourController);
3.Iplictly来自函数参数名称
yourModule.controller('yourController', function($scope) {});
现在,当您缩小项目时,您的依赖项名称将被重命名。 在第一种情况下,您的代码就像
yourModule.controller('yourController', ['$scope', function(e) {}]);
在第三种情况下,您的代码就像
yourModule.controller('yourController', function(e) {});
它会破坏您的应用,因为angular无法识别您的依赖项名称。因此建议永远不要在项目中使用隐式依赖注入。从上面两个内联数组注释是程序员中最受欢迎的方式。
答案 1 :(得分:2)
我建议使用https://github.com/olov/ng-annotate。它允许您编写如下代码。
angular.module("MyMod").controller("MyCtrl", function($scope, $timeout) {
});
然后ngAnnotate将其转换为以下内容,这对于缩小是安全的。
angular.module("MyMod").controller("MyCtrl", ["$scope", "$timeout", function($scope, $timeout) {
}]);
答案 2 :(得分:1)
minifyer保持弦不变,这就是我们使用数组符号的原因。 链接方法不会改变minifyer保持字符串完整的方式。
var app=module(myapp);
app.config(['$routeProvider', function($routeProvider){
$routeProvider.dosomestuffs()
}]);
将缩小类似
var a=module(myapp);
a.config(['$routeProvider', function(b){
b.dosomestuffs()
}]);
但由于' $ routeProvider'而且棱角分明仍然会找到方向。串。
答案 3 :(得分:0)
如果你总是使用注释,那么缩小角度脚本应该没有问题。
app.controller(['$scope', function(mrScope) {
mrScope.yourProperty = 'it does not matter the dependency variable names if you use annotations';
}]);
答案 4 :(得分:0)
只要对正在注入的依赖项使用数组表示法,就不会出现缩小问题。您正在使用的缩小工具应该可以轻松处理您的任何示例(在我的项目中,我们使用uglify
来完成此操作)。
事实上,对于奇怪命名的注入(以点和字符命名导致无效的函数名称,如ABC.CDE
),数组符号是注入它们的最佳方式。
答案 5 :(得分:0)
我在缩小时遇到了同样的问题,和你一样,它只对$routeProvider
配置元素失败了。我的答案是使用像Himanshu这样的$inject
方法来说明我的配置,即使您为第一个示例显示的语法适用于我的控制器。因此,我会在此处发布我的.config()
代码,因为我没有在上面的答案中明确列出它:
var app = angular.module('myApp');
var RouteProviderConfig = function ($routeProvider) {
$routeProvider
.when(...)
.otherwise(...);
};
RouteProviderConfig.$inject = ['$routeProvider'];
app.config(RouteProviderConfig);
这修复了我的配置错误,但我的控制器的工作方式与第一个示例相同:
app.controller('ctrl',['$rootScope',function($rootScope){
...
}]);
Angular Documentation似乎暗示两种方式都应该有效,所以我认为可能存在配置错误,或$routeProvider
或其他完全错误......