浅析JS中的模块规范AMD和CMD
AMD就只有一个接口:define(id?,dependencies?,factory);
它要在声明模块的时候制定所有的依赖(dep),并且还要当做形参传到factory中,像这样:
define(['dep1','dep2'],function(dep1,dep2){...}); 要是没什么依赖,就定义简单的模块,下面这样就可以啦 define(function(){ var exports = {}; exports.method = function(){...}; return exports; });
这里有define,把东西包装起来,那Node实现中怎么没看到有define关键字呢,它也要把东西包装起来,其实,只是Node隐式包装了而已..
RequireJS就是实现了AMD规范的
二、CMD
玉伯写了seajs,就是遵循他提出的CMD规范,比AMD稍微强大点,用起来感觉也方便些
三、AMD与CMD的区别
CMD相当于按需加载,定义一个模块的时候不需要立即制定依赖模块,在需要的时候require就可以了,比较方便;而AMD则相反,定义模块的时候需要制定依赖模块,并以形参的方式引入factory中
//AMD方式定义模块 define(['dep1','dep2'],function(dep1,dep2){ //内部只能使用制定的模块 return function(){}; }); //CMD define(function(require,exports,module){ //此处如果需要某XX模块,可以引入 var xx=require('XX'); });
而SEAJS也有use功能也是需要先引入所有依赖的模块,如
//SEAJS.Use方式
seajs.use(['dep1','dep2'],function(dep1,dep2){
//这里实现事务
});
四、插件支持
但全球有两种比较流行的 JavaScript 模块化体系,一个是 Node 实现的 CommonJS,另外一个是 AMD。很多类库都同时支持 AMD 和 CommonJS,但是不支持 CMD。或许国内有很多 CMD 模块,但并没有在世界上流行起来。
现在比较火的 React 及周边类库,就是直接使用 CommonJS 的模块体系,使用 npm 管理模块,使用 Browserify 打包输出模块。
不久的将来 ES6 中新的模块化标准,可能就都得遵循新的标准了,什么AMD、CMD可能到时也不会怎么用了。
但是目前来说,前端开发没有用模块化编程就真的out的了,而目前的模块化编程,本人还是建议用SEAJS,虽然很多插件需要追加或修改一小块代码才能支持。但改过一次就能反复使用,也不会影响其它标准的支持。总体还算是比较方便实用的。
推荐阅读
-
Node.js中process模块常用的属性和方法
-
AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法
-
详解Node.js中path模块的resolve()和join()方法的区别
-
浅析Vue.js中v-bind v-model的使用和区别
-
node.js中process进程的概念和child_process子进程模块的使用方法示例
-
浅析angularJS中的ui-router和ng-grid模块
-
node.js中http模块和url模块的简单介绍
-
Node.js中process模块常用的属性和方法
-
JS 中document.write()的用法和清空的原因浅析
-
浅析JS中的模块规范AMD和CMD