Nodejs极简入门教程(一):模块机制
JavaScript规范(ECMAScript)没有定义一套完善的能适用于大多数程序的标准库。CommonJS提供了一套JavaScript标准库规范。Node实现了CommonJS规范。
模块基础
在Node中,模块和文件是一一对应的。我们定义一个模块:
//circle.js varPI=Math.PI; //导出函数area exports.area=function(r){ returnPI*r*r; } //导出函数circumference exports.circumference=function(r){ return2*PI*r; };
这里将需要导出的函数加入到exports对象。模块的局部变量外部无法访问(例如,上例中的PI变量)。调用require载入模块circle.js:
varcircle=require('./circle.js'); console.log('Theareaofacircleofradius4is' +circle.area(4));
附带提及一下的是,模块中,存在一个module对象,表示模块本身,exports则为module的属性。
模块的加载
Node会对加载过的模块进行缓冲,避免再次加载的开销:
//test.js console.log("I'mhere");
多次加载模块test.js
//仅仅输出一次"I'mhere" require('./test'); require('./test');
当加载文件没有后缀时,Node会尝试添加后缀并加载:
1..js(JavaScript源文件)
2..node(C/C++扩展模块)
3..json(JSON文件)
模块主要有几类:
1.核心模块。核心模块已经被编译到了Node中,我们在其源码中的lib目录可以找到这些核心模块。常见的核心模块:net、http、fs模块等
2.文件模块。文件模块通过一个相对或者绝对路径加载,例如我们上面看到的circle.js
3.自定义模块。自定义模块位于node_modules目录中,我们通过npm安装的各种模块就放置在node_modules目录中
核心模块总是优先被加载,假如有一个自定义模块http,那么加载时仍然会加载核心模块http而非自定义模块http。在加载自定义模块时,首先查找当前目录下的node_modules目录,而后查找父目录下的node_modules目录,以此类推,直到根目录。
require加载的模块不是一个文件,而是一个目录时,这样的目录被叫做包(package)。包中存在一个名为package.json的文件(包描述文件),例如:
{"name":"some-library", "main":"./lib/some-library.js"}
其中main指出需要被加载的模块。如果包中不存在package.json或者package.json中未指定main模块,那么Node将会尝试加载index.js、index.node、index.json。
在加载JavaScript模块时,被加载的模块被包裹在一个函数中:
function(module,exports,__filename,__dirname,...){ JavaScriptmodule }
每个JavaScript模块访问到的module、exports、__filename、__dirname等实际上是通过函数参数传递进来的。由于这种包裹,才使得模块的局部变量外部无法访问。但有时候也会出现让人难以理解的问题,例如:
test1.js
exports={ name:'Name5566', }
test2.js
module.exports={ name:'Name5566', }
加载这两个模块:
vartest1=require('./test1.js'); console.log(test1.name);//undefined vartest2=require('./test2.js'); console.log(test2.name);//Name5566
exports作为参数传递给模块,我们通过exports.x自然可以给exports对象添加属性(或方法),但直接给exports赋值(例如,exports=x)仅仅是改变了形参而非实参的值,因此:
1.为exports添加属性时,使用exports
2.为exports赋值时,使用module.exports
包
按CommonJS的规范,一个完整的包应该包含有:
1.package.json包描述文件
2.bin二进制文件目录
3.libJavaScript代码目录
4.doc文档目录
5.test测试代码目录
NPM是一个Node的一个包管理工具。常见用法:
查看命令的文档:
npmhelpinstall
查看命令install的文档。
安装一个包:
npminstallredis
安装redis这个包。install命令会将包安装在当前目录下的node_modules目录中。
移除一个包:
npmremoveredis
移除redis这个包。remove命令会将当前目录下的包移除掉。