Nodejs的模块实现

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

Node中模块分为两类:

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

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

1、优先从缓存加载

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

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

//module_path.js
console.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会新建一个模块对象,然后根据路径载入编译。不同的文件扩展名,其载入方法也有所不同,如下:

aaarticlea/png;base64,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" alt="" />

Node会调用不同的读取方式,如.json文件的调用:

//Native extension for .json
Module._extension['.json'] = function(module, filename){
var content = NativeModule.require('fs'),readFileSync(filename, 'utf8');
try{
module.exports = JSON.parse(stripBOM(content));
}catch(err){
err.message = filename + ':' + err.message;
throw err;
}
};
//Module._extension会被赋值给require()的extension属性。
在确定文件的扩展名之后,Node将调用具体的编译方式来将文件执行后返回给调用者。
每一个编译成功的模块都会将其文件路径作为索引缓存在Module._cache对象上,以提高二次引入的性能。
(1)JavaScript模块的编译
每个模块文件中存在着require、exports、module这3个变量,但是他们在模块文件中并没有定义,在Node的API文档中每个模块中还有__filename、__dirname这两个变量。
事实上,在编译过程中,Node对获取的JavaScript文件内容进行了头尾包装。

(function(exports, require, module, __filename, __dirname){//头部
var math = require('math');
exports.area = function(redius){
return Math.PI * redius * redius;
};
});//尾部

这样每个模块文件之间都进行了作用域隔离。包装之后的代码会通过vm原生模块的runInThisContext()方法执行(类似eval,只是具有明确上下文,不污染全局),返回一个具体的function对象。最后将当前模块的exports属性, require方法, module(模块对象自身), __filename, __dirname作为参数传递给这个function()执行。

执行之后,模块的exports属性被返回给了调用方。exports属性上的任何方法和属性都可以被外部调用到,但是模块中的其余变量或属性则不可直接被调用。


上一篇:string.prototype.replace 和正则表达式


下一篇:使用sympy在特定点评估雅可比行列式