Node.js学习笔记之模块与包

在 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,内容是:

//getmodule.js  
var myModule = require('./module');  
myModule.setName('BYVoid'); 
myModule.sayHello(); 

运行node getmodule.js,结果是:
Hello BYVoid
module.js 通过 exports 对象把 setName 和 sayHello 作为模块的访 问接口,在 getmodule.js 中通过 require(‘./module’) 加载这个模块,然后就可以直接访 问 module.js 中 exports 对象的成员函数了。

单次加载

//loadmodule.js  
var hello1 = require('./module'); 
hello1.setName('BYVoid');  
var hello2 = require('./module'); 
hello2.setName('BYVoid 2');  
hello1.sayHello(); 

运行后发现输出结果是 Hello BYVoid 2,这是因为变量 hello1 和 hello2 指向的是 同一个实例,因此 hello1.setName 的结果被 hello2.setName 覆盖,终输出结果是 由后者决定的。

覆盖 exports
有时候只是想把一个对象封装到模块中,例如:

//singleobject.js  
function Hello() { 
  var name; 

  this.setName = function (thyName) { 
    name = thyName; 
  }; 
  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; 

这样就可以直接获得这个对象了:

//gethello.js  
var Hello = require('./hello');  
hello = new Hello(); 
hello.setName('BYVoid'); 
hello.sayHello(); 

注意,模块接口的唯一变化是使用 module.exports = Hello 代替了 exports.Hello= Hello。在外部引用该模块时,其接口对象就是要输出的 Hello 对象本身,而不是原先的 exports。
事实上,exports 本身仅仅是一个普通的空对象,即 {},它专门用来声明接口,本 质上是通过它为模块闭包的内部建立了一个有限的访问接口。因为它没有任何特殊的地方, 所以可以用其他东西来代替,譬如我们上面例子中的 Hello 对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值