模块是 Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个Node.js 文件就是一个模块,这个文件可能是 JavaScript 代码、JSON 或者编译过的 C/C++ 扩展。 var http = require('http'),其中 http是 Node.js 的一个核心模块,其内部是用 C++ 实现的,外部用 JavaScript 封装。我们通过require 函数获取了这个模块,然后才能使用其中的对象。
1、创建模块
创建模块很简单,就像写一个单独的函数一样,不过模块创建完成后,需要在其它地方去调用它,才能发挥它的效果,一样的像函数一样。首先创建一个module.js用来创建模块:
[javascript]
var x,y;
exports.setArgs=function(a,b){
x=a;
y=b;
}
exports.mult=function(){
console.log(x+"和"+y+"的乘积是:"+x*y);
}
var x,y;
exports.setArgs=function(a,b){
x=a;
y=b;
}
exports.mult=function(){
console.log(x+"和"+y+"的乘积是:"+x*y);
}然后写一个getModule.js来调用这个模块的内容:
[javascript]
var module=require("./module");
module.setArgs(5,4);
module.mult();
var module=require("./module");
module.setArgs(5,4);
module.mult();在websotrm中,右键运行getModule.js,控制台输出结果如图:
当然,这只是最简单的一个例子,纯粹是学习如何创建和调用模块。
2、覆盖exports
上面的代码演示了直接把函数封装到模块当作,接下来演示如何把一个对象封装到模块当中。修改module.js如下:
[html]
function calc(){
var x,y;
this.setArgs=function(a,b){
x=a;
y=b;
console.log("设置参数成功。");
};
this.mult=function(){
console.log(x+"和"+y+"的乘积是:"+x*y);
};
this.add=function(){
console.log(x+"和"+y+"的和是:"+(x+y));
};
}
exports.calculator=calc;
function calc(){
var x,y;
this.setArgs=function(a,b){
x=a;
y=b;
console.log("设置参数成功。");
};
this.mult=function(){
console.log(x+"和"+y+"的乘积是:"+x*y);
};
this.add=function(){
console.log(x+"和"+y+"的和是:"+(x+y));
};
}
exports.calculator=calc;上面的代码把一个calc函数封装到模块里面,然后导出为calculator对象,可以通过实例化这个calculator对象来调用相关算法函数。修改getModule.js如下:
[javascript]
/获得calculator对象
var module=require("./module").calculator;
console.log(module); //看看是什么东西
//实例化,如果不做这一步,想直接通过module.Func会出错
var moduleEntity=new module();
//验证moduleEntity是否可以正常调用函数
console.log(moduleEntity.setArgs);
//验证通过,此方法可以使用
moduleEntity.setArgs(4,2);
moduleEntity.add();
moduleEntity.mult();
//获得calculator对象
var module=require("./module").calculator;
console.log(module); //看看是什么东西
//实例化,如果不做这一步,想直接通过module.Func会出错
var moduleEntity=new module();
//验证moduleEntity是否可以正常调用函数
console.log(moduleEntity.setArgs);
//验证通过,此方法可以使用
moduleEntity.setArgs(4,2);
moduleEntity.add();
moduleEntity.mult();
不过,这个写法也可以稍加改动,导出时代码改为:
[javascript]
module.exports = calc;//直接把calc导出到module
module.exports = calc;//直接把calc导出到module调用方法修改成如下:
[javascript]
var Calculator=require("./module");
calculator=new Calculator();
calculator.setArgs(7,3);
calculator.add();
var Calculator=require("./module");
calculator=new Calculator();
calculator.setArgs(7,3);
calculator.add();个人感觉二者都一样,就是稍微少了那么一点代码。
模块接口的唯一变化是使用 module.exports = calc代替了 exports.calculator=calc。在外部引用该模块时,其接口对象就是要输出的 calc对象本身,而不是原先的exports。事实上,exports 本身仅仅是一个普通的空对象,即 {},它专门用来声明接口,本质上是通过它为模块闭包的内部建立了一个有限的访问接口。因为它没有任何特殊的地方,所以可以用其他东西来代替,譬如我们上面例子中的calculator 对象。
注意:不可以通过对 exports 直接赋值代替对 module.exports 赋值。exports 实际上只是一个和 module.exports 指向同一个对象的变量,它本身会在模块执行结束后释放,但 module 不会,因此只能通过指定module.exports 来改变访问接口。
/*以上内容参考Node.js开发指南一书*/
/*以上所有代码都是通过webstorm来开发的*/