Javascript模块规范

[Toc]

1. CommonJS模块规范

  • 模块引用
var math=require('math')
  • 模块定义
//math.js
exports.add=function(){
    //...
}
//program.js
var math=require('math')
exports.increment=function(val){
    return math.add(val,1)
}

exports是module.exports的引用,真正导出的是module.exports

//foo.js
exports.a = function(){
  console.log('a')
 }

 module.exports = {a: 2}
 exports.a = 1 //由于有了module.exports,所以该属性无效了
 //test.js
 var x = require('./foo');
 console.log(x.a)//2

模块最终返回module.exports给调用者,而不是exportsexports所做的事情是收集属性,如果module.exports当前没有任何属性的话,exports会把这些属性赋予module.exports。如果module.exports已经存在一些属性的话,那么exports中所用的东西都会被忽略。

  • 模块标识 (传递给require()方法的参数)
    • 符合小驼峰命名的字符串
    • 1️以./、..开头的相对路径或绝对路径

2. AMD规范(Asynchronous Module Define异步模块定义)

define(id?,dependencies?,factory)

define(function(){
    var exports={}
    exports.sayHello=function(){
        alert('Hello')
    }
    return exports
})

3. CMD规范

//dep1和dep2为依赖部分
define(['dep1','dep2'],function(dep1,dep2){
    return function(){}
})
//依赖部分,CMD支持动态引入
define(function(require,exports,module)){
    //模块代码
}

4.兼容多种模块规范

(function(name,definition){
    //检测上下文环境是否微AMD或CMD
    var hasDefine=typeof define==='function',
    //检查上下文环境似的否为node
    hasExports=typeof module!=='undefined'&&module.exports
    if(hasDefine){
        //AMD环境或CMD环境
        define(definition)
    }else if(hasExports){
        //定义为普通node模块
        module.exports=definition()
    }else{
        //将模块执行结果挂在window变量中
        this[name]=definition
    }
})('hello',function(){
    var hello=function(){}
    return hello
})

你可能感兴趣的:(Javascript模块规范)