欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

若要加载模块二进制_春哥说 | 浅谈NodeJs的模块机制-2

发布时间:2025/6/17 编程问答 43 豆豆
生活随笔 收集整理的这篇文章主要介绍了 若要加载模块二进制_春哥说 | 浅谈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的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。