若要加载模块二进制_春哥说 | 浅谈NodeJs的模块机制-2
★ 目录 ★
01
Node的模块实现概述
02
优先从缓存中加载
03
路径分析和文件定位
Node的模块实现概述
Nodejs再集成CommonJs的模块机制的规范时进行了取舍,同时增加了特性。
Nodejs在引入模块,主要是分为三个步骤:
- 路径分析
- 文件定位
- 文件编译
同时,模块主要分为两类。核心模块和文件模块。
核心模块:
由NodeJs提供的模块,并且部分核心模块在NodeJS进程启动时就编译成二进制文件,加载进了内存中。
在引入时则省略文件定位和文件编译两个步骤,并且具有最高优先级。
文件模块:
由用户提供的模块,在NodeJs进程动态运行时进行引入。
优先从缓存中加载
NodeJs在引入模块的过程中,会使用缓存进行优化性能。
与浏览器缓存文件不同,NodeJs会对引入过的文件进行缓存,缓存编译执行后的对象。
此时缓存进内存中的模块具有最高优先级。核心模块缓存检查高于文件模块缓存检查。
路径分析和文件定位
文件标识符存在多种形式,那么对于这些差异,模块的查找和定位也存在区别。
模块标识符的分析
在通过require()进行引入模块时,需要传入一个标识符。
标识符主要具有以下类型:
- 核心模块http,buffer,fs等;
- .或..开始的相对路径;
- 以/开始的绝对路径;
- 非路径形式的文件模块,如自定义的connect模块。
核心模块
核心模块在服务启动时就已经编译成二进制代码,其加载过程最快,优先级仅次于缓存加载。
路径形式的模块
以.,..和/开始的标识符都被转换为真实文件路径为索引的模块,并且在编译后将会加载进缓存中,其速度仅次于核心模块加载。
自定义模块
自定义模块非核心模块也不是路径形式的标识符,是一种特殊的文件模块。可能是一个文件或一个包的形式,这类模块的查找是最费事的,也是所有方式中最慢的。
在这之前我们先知道什么是模块路径。
模块路径是Node在定位文件模块的具体文件时制定的查找策略,具体表现为一个路径组成的数组。
我们可以动手尝试以下:
module_path.js
然后执行这个脚本
可以看出模块路径的生成规则,从当前目录下的node_module的文件夹开始,递归搜索父目录直至根目录。
类似于Javascript的原型链或者作用域链。在加载过程中逐个尝试模块路径路径,直至找到目标文件。
并且可以看出文件嵌套越深,耗时越久,这也是为什么自定义模块加载最慢的原因。
文件定位
文件拓展名的分析
require()在分析标识符时,会出现没有文件拓展名的情况。在这种情况,使用的是CommonJs的处理方式,是按js,json和node拓展名依次尝试。
《新程序员》:云原生和全面数字化实践50位技术专家共同创作,文字、视频、音频交互阅读总结
以上是生活随笔为你收集整理的若要加载模块二进制_春哥说 | 浅谈NodeJs的模块机制-2的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 拼接图像亮度均匀调整_液晶拼接屏如何才能
- 下一篇: fpga电平约束有什么作用_FPGA从串