1.创建模块
Node.js提供了 exports 和 require 两个对象(接口),其中 exports 是模块公开的接口,用于创建外部模块;
require 用于从外部获取一个模块的接口,即所获取模块的 exports 的对象。
创建模块module.js:
var name;
exports.setName = function(theName){
name = theName;
}
exports.sayHello = function(){
console.log('Hello ' + name);
}
创建文件引入模块并执行getmodule.js:
var myModule = require('./module');
myModule.setName('Ming');
myModule.sayHello();
运行和输出:
PS D:\phpStudy\WWW\node> node .\getmodule.js
Hello Ming
module.js 通过 exports 对象把 setName 和 sayHello 作为模块的访问接口,在 getmodule.js 中通过 require('./module') 加载这个模块,然后就可以直接访问 module.js 中 exports 对象的成员函数。
2.单次加载
与对象不同的是,require并不会重复加载模块,也就是说无论调用多少次require,获得的模块有事同一个
loadmodule.js:
var hello1 = require('./module');
hello1.setName('Ming');
var hello2 = require('./module');
hello2.setName('Ming2');
hello1.sayHello();
运行和输出
PS D:\phpStudy\WWW\node> node .\loadmodule.js
Hello Ming2
为变量 hello1 和 hello2 指向的是同一个实例,因此 hello1.setName 的结果被 hello2.setName 覆盖,最终输出结果是由后者决定的。
3.模块封装(exports与module.exports)
singleobject.js:
function Hello(){
var name;
this.setName = function(theName){
name = theName;
};
this.sayHello = function(){
console.log('Hello ' + name);
}
}
exports.Hello = Hello;
以上模块通过 require('./singleobject').Hello 来获取Hello 对象,这略显冗余,可以用下面方法稍微简化:hello.js:
function Hello() {
var name;
this.setName = function(thyName) {
name = thyName;
};
this.sayHello = function() {
console.log('Hello ' + name);
};
};
module.exports = Hello;
这样通过require('./hello')能直接获取到该模块:
var Hello = require('./Hello');
hello = new Hello();
hello.setName('Ming');
hello.sayHello();
注意,模块接口的唯一变化是使用 module.exports = Hello 代替了 exports.Hello=Hello。在外部引用该模块时,其接口对象就是要输出的 Hello 对象本身,而不是原先的exports。
不可以通过对 exports 直接赋值代替对 module.exports 赋值。exports 实际上只是一个和 module.exports 指向同一个对象的变量,它本身会在模块执行结束后释放,但 module 不会,因此只能通过指定module.exports 来改变访问接口。