彻底搞清CommonJS、AMD、CMD...

发展过程

CommonJS、AMD、CMD、requeir, moudle.exports, exports,import,export...原地爆炸...

先从时间线上大概对这几种规范有个大致了解

  • 2009 -> CommonJS
  • 2010 -> AMD规范
  • 2011 -> CMD规范
  • 2015 -> ES6 Module

CommonJS

CommonJS规范诞生比较早,Mozilla工程师Kevin Dangoo在2009年发起,它出现的目的是希望JS可以运行到更多地方,主要是服务端,前期的nodejs采用了这种规范。

用法示例

module.exports或exports负责对外暴漏数据,require来引入


module.exports = {
    name: '四大名将'
}




const res = require('./a.js')
console.log(res.name) // 四大名将
module.exports 和 exports的区别

乍一看,还以为CommonJS提供了两种方法来导出数据,其实不然,require并不认识exports,之所以它也好使,那是因为模块内部这些代码的作用。

var module = {
    exports: {
        
    }
}

var exports = module.exports
return module.exports

require方能看到的只有module.exports这个对象,它是看不到exports这个对象的,而我们在编写模块时用到的exports实际上是对module.exports的引用。

举个例子

exports = {
    name: '四大名将'
}
如果这样导出,exports被重新赋值,指向的地址便不再是module.exports,所以此时的exports失去了它的导出功能,只会导出一个默认空对象

AMD (Asynchronous Module Definition)

AMD规范在2010由requireJS提出,CommonJS规范主要是弥补服务端的模块化机制,不像服务器加载速度很快,客户端加载时需要等待,可能存在假死情况,鉴于浏览器的特殊情况,AMD规范出来了,它采用异步方式加载模块定义的所有依赖,在依赖加载完成后再执行回调函数。

define([module-name?], [dependencies?], [factory])

  • module-name:字符串,模块名称(可选)
  • dependencies:要载入的依赖模块(可选),数组格式,相对路径
  • factory: 工厂方法,返回一个模块函数


define('module', ['dep1', 'dep2'], function(dep1, dep2){
  function foo(){
      dep1.doSomething();
      dep2.doSomething();
  }
  return {
    foo : foo
  };
})



require(['module'], function(module){
    module.foo()
});

CMD (Common Module Definition)

CMD规范在2011年由seaJS提出,CMD规范和AMD规范类似,主要区别是CMD规范是就近加载依赖,延迟执行,只有到require时依赖才执行。


define(function(require, exports, module) {
  function foo(){
    
    var dep1 = require('dep1') 
    dep1.doSomething();
 }
 
 exports.foo = foo
 
 /** return或者exports都行
 return {
   foo : foo
 };
 **/
});

seajs.use("./a", function(a){
  a.foo()
});

ES6 Module

2015年es6横空出世,引入了新特性 ES Module,诸如export, import等命令。

es6的module比较常用,贴一个阮一峰的es6链接ES6 Module


最后,圣诞快乐~

你可能感兴趣的:(彻底搞清CommonJS、AMD、CMD...)