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";