CMD 和 AMD

AMD与CMD规范对比

通常我们会拿 CMD 规范来和 AMD 规范进行对比。那么 AMD 和 CMD 有什么区别和对比的呢?

申明依赖模块不同

对于依赖的模块,AMD 和 CMD 的处理方式是不一样的。

  • AMD 推崇依赖前置,在定义模块的时候就要声明其依赖的模块。
  • CMD 推崇依赖就近,只有在用到某个模块的时候再去 require 。
// CMD
define(function(require, exports, module) {
  var a = require('./a') a.doSomething() // 依赖可以就近书写 var b = require('./b') b.doSomething() }) // AMD 默认推荐的是 依赖必须一开始就写好 define(['./a', './b'], function(a, b) { a.doSomething() b.doSomething() }) 

执行依赖模块时机

  • AMD 提前执行依赖(异步加载:依赖先执行)+延迟执行
  • CMD 延迟执行依赖(运行到需加载,根据顺序执行)

加载器

AMD 是 RequireJS 在推广过程中对模块定义的规范化产出。
CMD 是 SeaJS 在推广过程中对模块定义的规范化产出。

使用SeaJS

SeaJS 是 CMD 规范的具体实现。使用 SeaJS 和使用 requireJS 十分类似,只是写法上稍微有所不同,具体如下:

  1. 引入 SeaJS 的库
  2. 定义模块(define)
  3. 暴露模块接口(exports)
  4. 加载依赖模块(require)

如下面的代码:

<script src="./sea.js"></script> <script> define(function (require,exports,module) { // exports : 对外的接口 // requires : 依赖的模块 require('./a.js');//如果地址是一个模块的话,那么require的返回值就是模块中的exports }); </script> 

SeaJS(CMD)为什么被淘汰

事实上,在过去 SeaJS(CMD) 曾经颇具影响力,为什么要逐渐被淘汰了呢?

感兴趣的同学可以带着这样的问题,阅读下面的帖子。
Sea.js作者发布微博: 应该给 Sea.js 和 KISSY 也树一块墓碑了。 为啥啊?过时了吗?

更多阅读

转载于:https://www.cnblogs.com/ice-blog/p/7355555.html

### AMD CMD 模块化规范的区别 AMD(Asynchronous Module Definition) CMD(Common Module Definition)是两种常用的 JavaScript 模块化规范,它们在设计理念实现方式上存在显著差异。以下是两者的主要区别: #### 1. **模块加载方式** - **AMD**:强调依赖前置,在模块定义时就需要明确列出所有的依赖项,并且这些依赖项会在模块执行之前全部加载完成[^3]。这意味着即使某些依赖项可能不会被实际使用,也会被提前加载。 - **CMD**:采用按需加载的方式,依赖可以延迟到真正需要的时候再加载。这种方式更加灵活,能够避免不必要的模块加载,从而提升性能[^4]。 #### 2. **API 设计哲学** - **AMD**:API 设计较为复杂,`require` 同时作为全局方法局部方法使用,这可能导致一定的混淆。例如,AMD 中的 `require` 可以用于同步或异步加载模块[^1]。 - **CMD**:推崇职责单一原则,每个 API 的功能明确且简单。例如,`seajs.use` 专门用于启动模块系统,而 `require` 则专注于模块加载[^1]。 #### 3. **代码组织结构** - **AMD**:模块定义通常采用 `define` 函数,依赖项以数组形式列出,回调函数接收这些依赖项作为参数。例如: ```javascript define(['moduleA', 'moduleB'], function(A, B) { // 模块逻辑 }); ``` - **CMD**:模块定义也使用 `define` 函数,但依赖项可以在需要时通过 `require` 动态加载。例如: ```javascript define(function(require, exports, module) { if (condition) { var A = require('moduleA'); } else { var B = require('moduleB'); } }); ``` #### 4. **适用场景** - **AMD**:更适合需要提前加载所有依赖的场景,例如大型应用的初始化阶段[^3]。 - **CMD**:更适合动态加载按需加载的场景,能够更好地支持模块的懒加载条件加载[^4]。 #### 5. **实现工具** - **AMD**:主要由 RequireJS 实现,适合浏览器端 Node.js 环境下的模块管理[^2]。 - **CMD**:主要由 SeaJS 实现,强调简单、直观的模块化开发体验[^5]。 ### 示例代码对比 #### AMD 示例 ```javascript // 定义模块 define(['moduleA', 'moduleB'], function(A, B) { return function() { A.doSomething(); B.doSomethingElse(); }; }); // 使用模块 require(['myModule'], function(myModule) { myModule(); }); ``` #### CMD 示例 ```javascript // 定义模块 define(function(require, exports, module) { var A = require('moduleA'); exports.doSomething = function() { A.doSomething(); }; }); // 使用模块 seajs.use(['myModule'], function(myModule) { myModule.doSomething(); }); ``` ### 总结 AMD CMD 的核心区别在于模块加载策略 API 设计理念。AMD 更加注重依赖的提前加载全局统一性,而 CMD 则强调按需加载职责单一性。开发者可以根据具体需求选择合适的模块化规范。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值