当前端愈来愈发展的时候,传统的开发已经不能知足于前端性能和工程化的要求,因此做为一名高级的前端开发人员,必需要学习前端模块化方面的知识;html
下面主要谈一下,common.js require.js&sea.js这三者的相关介绍;前端
common.js
commonjs是伴随着Node.js一块儿出现的,Node 应用由模块组成,采用就是 CommonJS 模块规范;git
CommonJS API定义不少普通应用程序(主要指非浏览器的应用)使用的API,从而填补了这个空白。它的终极目标是提供一个相似Python,Ruby和Java标准库。这样的话,开发者可使用CommonJS API编写应用程序,而后这些应用能够运行在不一样的JavaScript解释器和不一样的主机环境中。在兼容CommonJS的系统中,你能够实用JavaScript程序开发:github
服务器端JavaScript应用程序
命令行工具
图形界面应用程序
混合应用程序(如,Titanium或Adobe AIR)api
CommonJS定义的模块分为:{模块引用(require)} {模块定义(exports)} {模块标识(module)}数组
require()用来引入外部模块;exports对象用于导出当前模块的方法或变量,惟一的导出口;module对象就表明模块自己。浏览器
AMD 与 RequireJS
AMD
Asynchronous Module Definition,就是 异步模块定义,全部的模块将被异步加载,模块加载不影响后面语句运行。全部依赖某些模块的语句均放置在回调函数中。
AMD规范定义了一个自由变量或者说是全局变量 define 的函数。
define( id?, dependencies?, factory ); 服务器
第一个参数 id 为字符串类型,表示了模块标识,为可选参数。若不存在则模块标识应该默认定义为在加载器中被请求脚本的标识。若是存在,那么模块标识必须为顶层的或者一个绝对的标识。
第二个参数,dependencies ,是一个当前模块依赖的,已被模块定义的模块标识的数组字面量。
第三个参数,factory,是一个须要进行实例化的函数或者一个对象。
建立模块标识为 alpha 的模块,依赖于 require, export,和标识为 beta 的模块
define("alpha", [ "require", "exports", "beta" ], function( require, exports, beta ){
export.verb = function(){
return beta.verb();
// or:
return require("beta").verb();
}
});
RequireJS
RequireJS 是一个前端的模块化管理的工具库,遵循AMD规范,它的做者就是AMD规范的创始人 James Burke。因此说RequireJS是对AMD规范的阐述一点也不为过。
RequireJS 的基本思想为:经过一个函数来将全部所须要的或者说所依赖的模块实现装载进来,而后返回一个新的函数(模块),咱们全部的关于新模块的业务代码都在这个函数内部操做,其内部也可无限制的使用已经加载进来的以来的模块。
CMD 与 seaJS
CMD
在CMD中,一个模块就是一个文件,格式为:
define( factory );
全局函数define,用来定义模块。
参数 factory 能够是一个函数,也能够为对象或者字符串。
当 factory 为对象、字符串时,表示模块的接口就是该对象、字符串。
seaJS
sea.js 核心特征:
1. 遵循CMD规范,与NodeJS般的书写模块代码。
2. 依赖自动加载,配置清晰简洁。
AMD 与 CMD 的区别?
下面是玉伯对于 AMD 与 CMD 区别的解释:
AMD 是 RequireJS 在推广过程当中对模块定义的规范化产出。
CMD 是 SeaJS 在推广过程当中对模块定义的规范化产出。
相似的还有 CommonJS Modules/2.0 规范,是 BravoJS 在推广过程当中对模块定义的规范化产出还有很多??
这些规范的目的都是为了 JavaScript 的模块化开发,特别是在浏览器端的。
目前这些规范的实现都能达成浏览器端模块化开发的目的。
区别:
1. 对于依赖的模块,AMD 是提早执行,CMD 是延迟执行。不过 RequireJS 从 2.0 开始,也改为能够延迟执行(根据写法不一样,处理方式不一样)。CMD 推崇 as lazy as possible.
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()
// ...
})