首页 / NODEJS / 详解Nodejs模块载入运行原理
详解Nodejs模块载入运行原理
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了详解Nodejs模块载入运行原理,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2497字,纯文字阅读大概需要4分钟。
内容图文
![详解Nodejs模块载入运行原理](/upload/InfoBanner/zyjiaocheng/295/08d7eaf33ee54606ae528a59ed53dc59.jpg)
本篇章聚焦3个问题:
Nodejs模块的加载过程。
应用启动的过程。
应用如何加载依赖模块。
1.模块的加载过程
Nodejs 模块大概可分为4种:
a) builtin module Nodejs中以C++形式提供的模块。
b) constant module Nodejs中定义常量的模块。
c) native module Nodejs中以javascript形式提供的模块。
d) 第三方module 由第三方提供的模块。
我们先看builtin module 和 native module的生成过程。
native JS module的生成相对复杂一些,编译后,会在/out/release/obj/gen目录下生成一个node_natives.h。
该文件是由js2c.py生成,它会把Nodejs源码中的lib目录下,所有js文件转成ASCII码,并存放在相应的数组里。
builtin C++ module 生成过程相对简单,每个builtin C++的模块入口,都会通过宏NODE_MODULE_CONTEXT_AWARE_BUILTIN扩展成一个func,例如对tcp_wrap模块而言,会扩展成static void register_tcp_wrap() attribute(constructor) 函数。
熟悉GCC的朋友都知道,attribute(constructor)修饰的函数会在Nodejs的main()函数之前被执行,也就是说,builtin C++ module 会在main()函数之前被载入到modlist_builtin列表,而modlist_builtin是一个struct node_module类型的指针,get_builtin_module()会遍历查找我们所需的模块。
其实无论是naive JS module 还是 builtin C++ module,最终都是要被编译成可执行文件。对于两者的提取方式,却大不相同,js module 使用process.binding('natives'),而C++ module 则直接使用get_builtin_module()。
在node.cc里面提供了一个binding()函数,当我们应用require()来引用另外一个模块时,binding()函数便会被引入。下面我们分析一下这个函数:
可以目测到,函数主要为三个模块服务:builtin,constants和native。
builtin优先级最高,会到modlist_builtin中查找,过程非常简单,遍历整个列表,查找相同名字的模块即可。找到后,模块的注册函数会被先执行,然后将数据exports返回。
constants模块优先级次之,Nodejs中的常量定义通过constants导出。
native 优先级最低。
2.应用启动的过程
上图为一个流程图,它描述了test.js做为参数启动开始,最终被执行。整个过程可以分为4步:
1.可执行文件 node : node入口,在启动过程中主要扮演环境准备工作
2.src/node.js:启动脚本
3.Native Module:为module.js 的执行做准备工作
4.module.js:native module,用来加载,编译,执行应用程序
应用如何加载依赖模块
前面提到NativeModule.require()只负责帮助引用natives module,这对于lib/module.js而言已经足够了。
但是很明显,一般应用不但需要引用matives module,还要引用第三方模块,让我们看一下module.js中的Module.prototype._require()函数中。
相关推荐:
nodejs模块nodemailer基本使用-支持附件的邮件发送示例代码(图)
深入了解NodeJS
nodeJS实现微信功能分享
以上就是详解Nodejs模块载入运行原理的详细内容,更多请关注Gxl网其它相关文章!
内容总结
以上是互联网集市为您收集整理的详解Nodejs模块载入运行原理全部内容,希望文章能够帮你解决详解Nodejs模块载入运行原理所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。