前端模块化AMD与CMD的区别

原文地址:http://blog.chinaunix.net/uid-26672038-id-4112229.html

AMD(Asynchronous Module Definition)CMD(Common Module Definition)

AMD

    Asynchronous Module Definition 异步模块定义,所有的模块将被异步加载,模块加载不影响后面语句运行。所有依赖某些模块的语句均放置在回调函数中。 
    AMD规范定义了一个自由变量或者说是全局变量 define 的函数。 
    define( id?, dependencies?, factory );    
    第一个参数 id 为字符串类型,表示了模块标识,为可选参数。若不存在则模块标识应该默认定义为在加载器中被请求脚本的标识。如果存在,那么模块标识必须为顶层的或者一个绝对的标识。
    第二个参数,dependencies ,是一个当前模块依赖的,已被模块定义的模块标识的数组字面量。
    第三个参数,factory,是一个需要进行实例化的函数或者一个对象。 
    创建模块标识为 alpha 的模块,依赖于 require, export,和标识为 beta 的模块  

RequireJS

官网 http://www.requirejs.org/
API http://www.requirejs.org/docs/api.html

RequireJS 是一个前端的模块化管理的工具库,遵循AMD规范,它的作者就是AMD规范的创始人 James Burke。所以说RequireJS是对AMD规范的阐述一点也不为过。

RequireJS 的基本思想为:通过一个函数来将所有所需要的或者说所依赖的模块实现装载进来,然后返回一个新的函数(模块),我们所有的关于新模块的业务代码都在这个函数内部操作,其内部也可无限制的使用已经加载进来的以来的模块。 

CMD
在CMD中,一个模块就是一个文件,格式为:define( factory );

全局函数define,用来定义模块。
参数 factory 可以是一个函数,也可以为对象或者字符串。
当 factory 为对象、字符串时,表示模块的接口就是该对象、字符串。

定义JSON数据模块:

define({ "foo": "bar" });

通过字符串定义模板模块:

define('this is {{data}}.');

factory 为函数的时候,表示模块的构造方法,执行构造方法便可以得到模块向外提供的接口。

define( function(require, exports, module) { 
// 模块代码
});

seaJS
官网 http://seajs.org/docs/
API快速参考 https://github.com/seajs/seajs/issues/266
sea.js 核心特征:
1. 遵循CMD规范,与NodeJS般的书写模块代码。
2. 依赖自动加载,配置清晰简洁。

  区别: 
    1. 对于依赖的模块,AMD 是提前执行,CMD 是延迟执行。不过 RequireJS 从 2.0 开始,也改成可以延迟执行(根据写法不同,处理方式不同)。CMD 推崇 as lazy as possible.
    2. CMD 推崇依赖就近,AMD 推崇依赖前置。看代码:
posted @ 2017-10-10 13:23  花影疏帘  阅读(107)  评论(0)    收藏  举报