common.js AMD CMD

common.js

common.js定制了这些规范 而node.js就是这些规范的实现前端

node.js的模块系统,就是参照CommonJS规范实现的。在CommonJS中,有一个全局性方法require(),用于加载模块。假定有一个数学模块math.js,就能够像下面这样加载。node

CommonJs规范的出发点:JS没有模块系统、标准库较少、缺少包管理工具;为了让JS能够在任何地方运行,以达到Java、C#、PHP这些后台语言具有开发大型应用的能力;后端

在CommonJs规范中:数组

  • 一个文件就是一个模块,拥有单独的做用域;浏览器

  • 普通方式定义的变量、函数、对象都属于该模块内;bash

  • 经过require来加载模块;服务器

  • 经过exports和modul.exports来暴露模块中的内容;curl

commonjs是用在服务器端的,同步的,如nodejs异步

amd, cmd是用在浏览器端的,异步的,如requirejs和seajsasync

其中,amd先提出,cmd是根据commonjs和amd基础上提出的。

  • 1.对于依赖的模块AMD是提早执行,CMD是延迟执行。不过RequireJS从2.0开始,也改为能够延迟执行(根据写法不一样,处理方式不经过)。

  • 2.CMD推崇依赖就近,AMD推崇依赖前置。

AMD

基于commonJS规范的nodeJS出来之后,服务端的模块概念已经造成,很天然地,你们就想要客户端模块。并且最好二者可以兼容,一个模块不用修改,在服务器和浏览器均可以运行。可是,因为一个重大的局限,使得CommonJS规范不适用于浏览器环境。仍是上面的代码,若是在浏览器中运行,会有一个很大的问题,你能看出来吗?

  

var math = require('math');
math.add(2, 3);
复制代码

第二行math.add(2, 3),在第一行require('math')以后运行,所以必须等math.js加载完成。也就是说,若是加载时间很长,整个应用就会停在那里等。您会注意到 require 是同步的。

这对服务器端不是一个问题,由于全部的模块都存放在本地硬盘,能够同步加载完成,等待时间就是硬盘的读取时间。可是,对于浏览器,这倒是一个大问题,由于模块都放在服务器端,等待时间取决于网速的快慢,可能要等很长时间,浏览器处于"假死"状态。

所以,浏览器端的模块,不能采用"同步加载"(synchronous),只能采用"异步加载"(asynchronous)。这就是AMD规范诞生的背景。

CommonJS是主要为了JS在后端的表现制定的,他是不适合前端的,AMD(异步模块定义)出现了,它就主要为前端JS的表现制定规范。

AMD是"Asynchronous Module Definition"的缩写,意思就是"异步模块定义"。它采用异步方式加载模块,模块的加载不影响它后面语句的运行。全部依赖这个模块的语句,都定义在一个回调函数中,等到加载完成以后,这个回调函数才会运行。

AMD也采用require()语句加载模块,可是不一样于CommonJS,它要求两个参数:

require([module], callback);
复制代码

   第一个参数[module],是一个数组,里面的成员就是要加载的模块;第二个参数callback,则是加载成功以后的回调函数。若是将前面的代码改写成AMD形式,就是下面这样:

require(['math'], function (math) {
     math.add(2, 3);
});
复制代码

math.add()与math模块加载不是同步的,浏览器不会发生假死。因此很显然,AMD比较适合浏览器环境。目前,主要有两个Javascript库实现了AMD规范:require.js和curl.js。

cmd

SeaJS只会在真正须要使用(依赖)模块时才执行该模块 SeaJS是异步加载模块的没错, 但执行模块的顺序也是严格按照模块在代码中出现(require)的顺序, 这样才更符合逻辑吧! 你说呢, RequireJS?

相关文章
相关标签/搜索