Node.js:模块

概要:本篇博客主要介绍node.js的模块

1.创建模块

  在node.js中创建一个模块非常简单,因为一个文件就是一个模块。我们只需要明白如何从其他文件中获取这个模块。Node.js提供了 exports 和 require 两个对象,其中exports是模块的公开接口,require用于从外部获取一个模块的接口,即所获取模块的exports对象。看下面的例子。

创建一个module.js的文件,内容是:

var name;

exports.setName = function(thyName){
name = thyName;
}; exports.sayHello = function(){
console.log('hello'+name);
}

在同一级目录下创建getmodule.js,内容是:

var myModule = require('./module');

myModule.setName('BYVoid');
myModule.sayHello();

运行getmodule.js,得到的结果是:hello BYVoid。

  你也许已经能理解exports和require对象的区别了吧。module.js通过exports对象把setName和sayHello作为模块的访问接口,在getmodule.js中通过require('./module')加载这个模块,然后就可以直接访问module.js中的exports对象的成员了。

2.单次加载

  require不会重复加载模块,并且最终输出的结果是由后者决定的,就像同样的定义CSS属性,后者会覆盖前者一样。

  例如,我们在getmodule.js的基础上稍作修改:

var hello1 = require('./module');
hello1.setName('BYVoid 1'); var hello2 = require('./module');
hello2.setName('BYVoid 2'); hello1.sayHello();

运行的结果是: hello BYVoid 2。这是因为变量hello1和hello2指向的是同一个实例,因此hello1.setName的结果被hello2.setName覆盖。

3.覆盖exports

  有时候我们只是把一个对象封装到模块中,例如:

function Hello(){
var name;
this.setName = function (thyName) {
name = thyName;
};
this.sayHello = function () {
console.log('Hello' + name);
};
}; exports.Hello = Hello;

  此时我们在其他文件中需要通过require('./singleobject').Hello来获取Hello对象,这略显冗余,因此可以用下面的方法稍微简化:

function Hello() {
var name;
this.setName = function(thyName) {
name = thyName;
};
this.sayHello = function() {
console.log('Hello ' + name);
};
};
module.exports = Hello;

这样就可以直接获得这个对象了:

var Hello = require('./hello');

hello = new Hello();
hello.setName('BYVoid');
hello.sayHello();

  注意:模块接口的唯一变化就是使用module.exports = Hello代替了exports.Hello = Hello。在外部引用该模块时,其接口对象就是要输出的Hello对象本身,而不是原先的exports。

  警告:不可以通过对 exports 直接赋值代替对 module.exports 赋值。exports 实际上只是一个和 module.exports 指向同一个对象的变量,它本身会在模块执行结束后释放,但 module 不会,因此只能通过指定module.exports 来改变访问接口。

上一篇:Node.js DNS 模块


下一篇:express再学习