Node.js的模块机制应用
模块前言
模块(Module)和包(Package)是Node.js 最重要的支柱。
在我们做Web开发的时候,常常使用script标签来加载其它JavaScript文件。
而在Nodejs中,并没有提供script标签,那么怎么样加载其它JavaScript文件呢,
不可能我们把所有的功能都写在一个js文件中对吧?
答案是使用require函数来调用其他模块
[注意:Node.js 的模块和包机制的实现参照了CommonJS规范,但并未完全遵循。]
什么是模块?
模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个
Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。
[在我上一篇博客中提到了var fs = require(“fs”); 意思就是加载fs这个模块。]
创建第二个模块
为什么是创建第二个呢?因为在我们写第一个hello程序时候,我们已经创建了模块。也就是说在Node.js中一个js文件就是一个模块。
// mymodule.js
//创建一用用户模块
//声明一个姓名变量
var name;
exports.setName = function(e_name){
this.name = e_name;
}
exports.getName = function(){
return this.name;
}
[注意:Node.js 提供了exports 和 require 两个对象,其中 exports 是模块公开的接口,
require 用于从外部获取一个模块的接口]
创建一个js文件来加载mymodule模块并调用模块中的函数。
//test.js
//加载同文件夹里的mymodule.js模块
var my = require("./mymodule");
//调用设置姓名函数
my.setName("ylblog");
//打印数据
console.log("hello %s",my.getName());
执行后打印出: hello ylblog
[注意:无论调用多少次 require(“./mymodule”);获得都是同一个对象 –单例模式]
来我们测试看看:
// test2.js
//加载同文件夹里的mymodule.js模块
var my = require("./mymodule");
//调用设置姓名函数
my.setName("ylblog");
//打印数据
console.log("hello %s",my.getName());
//第二次加载mymodule模块
var my2 = require('./mymodule');
//打印数据
console.log("hi %s",my.getName());
打印结果:
hello ylblog
hi ylblog
设计一个多实例模式,通过new来创建对象。
// user.js
exports.User = function(){
var name;
this.setName = function(ename) {
name = ename;
};
this.getName = function(){
return name;
};
}
// test.js
//现在我们要创建user对象
var User = require("./user").User;
var user = new User();
user.setName("heihei");
console.log("hi %s",user.getName());
var user = new User();
console.log("you name is %s",user.getName());
[有没有更简介的方式实现多实例,答案是有的。]
采用:【覆盖 exports】
// 修改user.js
module.exports = function(){
var name;
this.setName = function(ename) {
name = ename;
};
this.getName = function(){
return name;
};
}
// 修改test.js
// 现在我们要创建user对象
var User = require("./user");
var user = new User();
user.setName("heihei");
console.log("hi %s",user.getName());
var user = new User();
console.log("you name is %s",user.getName());
打印结果:
hi heihei
you name is undefined
注意问题
[在外部引用该模块时,其接口对象就是要输出的 User 对象本身,而不是原先的 exports]
[exports 本身仅仅是一个普通的空对象,即{}]
[不可以通过对 exports 直接赋值代替对 module.exports 赋值]