前言
熟悉JavaScript语言的开发者都知道,JavaScript语言是没有名字空间这个概念的,所有被加载到网页的JavaScript代码都属于同一个名字空间(这个名字空间可以理解为window对象)。这就导致脚本之间很容易引起命名冲突,以及因此引起的一些安全问题,同时也给跟踪调试代码带来了很大的麻烦。
CommonJS
鉴于JavaScript语言这个“天生 ”的缺陷,CommonJS应运而生。CommonJS制定了一个标准:每个模块都拥有一个独立的上下文,将该模块和其他模块隔离开来,从而达到模块之间不再相互干扰的目的。而Node.js就是实现了CommonJS规定的这些标准。
有关CommonJS的更多说明,请参考其官方网站:
http://www.commonjs.org/
编写模块
基于CommonJS规范编写代码,从某种意义上也可以理解为“面向模块编程”,每一个功能、每一个组件,都是一个模块。在Node中,文件和模块是一一对应的,每一个文件对应一个模块,且模块只对外暴露开发者指定的内容。来看下边这个例子:
function add(a, b) {
return a + b;
}
function sub(a, b) {
return a - b;
}
module.exports = {
add: add,
sub: sub
};
代码中的module是一个变量,表示模块自身。module.exports表示当前模块所导出的对象,它可以是任意类型的对象。
加载模块
在Node中既可以用文件路径也可以用文件名称来引用模块,如果不是核心模块,使用名称来引用的模块最终也会被映射为一个文件路径。核心模块是指Node自身提供的一些功能,这些模块会在Node进程启动时预先载入到内存。其它模块包括使用npm安装的第三方模块,也包括当前项目中的模块。在Node中是通过require函数引用模块的:
var module = require('./modules/filename.js');
上述代码中的require函数会返回一个对象,该对象就是通过module.exports暴露出来的那个对象。
模块缓存
Node中的模块在首次加载时会被缓存起来,所以当一个项目中多次引用同一个模块的时候,始终拿到的都是第一次加载的模块内容,那么模块内的代码也就只被执行一次。
作者:朱会震