模块是nodejs中重要的概念
新建一个文件,取名为testerhome.js
,内容如下:
//testerhome.js
var name
exports.setName = function(theName){ name = theName; };
exports.sayName = function(){ console.log('Hello ' + name); };
在同级目录下新建一个test.js
文件
//test.js
var testerHome = require('./testerhome');
testerHome.setName('TesterHome');
testerHome.sayName();
上面的文件引用了我们定义的testerhome模块,然后设置其中属性name的值,然后打印属性name的值
执行上面的程序:
D:\node.js\0211>node test.js
Hello TesterHome
D:\node.js\0211>
第一个文件testerhome.js中我们用到exports这个关键字,这个关键字定义的就是接口,可以供外部调用的。
在test.js中我们使用require来加载一个模块,那如果多次加载的话会出现什么状况,现在修改下test.js中代码:
//test.js
var testerHome = require('./testerhome');
testerHome.setName('TesterHome');
var testerHome1 = require('./testerhome');
testerHome1.setName('Tester Home2');
testerHome.sayName();
上面的程序我们重新加载了一次模块并将其赋予了testerHome1变量。然后运行程序
D:\node.js\0211>node test.js
Hello Tester Home2
你会惊奇的发现打印了第二个对象设置的名称,为什么?因为模块不会重复加载,只会覆盖。所以整个程序只会有一个模块对象,所以上面的testerHome和testerHome1指向的都是同一个对象。
如果我们想给刚才的testerhome模块添加一个对象,如何添加呢?
请看下面的代码:
//testerhome.js
var name
exports.setName = function(theName){
name = theName;
};
exports.sayName = function(){
console.log('Hello ' + name);
};
function World(){
var name
this.setName = function(theName){
name = theName;
};
this.sayName = function(){
console.log('Hello ' + name);
};
};
exports.World = World;
如何引用这个对象,其实我们事件那一篇文章用过,当时用的是events模块中的EventEmitter对象。
我们在test.js使用该World对象:
//test.js
var testerHome = require('./testerhome');
testerHome.setName('TesterHome');
testerHome.sayName();
var World = require('./testerhome').World;
var world = new World;
world.setName('World');
world.sayName();
运行该程序:
D:\node.js\0211>node test.js
Hello TesterHome
Hello World
D:\node.js\0211>
还有一种方式,导入的时候不用写.World。直接new对象的。修改testerhome.js文件:
//testerhome.js
var name
exports.setName = function(theName){
name = theName;
};
exports.sayName = function(){
console.log('Hello ' + name);
};
function World(){
var name
this.setName = function(theName){
name = theName;
};
this.sayName = function(){
console.log('Hello ' + name);
};
};
module.exports = World;
变化的地方在于最后一句话把exports.World变成了module.exports。这样我们在外部调用的时候就不需要再加入.World。test.js程序修改如下:
//test.js
var World = require('./testerhome');
var world = new World;
world.setName('World');
world.sayName();
运行该程序
D:\node.js\0211>node test.js
Hello World