手机版

Nodejs模块的加载操作原理

时间:2021-09-01 来源:互联网 编辑:宝哥软件园 浏览:

前言

,在使用Nodejs的时候,不可避免的会引用第三方模块,有些是Nodejs带来的(比如http,net.),其中一些发布在npm上(例如,mssql、elasticsearch.)

本章主要讨论三个问题:

Nodejs模块的加载过程。应用程序启动的过程。应用程序如何加载相关模块。1.模块加载过程

Nodejs模块大致可以分为四种类型:

a)内置模块nodejs中以c形式提供的模块。

b)在常量模块节点js中定义常量的模块。

c)在本机模块nodejs中以javascript形式提供的模块。

d)第三方模块:第三方提供的模块。

我们先来看看内建模块和原生模块的生成过程。

原生JS模块的生成相对复杂。编译后,将在/out/release/obj/gen目录中生成node _ natives.h。

该文件由js2c.py生成,它会将Nodejs源代码lib目录中的所有js文件转换为ASCII码,并存储在相应的数组中。

内建C模块的生成过程比较简单,每个内建C的模块入口会通过宏node _ module _ context _ aware _ builtin扩展成一个func,比如对于tcp_wrap模块,会扩展成一个静态void register _ TCP _ wrap()属性(构造函数)函数。

熟悉GCC的人都知道,属性(构造函数)修改的函数会在Nodejs的main()函数之前执行,也就是在main()函数之前将内建C模块加载到modlist_builtin列表中,modlist_builtin是struct node_module类型的指针,get_builtin_module()会遍历找到我们需要的模块。

实际上,简单的JS模块和内置的C模块最终都被编译成可执行文件。提取方法大不相同。js模块使用process . binding(' native '),而C模块直接使用get_builtin_module()。

node.cc中有一个binding()函数,当我们应用require()引用另一个模块时,会引入binding()函数。下面我们来分析一下这个函数:

可以直观地观察到,该函数主要服务于三个模块:内置、常量和本机。

Builtin具有最高优先级,因此将在modlist_builtin中搜索它。过程很简单。遍历整个列表并搜索同名的模块。一旦找到,将首先执行模块的注册功能,然后返回数据导出。

常量模块优先,Nodejs中常量的定义通过常量导出。

本机具有最低优先级。

2.应用程序启动的过程

上图是一个流程图,描述了test.js作为一个参数开始,最后执行。整个过程可以分为四个步骤:

1.可执行文件节点:节点入口,主要起启动时环境准备的作用

2.src/node.js:开始脚本

3.本机模块:为模块的执行做准备

4.模块:本机模块,用于加载、编译和执行应用程序

应用程序如何加载相关模块

前面提到的NativeModule.require()只负责帮助引用原生模块,这对于lib/module.js来说已经足够了.

然而,很明显,一般的应用程序不仅需要引用matives模块,还需要引用第三方模块。让我们看看module . prototype . require()函数在module.js中的表现

版权声明:Nodejs模块的加载操作原理是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。