首页 > 代码库 > AMD 与 CMD 区别到底在哪里?

AMD 与 CMD 区别到底在哪里?

模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问题进行系统性的分解以之处理。模块化是一种处理复杂系统分解为代码结构更合理,可维护性更高的可管理的模块的方式。可以想象一个巨大的系统代码,被整合优化分割成逻辑性很强的模块时,对于软件是一种何等意义的存在。对于软件行业来说:解耦软件系统的复杂性,使得不管多么大的系统,也可以将管理,开发,维护变得“有理可循”。

还有一些对于模块化一些专业的定义为:模块化是软件系统的属性,这个系统被分解为一组高内聚,低耦合的模块。那么在理想状态下我们只需要完成自己部分的核心业务逻辑代码,其他方面的依赖可以通过直接加载被人已经写好模块进行使用即可。

首先,既然是模块化设计,那么作为一个模块化系统所必须的能力:

   1. 定义封装的模块。

   2. 定义新模块对其他模块的依赖。

   3. 可对其他模块的引入支持。

 

AMD CMD 区别到底在哪里?

 下面是玉伯对于 AMD CMD 区别的解释:

 

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

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

 

   类似的还有 CommonJS Modules/2.0 规范,是 BravoJS 在推广过程中对模块定义的规范化产出还有不少??

 

   这些规范的目的都是为了 JavaScript 的模块化开发,特别是在浏览器端的。

    目前这些规范的实现都能达成浏览器端模块化开发的目的。

 

    区别:

 

   1. 对于依赖的模块,AMD 是提前执行,CMD 是延迟执行。不过 RequireJS 2.0 开始,也改成可以延迟执行(根据写法不同,处理方式不同)。CMD 推崇 as lazy aspossible.

   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()

   // ...

})

 

虽然 AMD 也支持 CMD 的写法,同时还支持将 require 作为依赖项传递,但 RequireJS 的作者默认是最喜欢上面的写法,也是官方文档里默认的模块定义写法。

   3. AMD API 默认是一个当多个用,CMD API 严格区分,推崇职责单一。比如 AMD 里,require 分全局 require 和局部 require,都叫 requireCMD 里,没有全局 require,而是根据模块系统的完备性,提供 seajs.use 来实现模块系统的加载启动。CMD 里,每个 API 都简单纯粹。

   4. 还有一些细节差异,具体看规范的定义就好。

另外,SeaJS RequireJS 的差异,可以参考:https://github.com/seajs/seajs/issues/277


本文出自 “时光” 博客,请务必保留此出处http://timeblog.blog.51cto.com/8650972/1598801

AMD 与 CMD 区别到底在哪里?