你的浏览器不支持canvas

Love You Ten Thousand Years

CommonJS模块规范

Date: Author: M/J

本文章采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。转载请注明来自小可嗒嗒的博客

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对象,它代表模块自身,而exportsmodule属性。在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')模块。这很好理解。


注意事项

  1. 如果模块是目录,在目录中定义模块的文件必须被命名为index.js,或者在package.json文件中的main键中指定入口文件。

意思就是说,模块不是简单的模块,而是一个目录?

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

对于本文内容有问题或建议的小伙伴,欢迎在文章底部留言交流讨论。