Node.js 中require module的几种模式(Module Patterns)

在node.js中require module常见的有以下几种模式

  1. 将exports设置为函数

foo.js

module.exports = function() {}
app.js

var foo = require('./foo');
foo();

  1. 给exports添加函数

foo.js

module.exports.foo = function() {}
app.js

var foo = require('./foo').foo;
foo();

  1. 利用构造函数将exports设置为新的对象

foo.js

function Foo() {
this.prop = 'hello world';
this.bar = function() {
console.log(this.prop);
}
}
module.exports = new Foo();
app.js

var foo = require('./foo');
foo.bar(); // hello world
利用这种方式引入module的时候会通过Foo这个构造函数生产一个新的对象并返回,我们知道new关键字会生成一个新的object,那么如果连续再调用一次就应该得到一个新的对象。答案真的是这样的么?看下面的例子:
foo.js

var foo = require('./foo');
foo.bar(); // hello world
foo.prop = 'hello world again';
app.js

var foo2 = require('./foo');
foo2.bar(); // hello world again
通过上面的例子我们可以看到,连续require两次竟然没有生成新对象,难道new关键字失效了? js语法科不是这样说的啊。其实new没有出问题,只是node.js的require函数引入module的时候会cache。也就是说第一次require的时候会读取文件中的js并执行引入文件中的js。执行完成后会把生成的对象缓存起来。这样第二次调用的时候就直接返回前面生成的对象。如果你在require这一行代码前面打一个断点,debug运行的时候点”step into”, 进入到require函数内部, 一步步调试下去,你会看到如下代码:
(如果要调试的话推荐使用webstorm或者VS,具体使用方法比较简单,不会的话google一下就明白了)

var cachedModule = Module._cache[filename];
if (cachedModule) {
return cachedModule.exports;
}
可以看到,node.js在require的时候会先从_cache取缓存对象,_cache的key就是文件名,以前引入过该文件,那么缓存中就已经存在对象,这样就直接返回缓存的对象。继续往下调试,你会看到下面两行代码:

var module = new Module(filename, parent);
Module._cache[filename] = module;
也就是说第一次引入module文件的时候会new一个Module对象并缓存起来。

  1. 返回构造函数

foo.js

function Foo() {
this.prop = 'hello world';
this.bar = function() {
console.log(this.prop);
}
}
module.exports = Foo;
app.js

var Foo = require('./foo');
var foo = new Foo();
foo.bar(); // hello world

  1. revealing module 模式

foo.js

var prop = 'hello world';
function foo() {
console.log(prop);
}
module.exports = {
foo: foo
}
app.js

var foo = require('./foo').foo;
foo(); // hello world
这种方式最吸引人的地方就在于只向外部暴露部分方法,并隐藏希望受保护的属性、方法。这有点像面向对象语言中的、protected/private。

如需转载请保留原文链接: http://www.qinyejun.com/node-js/node-js-require-module-patterns/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Node.js是目前非常火热的技术,但是它的诞生经历却很奇特。 众所周知,在Netscape设计出JavaScri...
    w_zhuan阅读 3,639评论 2 41
  • 个人入门学习用笔记、不过多作为参考依据。如有错误欢迎斧正 目录 简书好像不支持锚点、复制搜索(反正也是写给我自己看...
    kirito_song阅读 2,500评论 1 37
  • Node.js Stream(流) Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对h...
    FTOLsXD阅读 618评论 0 2
  • topics: 1.The Node.js philosophy 2.The reactor pattern 3....
    宫若石阅读 1,126评论 0 1
  • 模块 Node 有简单的模块加载系统。在 Node 里,文件和模块是一一对应的。下面例子里,foo.js加载同一个...
    保川阅读 610评论 0 0