【发布时间】:2015-06-17 10:08:47
【问题描述】:
我正在开发一个 AngularJS 应用程序。为了在生产中发布代码,我使用了这个 Grunt 配置/任务:
grunt.registerTask( 'compile', [
'sass:compile', 'copy:compile_assets', 'ngAnnotate', 'concat:compile_js', 'uglify', 'index:compile'
]);
调试真的很困难,对于已经遇到此类问题的人来说,这是一个问题,可以指出一些方向。
我的主模块包括这些子模块:
angular
.module('controlcenter', [
'ui.router',
'ui.bootstrap',
'templates-app',
'templates-common',
'authentication',
'api',
'reports',
'interceptors',
'controlcenter.websites',
'controlcenter.users',
'controlcenter.campaigns',
'controlcenter.reports',
'controlcenter.login'
])
.run(run);
我得到的错误如下:
Uncaught Error: [$injector:modulerr] Failed to instantiate module controlcenter due to:
Error: [$injector:modulerr] Failed to instantiate module controlcenter.websites due to:
Error: State 'websites'' is already defined
如果我删除网站模块,我会收到相同的错误 controlcenter.users。
我正在使用ui-router 处理应用内的路由。
在我的构建过程(用于集成测试)之后,一切正常:
grunt.registerTask( 'build', [
'clean', 'html2js', 'jshint', 'sass:build',
'concat:build_css', 'copy:build_app_assets', 'copy:build_vendor_assets',
'copy:build_appjs', 'copy:build_vendorjs', 'copy:build_vendorcss', 'index:build', 'karmaconfig',
'karma:continuous'
]);
所以也许ngAnnotate 或concat/uglify 在这里做奇怪的事情?
更新 1: 它与我的模块配置有关。代码如下:
angular
.module('controlcenter.websites',
[
'ui.router'
]
)
.config(config);
config.$inject = ['$stateProvider'];
function config($stateProvider) {
$stateProvider.state( 'websites', {
url: '/websites',
views: {
"main": {
controller: 'WebsitesController',
templateUrl: 'websites/websites.tpl.html'
}
}
});
}
- 当我将状态名称更改为 website_2 时,出现错误 'websites_2 已定义'。
- 当我完全删除模块时,下一个模块在配置文件中有同样的问题。那么结构错了吗?
更新 2:
这个问题似乎与 concat 相关。
它将每个 JS 文件一个接一个地添加到一个更大的文件中。我所有的模块都在最后。最后一个模块总是存在“已定义状态”的问题。所以这不仅仅是模块相互附加的顺序,还有别的东西......
更新 3: 我把我的代码(我已经排除了每个控制器代码和函数,只是脚手架)放在gist 中。这是我编译后的结果,没有丑化。
【问题讨论】:
-
所有这些模块( controlcenter.websites , controlcenter.users ,...)是否具有相同名称的状态或每个模块中的状态名称不同?
-
不同的名字。状态始终是网站、用户等。奇怪的是,即使我将网站重命名为 website_2,我也会收到一个错误,“websites_2”已经定义。
-
如果你使用
whatever.$inject = ...,那么你不需要使用ngAnnotate。注释会将.config(config)转换为.config(['$stateProvider', config])
标签: angularjs