概要:本篇博客主要介绍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 来改变访问接口。