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 赋值]

来源: 雨林博客(www.yl-blog.com)