define(['dep1','dep2'],function(dep1,dep2){
//内部只能使用制定的模块
return function(){};
});//CMD方式定义模块
define(function(require,exports,module){
//此处如果需要某XX模块,可以引入
var xx=require('XX');
});但全球有两种比较流行的 JavaScript 模块化体系,一个是 Node 实现的 CommonJS,另外一个是 AMD。很多类库都同时支持 AMD 和 CommonJS,但是不支持 CMD。或许国内有很多 CMD 模块,但并没有在世界上流行起来。
现在比较火的 React 及周边类库,就是直接使用 CommonJS 的模块体系,使用 npm 管理模块,使用 Browserify 打包输出模块。
不久的将来 ES6 中新的模块化标准,可能就都得遵循新的标准了,什么AMD、CMD可能到时也不会怎么用了。
但是目前来说,前端开发没有用模块化编程就真的out的了,而目前的模块化编程,本人还是建议用SEAJS,虽然很多插件需要追加或修改一小块代码才能支持。但改过一次就能反复使用,也不会影响其它标准的支持。总体还算是比较方便实用的。
区别:
1. 对于依赖的模块,AMD 是提前执行,CMD 是延迟执行。不过 RequireJS 从 2.0 开始,也改成可以延迟执行(根据写法不同,处理方式不同)。CMD 推崇 as lazy as possible.
2. CMD 推崇依赖就近,AMD 推崇依赖前置。看代码:
CMD
define(function(require, exports, module) {
var a = require('./a')
a.doSomething()
// 此处略去 100 行
var b = require('./b') // 依赖可以就近书写
b.doSomething()
// ...
})AMD
define(['./a', './b'], function(a, b) { // 依赖必须一开始就写好
a.doSomething()
// 此处略去 100 行
b.doSomething()
// ...
})3. AMD 的 API 默认是一个当多个用,CMD 的 API 严格区分,推崇职责单一。比如 AMD 里,require 分全局 require 和局部 require,都叫 require。CMD 里,没有全局 require,而是根据模块系统的完备性,提供 seajs.use 来实现模块系统的加载启动。CMD 里,每个 API 都简单纯粹。
4. 还有一些细节差异,具体看这个规范的定义就好,就不多说了。
AMD规范:
requirejs的基本使用:
1、引入requirejs包,并且设置入口文件
<script data-main='js/main' src='http://apps.bdimg.com/libs/require.js/2.1.9/require.min.js'></script>
2、定义主模块 在main.js文件中
define(['module1','module2',function(m1,m2) {
// 说明:上面两个module是依赖模块,通过m1,m2的方式来使用
// 在这里我们写自己的业务逻辑 todo
// 如果我们需要暴露出去,需要 return ,不是用exports或者module.exports // return {};
}]);CMD规范:
1、引入包文件seajs
<script src='http://apps.bdimg.com/libs/seajs/2.3.0/sea.js'></script>
2、定义一个模块,比如在这个文件 student.js 中
define(function(require,exports,module){
function Student(){ this.name = '张三'; } // 对外暴露该模块的接口:
module.exports = new Student();
})通过 seajs.use() 来实现,第一个参数是使用模块的路径,第二个回调函数中的参数是所要使用模块暴露出来的一个接口。
seajs.use('./student.js',function(stu){
console.log(stu.name); // 张三 });Seajs和RequireJS的最明显的区别就是在模块定义时对依赖的处理不同
版权声明:本文为原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
关注微信公众号:"cq_xifan";