[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
给调用者,而不是exports
。exports
所做的事情是收集属性,如果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
})
网友评论