相较于原生的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