CommonJS,AMD,CMD联系与区别

开通博客园已经一年多了,然而一篇文章都没有写,从这周发誓要开始写技术博客的习惯,也当做自己的知识体系整理,可以时常回顾,今天周五,刻不容缓~

今天早上偶然看到同事的项目里自己建的通用js叫commen.js,就顺道想到了commenJS,想凭自己理解把AMD,CMD一起整理下

 

JS模块化,是前端工程师向全栈跨进的一大步

随着node.js的出现,js不单单运行在浏览器环境的小盒子里,渐渐渗透到服务端应用。因此将js模块化,封装成API,供外界使用。

模块化的目的就是让项目代码高度解耦,让功能独立性,更方便做代码功能修改,及多点调用。

 

commonjs是用在服务器端的,同步加载,如node.js
AMD(异步模块定义)在浏览器端,异步加载,代表:requireJS

CMD(通用模块定义),在浏览器端,异步加载,代表:seaJS 

 

1.CommonJS 加载模块是同步的,所以只有加载完成才能执行后面的操作。所以commenjs适合用在服务端,模块文件都是存在磁盘上的,加载很快,所以不用考虑异步加载。

CommonJS定义的模块分为:{模块引用(require)} {模块定义(exports)} {模块标识(module)}

require()用来引入外部模块;exports对象用于导出当前模块的方法或变量,唯一的导出口;module对象就代表模块本身。

 //sum.js
 exports.sum = function(a,b){ 
return a + b;
};
//calculate.js var math = require('sum'); exports.add = function(n){ return math.sum(val,n); };

 

2.CommenJs加载是同步的,并不适合在浏览器中加载,于是为了制定前端JS的表现规范,AMD就诞生了。

AMD需要在声明模块的时候指定所有的依赖(dep),并且还要当做形参传到factory中

define(['dep1', 'dep2'], function (dep1, dep2) {
    //Define the module value by returning a value.
    return function () {};
});

 

3.

CMD同样是异步加载模块,在加载完所有依赖的模块后,并不会立即执行模块,等到真正需要(require)的时候才开始解析。

seajs.config({
    alias: { 'jquery': 'jquery/jquery/1.10.1/jquery' }
});

define(function(require, exports, module) {
    //引用jQuery模块
    var $ = require('jquery');
});

 

AMD和CMD的区别:

1.AMD预执行,CMD懒执行:AMD一开始就会加载完所有依赖模块并执行,CMD加载完后等到真正require的时候才会执行(RequireJS 从 2.0 开始,也改成可以延迟执行)

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

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

 
 
posted @ 2017-01-20 15:33  皇家蓝  阅读(233)  评论(0)    收藏  举报