你的位置:首页 > Java教程

[Java教程]Nodejs的模块实现


在Node中引入模块,需要经历如下3个步骤:(1)路径分析(2)文件定位(3)编译执行

Node中模块分为两类:

一是Node提供的模块——核心模块。这部分在Node源代码的编译过程中,编译进了二进制文件。在Node进程启动时,部分核心模块就直接加载进内存中,所以这部分核心模块引入时,省略掉文件定位和编译执行并且在路径分析中优先判断,加载速度是是最快的。

二是用户编写的模块——文件模块。在运行时动态加载,需要完整的路径分析、文件定位、编译执行过程,速度比核心模块慢。

1、优先从缓存加载

Node对引入过的模块都会进行缓存,以减少二次引入时的开销。不同的是浏览器仅仅缓存文件,而Node缓存的是编译和执行之后的对象。核心模块的缓存检查先于文件模块的缓存检查。

2、模块路径模块路径是Node在定位文件模块的具体文件时指定的查找策略,具体表现为一个路径组成的数组。

//module_path.jsconsole.log(module.paths);

windows下执行:module_path.js文件

C:\Users\XXX>node "d:\Program Files\nodejs\module_path.js"[ 'd:\\Program Files\\nodejs\\node_modules', 'd:\\Program Files\\node_modules', 'd:\\node_modules' ]

可以看出模块路径的生成规则:

当前文件目录下的node_modules目录;父目录下的node_modules目录;延路径向上逐级递归,知道根目录下的node_modules目录。

3、文件定位

文件扩展名分析

require()在分析标识符过程中,如果标识符中不包含文件扩展名,Node会按.js\.json\.node的次序补足扩展名,依次尝试。

在尝试过程中调用fs模块同步阻塞式地判断文件是否存在。因为Node是单线程的,如果是.node和.json文件,在传递给require()的标识符中带上扩展名,会加快一点速度。另外一个诀窍是同步配合缓存,可以大幅度缓解Node单线程中阻塞式调用的缺陷。

4、模块编译

每个文件模块都是一个对象,它的定义如下:

function Module(id, parent){  this.id = id;  this.exports = {};  this.parent = parent;  if (parent && parent.children){    parent.children.push(this);  }  this.filename = null;  this.loaded = false;  this.children = [];}

定位到具体的文件后,Node会新建一个模块对象,然后根据路径载入并编译。不同的文件扩展名,其载入方法也有所不同,如下:

西安旅游线路大全西安旅游报价价格西安旅游团购优惠深圳去西安旅游报价跟团去西安旅游多少钱地道安徽风味美食 六安酱鸭(图) 海螺沟:冰川下面温暖泡汤(图) 冬日海螺沟:看冰川泡温泉 乐享冰火两重天(组图) 海螺沟冰川旅游的注意事项 马尔代夫哪里潜水比较好?哪个岛比较好? 马尔代夫十月份的天气怎么样?穿什么衣服合适? 巴厘岛和普吉岛哪个好? 泰国哪里好玩? 12星座出境旅游行程推荐 蜀南竹海美食推荐—全竹宴 安徽游客9月16日—20日可享黄山景区门票半价 成都极地海洋世界游览须知 游马尔代夫怎么选岛? 去马尔代夫旅游前要注意些什么? 泰国芭堤雅有什么好吃的? 泰国哪个岛最好玩? M95010-WDW6TP Datasheet M95010-WDW6TP Datasheet M95010-WMN6P Datasheet M95010-WMN6P Datasheet M95020-WDW6TP Datasheet M95020-WDW6TP Datasheet 四平跟团香港两天一晚游 四平跟团香港两天一晚游 四平跟团香港两天一晚游 齐齐哈尔去港澳五天四晚游 齐齐哈尔去港澳五天四晚游 齐齐哈尔去港澳五天四晚游 浙江到香港3天旅游 浙江到香港3天旅游 浙江到香港3天旅游