AMD、CMD、CommonJS规范

1、产生背景

AMD、CMD、CommonJS都是为了解决JavaScript的模块加载而产生,倡导模块化开发理念。JavaScript没有自己的模块加载机制,当大量的复杂的代码产生时,没有好的加载机制,就会导致代码管理混乱,多人协作出问题。

2、规范约定

1)AMD(Asynchronous Module Definition),异步加载模块定义,AMD 是 RequireJS 在推广过程中对模块定义的规范化的产出。先定义所有依赖,然后在加载完成后在回调函数中执行。
require([module], callback);

AMD规范,其实是不符合写代码的逻辑顺序,需要提前说明依赖的模块。

2)CMD (Common Module Definition)规,通用模块定义,CMD是SeaJS在推广过程中对模块定义的规范化的产出。CMD则是依赖就近,用的时候再require。
define(function(require, exports, module) {
   var echarts = require('echarts');
});

CMD规范,比较符合写代码的逻辑顺序,不管写到哪儿发现需要依赖另一个模块,就可以使用require引入即可。

3)CommonJS规范是一个有志于构建 JavaScript 生态圈的组织,偏向于服务器端的规范。NodeJS就采用了CommonJS。一个单独的文件就是一个模块,加载模块使用require方法,该方法读取一个文件并执行,最后返回文件内部的exports对象。因为在服务器读取模块都是在本地磁盘,加载速度很快。但是如果在客户端,加载模块的时候有可能出现“假死”状况。

3、不同之处

CommonJS是服务器端的规范,与另外两个标准实际不冲突。

AMD和CMD的不同之处如下:

定位有差异。RequireJS 想成为浏览器端的模块加载器,同时也想成为 Rhino / Node 等环境的模块加载器。Sea.js 则专注于 Web 浏览器端,同时通过 Node 扩展的方式可以很方便跑在 Node 环境中。

遵循的规范不同。RequireJS 遵循 AMD(异步模块定义)规范,Sea.js 遵循 CMD (通用模块定义)规范。规范的不同,导致了两者 API 不同。Sea.js 更贴近 CommonJS Modules/1.1 和 Node Modules 规范。

推广理念有差异。RequireJS 在尝试让第三方类库修改自身来支持 RequireJS,目前只有少数社区采纳。Sea.js 不强推,采用自主封装的方式来“海纳百川”,目前已有较成熟的封装策略。

对开发调试的支持有差异。Sea.js 非常关注代码的开发调试,有 nocache、debug 等用于调试的插件。RequireJS 无这方面的明显支持。

两者代码质量有差异。RequireJS 是没有明显的 bug,SeaJS 是明显没有 bug。

插件机制不同。RequireJS 采取的是在源码中预留接口的形式,插件类型比较单一。Sea.js 采取的是通用事件机制,插件类型更丰富。

4、参考资料

https://www.cnblogs.com/highsea90/p/4383895.html

https://www.jianshu.com/p/09ffac7a3b2c

http://blog.csdn.net/xcymorningsun/article/details/52709608

猜你喜欢

转载自blog.csdn.net/lanyue1/article/details/79575287