Node.js 的module 系统

  相较于原生的JavaScript,不同的JavaScript文件之间很难共享变量。有鉴于此,Node.js在JavaScript的基础上进行了扩充,引入了require,exports,module三个global object。

一、absolute module 和 relative module

  Smashing Node.js 的作者将node.js 中的modules 分成了两类,一类是absolute modules,一类是 relative modules。

  <1> absolute modules,指的是是node core自带的重要modules,如http,fs等,我们使用这些modules时,只需要 require(‘module_name’)即可;还包括用npm安装的第三方module,这些module 默认安装的位置是./node_modules/ 路径下,使用这些modules时,同样只需要require(‘module_name’)即可。但是,在package.json文件中要添加这些module的name,以便使用npm安装。

  <2> relative modules,指的是我们自己写的modules,这些modules一般存在于工程文件夹内部,引用时我们需要以require(‘相对路径/module_name’)的方式引用。相对路径,指的是这些modules相对工程文件夹的存放的位置。

  通过这些modules,我们可以将复杂的node.js javascript代码分割在不同的文件中,简化我们的工程的管理与维护。

 

二、什么是require?

  在最开始的时候,我们可以简单的把require理解为加载,包含。对于普通的js文件来说,我们在一个a.js文件,require另外一个b.js文件,b.js文件会自动的插入到a.js文件的地方。

1 name_a = ‘a‘;
2 console.log(name_a);
3 //console.log(name_b);//会出错,name_b未定义
1 name_b =‘b‘
2 console.log(name_b);
1 require(‘./module_a‘); //relative module,需要给出module的路径
2 require(‘./module_b‘);
3 
4 console.log(name_a);
5 console.log(name_b);

技术分享

三、module和exports

  <1> 通过exports 返回对象的实例:

  默认,每个module通过exports返回一个空的对象实例,我们可以通过给该module的exports增加属性来改变该module返回的对象实例。

1 module_a.js
2 
3 exports.name = ‘john’;  
4 exports.data = ‘this is some data’;
5 var privateVariable = 5;
6 exports.getPrivate = function () {
7 return privateVariable;
8 };
1 index.js
2 
3 var a = require(‘./module_a’);  //注意,exports默认返回的是一个已经创建好的对象实例,所以可以直接调用属性,而不需要new。
4 console.log(a.name);
5 console.log(a.data);
6 console.log(a.getPrivate());

技术分享

<2> 通过module.exports 返回constructor 函数:

  虽然通过module.exports可以传递创建好的对象实例,但有时候我们希望在传递时能控制这个对象的创建过程,此时我们需要传递constructor函数:

1 module.exports = Person;
2 
3 function Person(name){
4     this.name = name; 
5 }
6 
7 Person.prototype.talk = function() {
8     console.log(‘my name is ‘, this.name);
9 }
1 var Person = require(‘./person’);
2 var john = new Person(‘john’); //Person 为constructor函数,必须new之后才能使用
3 john.talk();

技术分享

  至于 module.exports 和 exports的使用还是有一些区别的,module.exports 用于导出类型(只能用module.exports),exports用于导出对象的实例(虽然module.exports 也可以),可以参考以下博文。

http://www.cnblogs.com/pigtail/archive/2013/01/14/2859555.html

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。