深入浅出node.js学习笔记—node模块加载机制

瘢结枚举
• 阅读 1106

node加载模块分为3个步骤
1.路径查找
2.文件定位
3.模块编译

1.路径查找
通过module.paths可以看出,文件查找是先查找当前目录的node_modules,然后查找父目录的node_modules,然后逐级向上查找

2.文件定位
如果require传参没有文件扩展名,那么node会按.js .json .node 的顺序查找文件
如果没有查找到对应文件,node会把对应目录作为包处理,查找目录下pageage.json文件,用JSON.parse()处理,然后查找到main属性,根据main属性进行文件定位,如果main属性没有文件拓展名,依然按照.js .json .node 顺序查询。如果main属性文件指定的文件名错误,或者压根没有pageage.json,node会将index作为默认文件名,按照.js .json .node 依次进行查找,如果还没有定位到,将进入下一个模块路径查找,全部递归后,如果还没有找到,将会抛出查询失败异常。

3.模块编译
编译分为三种情况,js模块、c/c++模块、json模块
Js模块
每个模块都有默认变量,exports、module、require、__filename、__dirname。这些变量的来源是在编译过程,对文件进行收尾处理

    function(exports、module、require、__filename、__dirname){ 
    /*文件内容*/ 
    }

exports和module.exports的区别
exports是module.exports的引用,如果直接对exports进行复制,只是改变了exports的指向,但是对于module.exports是没有任何改变的。所以我们不能直接对exports进行赋值,应该对exports的属性赋值。
c/c++模块
因为是c/c++编写,所以该模块并不需要编译,而是直接进行加载和执行。
通过调用process.dlopen()方法执行。
json模块
node直接通过fs模块同步读取json文件,然后通过JSON.parse()进行转换,后赋值给module.exports。

模块缓存
核心模块编译成功后缓存在NativeModule._cache下
文件模块编译成功后缓存在Module._cache下

点赞
收藏
评论区
推荐文章
半臻 半臻
4年前
Python基础4——模块与包
12模块与包模块通俗地理解为.py文件,里面定义了变量、函数和类。需要的时候就可以导入这些模块。执行步骤1.在python模块加载路径中查找相应的模块文件2.将模块文件编译成中间代码3.执行模块文件中的代码12.1模块分类1.内置模块,也叫标准库,比如说random,time,大概有200多个2.第三方模块,也称为第三方库,使用pipins
好买-葡萄 好买-葡萄
4年前
【数据结构与算法】—— 二分查找
1.二分查找的概念二分查找指的是在排好序的数组中,找到目标元素。如果元素存在则返回元素的下标,不存在则返回1.下面以升序为例进行简单描述2.查找过程:取数组中间元素与查找元素target比较。如果target等于中间元素则直接返回中间元素的下标,如果target小于数组中间元素则在数组左边查找,如果target大于数组中间元素则在右边查找。重复以上步骤。
Wesley13 Wesley13
4年前
java日志框架系列(3):logback框架配置详解
1.Logback配置1.配置步骤及默认配置logback即可以通过编程式配置,也可以通过xml的形式配置。logback配置步骤:1\.尝试在classpath下查找文件logbacktest.xml;2\.如果文件不存在,则查找文件logback.xml;3\.如果两
blmius blmius
4年前
linux find 命令查找文件和文件夹
查找目录:find/(查找范围)name'查找关键字'typed查找文件:find/(查找范围)name查找关键字print详解:find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
Wesley13 Wesley13
4年前
Java中的SPI是怎么一回事
!(https://oscimg.oschina.net/oscnet/up2acf1859e4ef7973a34a3dffe4af94a7b51.png)SPI,全称为ServiceProviderInterface,是一种服务发现机制。它通过在ClassPath路径下的METAINF/services文件夹查找文件,自动加载文件里所定
Wesley13 Wesley13
4年前
Java中
javacclasspath的使用:javac:如果当前你要编译的java文件中引用了其它的类(比如说:继承),但该引用类的.class文件不在当前目录下,这种情况下就需要在javac命令后面加上classpath参数,通过使用以下三种类型的方法来指导编译器在编译的时候去指定的路径下查找引用类。(1).绝对路径:javac
Wesley13 Wesley13
4年前
.gitignore 规则写法
1\.在已忽略文件夹中不忽略指定文件夹/node_modules/!/node_modules/layer/2.在已忽略文件夹中不忽略指定文件/node_modules/!/node_modules/laye
Wesley13 Wesley13
4年前
Java编程技术之浅析SPI服务发现机制
SPI服务发现机制SPI是JavaJDK内部提供的一种服务发现机制。SPIServiceProviderInterface,服务提供接口,是JavaJDK内置的一种服务发现机制通过在ClassPath路径下的METAINF/services文件夹查找文件,自动加载文件里所定义的类
Wesley13 Wesley13
4年前
mysql之索引
一.索引:索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据。对于索引,会保存在额外的文件中1.1.创建一个索引:mysqlcreateindexix_classontb3(class_id);QueryOK,0rowsaffected(0.02sec)
Stella981 Stella981
4年前
Logback学习总结
使用前提Logbackclassic依赖slf4japi.jar和logbackcore.jarLogback选择配置:1.尝试在classpath下查找文件logbacktest.xml;2.如果文件不存在,则查找文件logback.xml;3.如果两个文件都不存在,logback用Basic
十月飞翔 十月飞翔
3年前
服务器更换网卡后到配置集群能ping通该做了bond的机器
拆掉物理机,安装网卡,安装驱动。Linux安装步骤2.1查找硬件查找网卡是否安装成功,同时查看设备号:3.修改/etc/sysconfig/networkscripts/下的ifcfg文件,对应新的网口,创建新的对应文件然后ifdown掉所有的网口,在ifup新网口,ifupbond0,ifupbond0.914.集群其他机器此时应该可以ping通该机器的ip