参考1:
参考2:
模块化是软件系统的属性,这个系统被分解为一组高内聚,低耦合的模块。
模块化是指在解决某一个复杂问题或一系列的杂糅问题时,依照一种分类的思维把问题进行系统性的分解以之处理。模块化是一种处理复杂系统分解为代码结构更合理,可维护性高的可管理的模块的方式。
-
定义封装的模块
-
定义新模块对其他模块的依赖
-
可对其他模块的引入支持
CommonJS是服务器端模块的规范,node.js采用了这个规范。
根据CommonJS规范,一个单独的文件就是一个模块,加载模块使用require方法,该文件读取一个文件并执行,最后返回文件内部的exports对象。
CommonJS加载模块是同步的,所以只有加载完成才能执行后面的操作。像Node.js主要用于服务器的编程,加载的模块文件一般都已经存在本地的硬盘,所有加载起来比较快,不用考虑异步加载的方式,所以CommonJS规范比较使用。
AMD指的是异步模块定义(Asynchronous Module Definition)。即所有模块将被异步加载,模块加载不影响后面语句运行,所有依赖某些模块的语句均放置在回调函数中。
- define(id?,dependencies?,factory)
- require()
RequireJS是一个前端的模块化管理的工具库,遵循AMD规范,它的作者就是AMD规范的创始人James Burke。
基本思想
通过同一个函数来将所有需要的或者说所依赖的模块实现装载进来,然后返回一个新的函数(模块),我们所有的关于新模块的业务代码都在这个函数内部操作,其内部也可限制的使用已经记载进来的模块。
<script data-main="scripts/main" src="scripts/require.js"></script>优点
-
定义模块清晰,清晰的显示依赖关系
-
不会污染全局变量
-
允许非同步加载模块,也可以按需动态加载模块
define用于定义模块,RequireJS要求每个模块均放在独立的文件之中。按照是否有依赖其他模块的情况分为独立模块和非独立模块。
- 独立模块
define({
method1 : function(){},
method2 : function(){}
});
//等价于
define({
return {
method1 : function(){},
method2 : function(){}
}
});- 非独立模块
define(['module1','module2'],function(m1,m2){
//do something
});CMD(Common Module Definition)通用模块定义,是SeaJS在推广过程中模块定义的规范化产出的。
-
对于依赖的模块AMD是提前执行,CMD是延迟执行。(RequireJs从2.0开始,也改成可以延迟执行)
-
CMD推崇
依赖就近,AMD推崇依赖前置AMD写法
define(['a','b'],function(a,b){ //依赖一开始就写好 a.test(); b.test(); })
CMD写法
define(function(require,exports,module){ //依赖可以就近书写 var a = require('a'); a.test(); //软依赖 if(status){ var b = require('b'); b.test(); } })
-
AMD的API默认是一个当多个用,CMD严格的区分,推崇职责单一。
例如:AMD里的require分全局的和局部的,CMD里面没有全局的require,而是使用seajs.use()来实现模块系统额加载启动。CMD里的每个API都简单纯粹。
UMD是AMD和CommonJS的柔和,目的是做到跨平台。
UMD先判断是否支持Node.js的模块(exports)是否存在,存在则使用node.js模块模式,再判断是否支持AMD(define是否存在),存在则使用AMD方式加载模块。