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
var a = require('./a')
a.doSomething()
// 此处略去 100 行
var b = require('./b') // 依赖可以就近书写
b.doSomething()
// ...
})
a.doSomething()
// 此处略去 100 行
b.doSomething()
...
})
3.AMD 的 API 默认是一个当多个用,CMD 的 API 严格区分,推崇职责单一。比如 AMD 里,require 分全局 require 和局部 require,都叫 require。CMD 里,没有全局 require,而是根据模块系统的完备性,提供 seajs.use 来实现模块系统的加载启动。CMD 里,每个 API 都简单纯粹

浙公网安备 33010602011771号