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): 每一个单字的首字母都采用大写字母。