CommonJS,AMD,RequireJS的差异


RequireJS实现了AMD的API.node

CommonJS是使用exports对象来定义模块的一种方法,它定义了模块的内容。简单地实现一个CommonJS的定义就像如下这样:浏览器

// someModule.js异步

exports.doSomething = function() { return "foo"; };函数

//otherModule.jspost

var someModule = require('someModule'); // in the vein of node    ui

exports.doSomethingElse = function() { return someModule.doSomething() + "bar"; };spa

基本上CommonJS明白了你需要有一个require函数来获取依赖,exports变量来输出模块的内容和一些用来获取依赖的模块标识符。设计

CommonJS有多种实现。比方Node.js.对象

因为CommonJS设计的时候没有考虑浏览器,因此它不适合浏览器环境(我事实上对这个不明白,但是这样的说法处处都有,比方RequireJS官网)。因此咱们得作一些工做来实现异步载入。ip

相反,RequireJS实现了AMD。它被设计用来适应浏览器环境。表面上看来,AMD開始是CommonJS输出格式的副产品,而且终于进化出了本身的API。

在AMD中出现的新东西是define函数。它赞成模块在载入依赖以前声明它的依赖。好比定义可能就像如下这样:

define('module/id/string', ['module', 'dependency', 'array'], 

function(module, factory function) {

return ModuleContents;  

});

所以CommonJS和AMD是Javascript模块定义API的不一样的实现。但是他们有一样的根源。AMD更适合浏览器,因为它支持异步载入模块依赖。RequireJS是AMD的一个实现,而且尽可能保留了CommonJS的精神(主要是模块标识符上)。

更让人混乱的是,RequireJS在实现AMD的同一时候,还提供了一个CommonJS包裹,这样CommonJS模块可以差点儿直接被RequireJS引入。

define(function(require, exports, module) {

    var someModule = require('someModule'); // in the vein of node    

    exports.doSomethingElse = function() { return       someModule.doSomething() + "bar"; };

});

相关文章
相关标签/搜索