了解Nodejs中的模块载入

本篇文章给大家介绍一下nodejs中的模块载入。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

了解Nodejs中的模块载入

相关推荐:《nodejs》

使用Nodejs,就不可避免地引用第三方模块,它们有些是Nodejs自带的(例:http,net…),有些是发布在npm上的(例:mssql,elasticsearch…)

本篇章聚焦3个问题:

1.Nodejs模块的加载过程。

2.应用启动的过程。

3.应用如何加载依赖模块。

1.模块的加载过程

Nodejs 模块大概可分为4种:

a) builtin module Nodejs中以C++形式提供的模块。

b) constant module Nodejs中定义常量的模块。

c) native module Nodejs中以javascript形式提供的模块。

d) 第三方module 由第三方提供的模块。

我们先看builtin module 和 native module的生成过程。

 1.png

native JS module的生成相对复杂一些,编译后,会在/out/release/obj/gen目录下生成一个node_natives.h。

该文件是由js2c.py生成,它会把Nodejs源码中的lib目录下,所有js文件转成ASCII码,并存放在相应的数组里。

了解Nodejs中的模块载入

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()函数便会被引入。下面我们分析一下这个函数:

了解Nodejs中的模块载入

可以目测到,函数主要为三个模块服务:builtin,constants和native。

builtin优先级最高,会到modlist_builtin中查找,过程非常简单,遍历整个列表,查找相同名字的模块即可。找到后,模块的注册函数会被先执行,然后将数据exports返回。

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

native 优先级最低

2.应用启动的过程

了解Nodejs中的模块载入

 

上图为一个流程图,它描述了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中的模块载入

更多编程相关知识,请访问:nodejs!!

以上就是了解Nodejs中的模块载入的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2634619.html

(0)
上一篇 2025年3月7日 04:35:03
下一篇 2025年3月6日 02:13:25

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • win怎样升级react native 和node.js

    win升级react native和node.js的方法:1、下载最新版本的nodejs,然后进行覆盖安装;2、升级react-native脚手架,然后升级项目的react-native即可。 本文操作环境:windows7系统、react…

    2025年3月7日
    200
  • node.js+koa搭建一个简单后台管理系统

    相关推荐:《nodejs 教程》 利用node.js 实现一个后台管理系统。node.js 常用框架express、koa。此项目用koa。 步骤 第一步:全局安装node.js 第二步:在本地建立项目目录。 第三步:安装本地依赖:npm …

    2025年3月7日 编程技术
    200
  • 深入浅析nodejs中的events模块

    本篇文章和大家详细介绍一下node中的events模块。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 相关推荐:《node》 events模块是node的核心模块,几乎所有常用的node模块都继承了events模块,比如…

    2025年3月7日
    200
  • node.js使用multer中间件上传文件

    本篇文章给大家介绍一下node.js使用multer中间件解决post文件上传问题的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 相关推荐:《nodejs 教程》 body-parser中间件,其实“极不完美” —…

    2025年3月7日
    200
  • 浅谈Nodejs关闭进程的方法

    本篇文章和大家一起了解一下node关闭进程的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 相关推荐:《node》 NodeJS结束进程 Process:对象是一个全局变量,它提供有关当前 Node.js 进程的信息…

    2025年3月7日
    200
  • 分享几种实用的Node.js调试方法,快来收藏吧!!

    本篇文章给大家介绍nodejs调试的几种方式。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 相关推荐:《nodejs 教程》 第一种 1、打开 vscode 内置终端,右上角选择 JavaScript Debug Ter…

    2025年3月7日 编程技术
    200
  • Nodejs+express中间件实现文件上传

    本篇文章给大家详细介绍nodejs文件上传的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 笔者用nodejs做项目时需要用到文件上传的功能,在网上搜索了很多教程,找到了一个express的中间件,用于处理multi…

    2025年3月7日
    200
  • 详解主动终止Node.js进程的几种方法

    本篇文章给大家介绍一下主动触发node进程终止的一些方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 有几个原因会导致 Node.js 进程终止。其中一些是可以避免的,例如抛出错误时,而另一些是无法防止的,例如内存不足…

    2025年3月7日
    200
  • Node.js中LTS和Current有什么区别

    本篇文章给大家介绍一下node.js中lts和current的区别。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 2016 年 10 月 18 日,Node.js v6 LTS (Boron) 发布,这也是 Node.j…

    2025年3月7日
    200
  • 详解nodejs中的事件循环机制

    本篇文章带大家了解一下node中的事件循环机制。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 前端开发离不开JavaScript,Javascript是一种web前端语言,主要用于web开发中,由浏览器解析执行。而js的…

    2025年3月7日 编程技术
    200

发表回复

登录后才能评论