Node.js是如何处理模块的

来源:互联网 发布:如何获得淘宝优惠券 编辑:程序博客网 时间:2024/06/16 00:14

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方法是你无法获得的。

1 0