我们有一个相当大的angularJS应用程序,其中所有控制器都在一个文件中。构造AngularJS应用程序
我们正在考虑将每个控制器拆分为相应的文件。有什么理由不这样做?
我们想拆分它的原因是由于更容易管理源文件控制/文件中的更改,显然,更直观。
请指教。
我们有一个相当大的angularJS应用程序,其中所有控制器都在一个文件中。构造AngularJS应用程序
我们正在考虑将每个控制器拆分为相应的文件。有什么理由不这样做?
我们想拆分它的原因是由于更容易管理源文件控制/文件中的更改,显然,更直观。
请指教。
可能与大型应用的最大的问题就是把所有的 代码。在组织工具的工具栏上,您已经有文件,目录,模块,服务和控制器。有关良好的AngularJS项目结构的快速概览 ,请查看Github上的 的Angular Seed。不过,我想深入一点,并提供一些关于项目结构的其他建议。让我们从目录 开始,并按照我们的方式向下列表。
例如你的文件结构可以是这样的:
project/ app.js controllers/ #your controllers files here views/ #your templates here services/ #your services files directives/ #your custom directives
每个文件应该有它的“东西”,其中一个“东西”是一个 控制器,指令,过滤或服务。这使得很小, 专注的文件。它还有助于创建一个测试API以便如何执行 。如果您发现自己经常在文件中翻来覆去,则表明您的API过于复杂。你应该重新思考,重构和简化。
检查文章的更多细节。
有很多不同的方式可以构建你的应用程序,几乎没有对与错。所以不,没有理由不这样做,它看起来很有意义。
我亲自决定用下面根据我的经验给你一个例子结构:
我用角种子项目的目录结构:
自己利布斯
在位于在LIB/myCompany的我前缀的所有文件,并方法名称与我公司前缀我自己的图书馆。如果我的公司将被称为东亚有限公司,那么我会创建一个名为“ea”的双字母前缀。这将防止名称与我的动态js脚本发生冲突,因为控制器和服务的名称可以通过我的应用程序公开获得。
LIB/EA/EA-validators.js
(function() {
'use strict'
angular.module('eaValidators', [])
.directive('eaValidateUnique', [function() {
// directive code goes here
}])
.directive('eaValidateId', [function() {
// code goes here
}])
.controller('MyCtrlJustAsExample', ['$scope', function($scope) {
// code goes here
}]);
})();
I组中的一切向逻辑模块,例如:
验证模块例如包含指令,控制器,服务等。我区分逻辑实体而不是区分控制器,指令等等。我发现这个结构更高效,因为当我想改变例如与验证有关的东西时,我知道它在我的验证模块中。
你可以在这里找到例子:http://chstrongjavablog.blogspot.ch/
动态内容
我有我的动态JS文件一个类似的做法。如果我有例如用户页面和供应商的网页我想显示,然后我在JS目录中创建以下文件:
同样,这些文件可以在模块下分组的同一文件中包含指令,控制器和服务。所以如果我需要改变一些与用户相关的东西,我马上就会知道user.js中的代码。
样本user.js的可以看看以下几点:
JS/user.js的
angular.module('user', ['ngResource'])
.controller('UserListCtrl', ['$scope', 'User', function($scope, User) {
// code goes here
}])
.controller('UserNewCtrl', ['$scope', 'User', function($scope, User) {
// code goes here
}])
.factory('User', ['$resource', function($resource) {
return $resource('/api/user/:userId', {userId: '@id'});
}]);
胶水它一起
的js/app.js
然后我使用js/app.js来粘合一切一起做路由:
angular.module('myApp', ['eaValidators', 'vendor', 'user'])
.config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/user', {templateUrl: 'partials/user/user-list.html', controller: 'UserListCtrl'});
$routeProvider.when('/user/new', {templateUrl: 'partials/user/user-new.html', controller: 'UserNewCtrl'});
$routeProvider.otherwise({redirectTo: '/user'});
}])
.config(['$httpProvider', function ($httpProvider) {
$httpProvider.defaults.headers.common['Content-Type'] = 'application/json';
$httpProvider.defaults.headers.common['Accept'] = 'application/json';
}]);
然后我只是钩住主索引内的文件。HTML文件:
的index.html
<!doctype html>
<html lang="en" ng-app="myApp">
<head>
<meta charset="utf-8">
<title>YourApp</title>
<link rel="stylesheet" href="css/app.css"/>
<link rel="stylesheet" href="css/style.css"/>
<link rel="stylesheet" href="css/ea-validators.css"/>
</head>
<body>
<!-- Display partial pages -->
<div ng-view></div>
<!-- Include all the js files. In production use min.js should be used -->
<script src="lib/jquery203/jquery-2.0.3.js"></script>
<script src="lib/angular114/angular.js"></script>
<script src="lib/angular114/angular-resource.js"></script>
<script src="lib/ea/ea-validators.js"></script>
<script src="js/app.js"></script>
<script src="js/user.js"></script>
<script src="js/vendor.js"></script>
</body>
</html>
这种结构的好处是,我可以在user.js的和用户谐音拷贝过来例如到另一个项目和再利用大部分码。
此外,我有我的全局验证处理程序,错误处理程序,身份验证处理程序,我可以检查从我的存储库到lib目录。
我发现这个结构是迄今为止效率最高的。
另一种方法
你也可以使用自耕农,做了很多关于结构为您服务。然而,它确实增加了很多依赖关系,当我尝试使用它时,我在安装过程中发现了一些依赖冲突的问题。我个人的经验法则是,如果我在1天内无法工作,我就会放弃手中的工作,因为我会花时间花费在代码上。我自己设定的另一个经验法则是,如果有一个由不同目标的个体开发的依赖关系修补的框架,我会尽量避免它。请注意,这些是我自己制定的个人规则,可能不适合其他人使用。出于这些原因,我决定不使用它。但似乎已经有一个相当大的社区。
生产
用于生产目的时,你可以再使用UglyfyJS或谷歌关闭编译器创建一个压缩的js文件的所有代码或seperatly压缩每个文件。
我希望这个描述对你有用。
在我看来,以构建一个大 AngularJS应用的最佳方式是通过功能做在他们的书“精通Web应用程序开发与AngularJS”提出,由彼得·培根达尔文和帕维尔·科兹洛夫斯基。
代替由AngularJS种子项目推荐的结构的(和许多其它类似的约曼的发生器 - 角),其是“技术上驱动”是指如控制器,谐音/视图等的每个元素类型在其自己的文件夹的土地,您应该使用“域驱动的”结构,其中反映了您的代码中的业务域。
它具有很多优点,如:
下面的例子(只是为了澄清的想法)的结构中,如上面提到的书中提出:在项目
顶级目录:
- src: contains application source code
- test: contains accompanying automated tests
- vendor: contains third party dependencies
- build: contains build scripts
- dist: contains build results, ready to be deployed in a target environment
里面的SRC文件夹(固定):
- app: AngularJS-specific code, domain-driven
- common: AngularJS-specific code, boiler-plate
- assets: holds images and icons,
- less: LESS variables
- index.html - entry point to the application
里面应用文件夹(域驱动)例如网络店铺:
- shop
- products
- customers
- orders
- orderlists
- orderdetails
- ... etc.
- admin
- users
- ... etc.
每个文件夹包含所有相关的代码,包括谐音,脚本等
您的链接在这里不起作用。还有一些说明,为什么*你建议你做什么会很好。编辑,链接现在可以运行。 – Matsemann
@Matsemann是的澄清是在我后面提到的。 – Mounir
这对我来说看起来很不错。 @或者 - 你应该考虑接受它或发表一些你觉得缺乏的评论。 – hughesdan