CommonJs,AMD,CMD是什么?

前端模块化的概念已经扑面而来,为什么要模块化?

1.命名冲突

2.文件依赖

为了解决上面的问题,我们使用闭包,命名空间,还要考虑js文件的加载顺序,稍不留神就会出错。

然而模块化的代码帮我们一次性解决了上面的问题,我们可以随心所欲的命名,随心所欲的引用,不用考虑加载顺序,如此这般的清爽。

CommonJS,AMD(异步模块定义),CMD(通用模块定义)这三个都是JS模块化过程中产生的规范,其中CommonJS是服务器端的,同步方式,应用的例子最常见的是NodeJS。而AMD和CMD是浏览器端的,异步方式,最常见的是requireJs和seaJs。

CommonJS

过去,js一直应用在浏览器端,随着web2.0和Html5的到来,可以供js调用的接口越来越丰富,js在浏览器能做的事情也越来越多。但是在后端,js却因为一直没有相关的标准而没有用武之地。

CommonJS规范的提出,弥补了这种缺憾。规范涵盖了模块,二进制,Buffer,I/O流,进程环境,文件系统,套接字,单元测试,包管理等。有了这些,才有了Node的出现。现在,Node的应用越来越广泛,也促进了CommonJS规范的完善,它们互相起到了相辅相成的作用。因为commonJS应用在服务端,所以在引用模块(一个文件就是一个模块)的时候,使用同步方式也不会影响到读取的速度,但是在浏览器端,就要用到异步读取的AMD,CMD规范了。

http://www.commonjs.org/specs/ 这是commonJS的官网,网站对CommonJS的定义就是javascript:not just for browers any more!

这是CommonJS模块标准应用的一个简单地例子,exports对外提供模块内部的方法,require用来引用模块,获取其中通过exports对外提供的方法

AMD和CMD

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

两者的区别就是对所依赖模块的加载时间不同。AMD对依赖的模块式提前执行,CMD对于依赖模块是延迟执行。

//AMD
define(['./a','./b'], function (a, b) {
    a.foo();
    b.foo();
});
//CMD
define(function (requie, exports, module) {
    var a = require('./a');
    a.foo();
 
    var b = requie('./b');
    b.foo();
}); 
从上边的代码里就可以看到两者的区别,不过AMD现在也支持延迟加载。





你可能感兴趣的:(CommonJs,AMD,CMD是什么?)