JS中的模块规范(CommonJS,AMD,CMD)

141 阅读2分钟

CommonJS

  • 服务器端JavaScript应用程序
  • 命令行工具
  • 图形界面应用程序
  • 混合应用程序(如,Titanium或Adobe AIR)
var module = {
  exports: {}
};

(function(module, exports) {
  exports.multiply = function (n) { return n * 1000 };
}(module, module.exports))

var f = module.exports.multiply;
f(5) // 5000

主要就是用来做js模块化编程的,CommonJS主要实现在服务器端模块化编程,让js支持module、exports、require、global 这四个变量。

主要实现:nodejs

AMD

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

主要实现:require.js

index.html
<script src="js/require.js" defer async="true" data-main="js/main"></script>

// math.js
define(function (){
    var add = function (x,y){
        return x+y;
    };
    return {
        add: add
    };
});

// main.js
require(['math'], function (math){
    alert(math.add(1,1));
});

CMD

CMD 即Common Module Definition通用模块定义,CMD规范是国内发展出来的,就像AMD有个requireJS,CMD有个浏览器的实现SeaJS,SeaJS要解决的问题和requireJS一样,只不过在模块定义方式和模块加载(可以说运行、解析)时机上有所不同。

AMD是依赖关系前置,在定义模块的时候就要声明其依赖的模块;

CMD是按需加载依赖就近,只有在用到某个模块的时候再去require:

主要实现 sea.js

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

总结

  • 前端模块规范有三种:CommonJs,AMD和CMD。
  • CommonJs用在服务器端,AMD和CMD用在浏览器环境
  • AMD 是 RequireJS 在推广过程中对模块定义的规范化产出。
  • CMD 是 SeaJS 在推广过程中对模块定义的规范化产出。
  • AMD:提前执行(异步加载:依赖先执行)+延迟执行
  • CMD:延迟执行(运行到需加载,根据顺序执行)

学习资料