CommonJS的模块规范,是一种定位于服务器端的模块规范。
CommonJS对模块的定义十分简单,主要分为模块引用、模块定义和模块标识。
模块引用
示例如下:
var math = require('math');
存在require()
方法,这个方法接受模块标识,以此引入一个模块的API。
require()
是Node
中少数几个同步I/O
操作之一。在程序中I/O
密集的地方尽量少用require()
,所以通常都只在程序最初加载时才使用require()
和其他同步操作。
在引入的时候,.js
扩展可以忽略。
模块定义
上下文提供exports
对象来提供用于导出当前模块的方法或者变量。
//math.js
exports.add = function(){
var sum = 0;
i = 0;
args = arguments;
l = args.length;
while (i <l){
sum += args[i++];
}
return sum;
};
在模块中,还存在一个
moudle
对象,它代表模块自身,而exports
是module
属性。在Node中,一个文件就是一个模块。
另一个文件中,我们通过require()
方法引入模块后,就能调用定义的属性或方法了。
//program.js
var math = require('math');
exports.increment = function(val) {
return math.add(val,1);
};
模块标识
模块标识就是传递给require()
方法的参数,它必须是符合小驼峰命名的字符串,或者以.
/ ..
开头的相对路径,或者是绝对路径。它可以没有后缀.js
。
module.exports
要创建只返回一个变量或函数的模块,被exports
直接赋值给函数或变量是不行的。因为Node
不能用任何其他对象、函数和变量给exports
赋值。这个时候,需要用到module.exports
。如:
var Currency = function (canadianDollar){
this.canadianDollar = canadianDollar;
}
Currency.prototype.roundTwoDecimals = function(amount){
return Math.round(amount * 100) / 100;
}
Currency.prototype.canadianToUS = function (canadian) {
return this.roundTwoDecimals (canadian * this.canadianDollar);
}
//error
exports = Currency;
//it should be
module.exports = Currency;
用module.exports
可以对外提供单个变量、函数或者对象。如果模块中既有exports
又有module.exports
的模块,那它只会返回module.exports
。
因为
exports
只是对module.exports
的全局引用。所以,exports.myFun()
只是module.exports.myFun()
的缩写。
可重用的模块
node_modules
目录中存放的就是我们所重用的模块。这个目录的模块引用不需要使用相对或绝对路径。比如我们引入require('math')
模块。这很好理解。
注意事项
- 如果模块是目录,在目录中定义模块的文件必须被命名为
index.js
,或者在package.json
文件中的main
键中指定入口文件。
意思就是说,模块不是简单的模块,而是一个目录?
Node
能把模块作为对象缓存起来。如果程序中的两个文件引入了相同的模块,第一个文件会把模块返回的数据存到程序的内存中,这样第二个文件就不用再去访问和计算模块的源文件了。
AMD 和 CMD
鉴于网络原因,CommonJS
为后端JavaScript
制定的规范并不完全适合前端的场景。
AMD规范
AMD(Asynchronous Module Definition),中文介绍在这里: https://github.com/amdjs/amdjs-api/wiki/AMD
模块的定义如下:
define(id?,dependencies?,factory);
CMD规范
关于CMD
的介绍,可以参考Sea.js
的介绍:https://github.com/seajs/seajs/issues/242。具体不推荐使用。
驼峰式命名法
规则如下:单字之间不以空格断开或连字符(-
)或下划线(_
)连接。有两种格式。
- 小驼峰命名法(lower camel case): 第一个单字以小写字母开始,第二个单字的首字母大写。
- 大驼峰命名法(upper camel case): 每一个单字的首字母都采用大写字母。