AngularJS模块加载
看讨论: Angular中的模块机制
AngularJS建立在模块原理上,大部分由AngularJS提供的功能都内置到一个名为ng的模块中,它包含了大量的指令和服务。
我们可以使用angular.module()的方式来创建一个Module对象,具体的语法如下:
angular.module(name, [requires], [configFn]);
其中name是模块被注册在注入器服务中的名称,requires是被添加到注册器服务的供这个模块使用的其他模块的模块名数组,默认情况下,ng模块会自动添加到每个实例化的模块中。configFn是在参数配置阶段调用的另一个函数。
模块所有依赖的实例都会被自动注入到该模块的实例中,依赖可以是模块、服务、以及在注册器中注册的任何其他对象。
http://beginor.github.io/2014/12/20/angularjs-controller-load-on-demand.html:
随着视图的不断增加, js文件 会越来越多, 而 AngularJS 默认需要把全部的 js 都一次性加载, 使用起来非常不便, 因此按需加载模块的需求会越来越强, 不过, AngularJS 并没有实现按需加载
AMD require:写上require这个js,这个js就会加载
angular:要先定义好这个模块,才能加载它
module应用的两种方式:
在页面上初始化moduleA,从moduleA的依赖关系中,引用到了moduleB
module
一个比较正式的Angular应用,需要声明一个module,供初始化之用。比如说:
angular.module("test", []) .controller("TestCtrl", ["$scope", function($scope) { $scope.a = 1;
}]);
随后,可以在HTML中指定这个module:
<div ng-app="test" ng-controller="TestCtrl"> {{a}}</div>
这样,就是以这个div为基准容器,实例化了刚才定义的module。
或者,也可以等价地这样,在这里,我们很清楚地看到,module的意义是用于标识在一个页面中可能包含的多个Angular应用。
或者
创建了两个module,在页面上只直接初始化了moduleA,但是从moduleA的依赖关系中,引用到了moduleB,所以,moduleA下面的TestCtrl,可以像引用同一个module下其他service那样,引用moduleB中定义的service。
angular 模块我感觉根本就不是amd,cmd这种规范, angular的模块其实和javascript 的代码结构, 文件加载, 依赖 关系都不大.
angular的模块更像是功能的命名空间, 就是一个app 或一个网站是一个模块 这种概念, 有点像组件的命名空间, 而不是javascript代码的模块管理. module "模块"可以翻译为"项目" 更好理解, module 其实改成project可能更好.
我认为,楼主误解了 module。它不是 namespace,只是作为一个复用单位来处理强内聚的不同构件(controller、directive、factor、service 等为“构件”)。所以,module 已经达到了预期目的,只是不能达到楼主臆想的那种预期。
其次,动态加载机制的不是推荐方式,这可以说是 requirejs 的问题。其实 requirejs 一直都有这个问题,对于一些有自身的生命周期管理的框架,难以切入。在WEB JS框架设计上,生命周期管理应该形成一个闭环,有一些与 browser 事件绑定的生命周期节点,使用 requirejs 完全无法处理闭环。所以延迟加载不是 angular 的坑,而是 requirejs 的缺陷。
参考:Angular Module声明和获取重载
module是angular中重要的模块组织方式,它提供了将一组内聚的业务组件(controller、service、filter、directive…)封装在一起的能力。这样做可以将代码按照业务领域问题分module的封装,然后利用module的依赖注入其关联的模块内容,使得我们能够更好的”分离关注点“,达到更好的”高内聚低耦合“。”高内聚低耦合“是来自面向对象设计原则。内聚是指模块或者对象内部的完整性,一组紧密联系的逻辑应该被封装在同一模块、对象等代码单元中,而不是分散在各处;耦合则指模块、对象等代码单元之间的依赖程度,如果一个模块的修改,会影响到另一个模块,则说明这两模块之间是相互依赖紧耦合的。
同时module也是我们angular代码的入口,首先需要声明module,然后才能定义angular中的其他组件元素,如controller、service、filter、directive、config代码块、run代码块等。
关于module的定义为:angular.module(‘com.ngbook.demo’, [])。关于module函数可以传递3个参数,它们分别为:
name:模块定义的名称,它应该是一个唯一的必选参数,它会在后边被其他模块注入或者是在ngAPP指令中声明应用程序主模块;
requires:模块的依赖,它是声明本模块需要依赖的其他模块的参数。特别注意:如果在这里没有声明模块的依赖,则我们是无法在模块中使用依赖模块的任何组件的;它是个可选参数。
configFn: 模块的启动配置函数,在angular config阶段会调用该函数,对模块中的组件进行实例化对象实例之前的特定配置,如我们常见的对$routeProvider配置应用程序的路由信息。它等同于”module.config“函数,建议用”module.config“函数替换它。这也是个可选参数。
对于angular.module方法,我们常用的方式有有种,分别为angular.module(‘com.ngbook.demo’, [可选依赖])和angular.module(‘com.ngbook.demo’)。请注意它是完全不同的方式,一个是声明创建module,而另外一个则是获取已经声明了的module。在应用程序中,对module的声明应该有且只有一次;对于获取module,则可以有多次。推荐将angular组件独立分离在不同的文件中,module文件中声明module,其他组件则引入module,需要注意的是在打包或者script方式引入的时候,我们需要首先加载module声明文件,然后才能加载其他组件模块。【重点】每个js是一个module。都是我们手动加的,还要保持顺序(不用require的话)。
angularJs 模块加载