Node.js模块分为两类:原生模块和文件模块
1、原生模块:是指Node.js API提供的原生模块。原生模块在启动时就已经被加载;
2、文件模块:为动态加载模块,加载模块的工作主要是由原生模块module来实现和完成的。
原生模块在启动时已经被加载,而文件模块则需要通过调用Node.js的require方法来实现加载。
那node.js处理模块的机制是怎么样的呢 ?
node.js如何处理模块的?
上面说过了node.js模块分为原生模块和文件模块。而且它们加载和调用存在一定区别,所以 我们就分别来说说两者的调用。
1、原生模块的调用
通过使用Node.js API提供的require()直接加载相应的模块。require()加载成功后会返回一个Node.js模块对象,并且这个对象拥有该模块的所有的属性和方法。
var httpObject = require('http'); // 引入node.js原生的http模块
对于上面code, “http”是Node.js的原生模块,在这个模块里定义了createServer、request和get等多个方法和属性;而httpObject则是我们通过require方法加载原生HTTP模块后所返回的对象,通过这个对象我们就可以访问到HTTP模块所有的属性和方法。
例如:
// 通过httpObject对象调用Node.js原生HTTP模块的.createServer()方法和.listen()方法创建简单服务器
var server = httpObject.createServer(function(req, res) {
// here are code......
}).listen( 8088 );
Node.js官方API文档:http://node.js.org/api/
2、文件模块的调用
文件模块调用与原生模块调用方式稍微有点区别,这里的区别是传入require()方法里的参数形式(加载方式)不同。调用文件模块传入的是模块路径,而原生模块不需要指定模块路径。
在调用文件模块时如果没有指明模块路径,又或者传入的路径不对都会出现下面的报错:
can not find **** module
下面是一个文件模块加载示例:
var test = require('/path/.../test.js');
// 或者var test = require('/path/.../test');
注意:
1>、‘/path/…/test.js’是test模块的绝对路径,有绝对路径当然也有相对路径,两者你自己选择使用哪一个。对于上面的示例代码,如果换成相对路径是:require(‘./test’);2>、加载文件模块成功后返回的依然也是一个模块对象。
那现在可以用返回的模块对象test调用该文件模块的哪些属性和方法?
Node.js明确指出,在模块文件中,只有那些通过通过exports和module.exports对象暴露(如果感兴趣的话可以阅读我写细说exports和module.exports, 那片文章对export和module.exports做了详细的介绍,在这里就不多说了)给外部的属性和方法才能够通过require()方法返回的模块对象调用,而其他的方法和属性是无法获取的。例如:
/*
* 这里是我们的文件模块代码
*/
exports.name = " Pandora Galen "; // exports暴露name属性
exports.getName = function() { // exports暴露getName方法
console.log( this.name );
};
yourName = " reader ";
function love() {
console.log('Welcome!');
}
如果引用上述文件模块,则name属性和getName方法是你可以调用的,而yourName属性和love方法是你无法获得的。