Node.js 是怎么找到模块的?

news2025/8/12 0:08:33

大家好,我是前端西瓜哥,今天我们来看看 Node.js 模块查找的原理。

模块种类

模块有三种来源。

  1. 核心模块:Node.js 内置的包。比如 http、fs、path;

  2. 自定义模块:NPM 包。比如 axios、express,位于 node_modules 目录下的同名目录,并通过 package.json 的 main 字段指定入口文件;

  3. 文件模块:项目自己的模块文件,使用路径的写法。包括相对路径(比如 “./utils”)和绝对路径(比如 “/Users/xigua/project/utils”)。

需要注意的是,“a/b” 这种不属于路径写法,它属于前两种,比如 “fs/promises”、“@babel/core”。

这里给一个例子:

const http = require('http'); // Node.js 内置包
const { defaultContent } = require('./default'); // 开发者自己写的模块文件

http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end(defaultContent);
}).listen(3200);

模块查找

我们使用 require() 方法,传入一个字符串标识符,模块查找的旅途就开始了。

核心模块

首先分析标识符的风格,如果是不是路径的写法,我们会先找 Node.js 内置的包有没有匹配的,如果匹配,就导入对应模块,比如 require('http') 就能拿到一个 http 对象,可用于创建 web 服务等功能。

NPM 包

如果不匹配,会在当前文件的目录下,找 node_modules 目录,看里面有没有对应的包。如果找不到,就继续往父目录找,直到根目录。如果找不到,会报 Cannot find module '包名' 的错误。

文件模块

包通常是一个文件夹,里面会有 package.json 文件,Node.js 会提取其中 main 字段对应的文件作为模块文件。如果没有,就依次查找该目录下的 index.js、index.json、index.node 文件。

需要查找的目录可以通过 module.paths 变量得到。

如果你熟悉 JavaScript 的原型链,你会发现它们非常相似,可以做类比以加深理解。

如果标识符是路径,会通过计算得到一个绝对路径,然后找到的是个目录,同上面找 npm 包的逻辑。

要是找不到,就加上后缀再找。后缀按顺序添加为:.js.json.node,找到就立即返回。若一个文件没有后缀但被匹配到了,它会被当作 js 文件。

上面没说缓存的情况,其实我们会对模块做缓存,下面详细说明一下。

模块缓存

每当加载一个模块后,这个模块就会被缓存起来。

你可以在随意一个文件中输入得到缓存的内容,是一个哈希表,key 为模块的绝对路径,确保缓存命中,value 则是模块对象。

const { Module } = require("module");
console.log(Module._cache);

也能用 require.cache 变量拿到,它和 Module._cache 指向同一个对象。

Node.js 内置的模块也需要缓存,但它不会记录到 Module._cache 中,而是保存在 Module.

下面是一个例子,index.js 导入了 a.js,a.js 下引入了 lodash.get 包,模块缓存结果为:

image-20221115221047611

因为缓存的存在,所以 一个模块文件只会被执行一次,然后将 module.exports 缓存下来。

之后被多次导入,不会再执行这个模块文件,而是直接取出对应的 module.exports。

总结

画个流程图,丢掉了一些细节(如果定位到目录后的逻辑)。

image-20221115224631613

我是前端西瓜哥,欢迎关注我,学习更多前端知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/15286.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

virtualBox虚拟机之间网络互通设置

环境 主机:Win10 虚拟机:Ubuntu 20.04 虚拟机:VirtualBox 6.1 模式虚拟机→主机主机→虚拟机虚拟机↔虚拟机虚拟机→Net/LANNet/LAN→虚拟机NAT√端口转发√端口转发NATservice√端口转发√√端口转发Host-Only√√√Internal√Bridged√√…

【快速上手系列】用于登录的验证码制作(ValidateCode)和Javaweb自带的老式验证码快速上手

【快速上手系列】用于登录的验证码制作(ValidateCode)和Javaweb自带的老式验证码快速上手 验证码 简介 验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动…

易基因|疾病研究:DNA甲基化和转录组学特征在高浆卵巢癌复发和耐药过程中高度保守

易基因|疾病研究:DNA甲基化和转录组学特征在高浆卵巢癌复发和耐药过程中高度保守 大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 2022年07月27日,《J Exp Clin Cancer Res》杂志发表了题为“DNA me…

Linux|centos7下部署安装alertmanager并实现邮箱和微信告警(三)

前言: 前文Linux|centos7下部署安装alertmanager并实现邮箱和微信告警(二)_晚风_END的博客-CSDN博客 实现了告警系统模块的部署和测试,主要的告警范围是服务器节点的操作系统内存,磁盘空间的使用率这些方面&#xff0…

甘露糖-聚乙二醇-N-羟基琥珀酰亚胺mannose-PEG-NHS

甘露糖-聚乙二醇-N-羟基琥珀酰亚胺mannose-PEG-NHS 琥珀酰亚胺又称为丁酰亚胺或丁二酰亚胺,是一种无色针状结晶或具有淡褐色光泽的薄片固体,味甜。易溶于水、醇或氢氧化钠溶液,不溶于醚、氯仿等,可以提供PEG接枝修饰甘露糖&#…

精彩回顾!2022VisionChina深圳展圆满落幕

11月16日,维科杯•OFweek 2022中国工业自动化及数字化行业年度评选颁奖典礼在深圳大中华喜来登酒店举行,经过OFweek网络投票、专家组评审及组委会综合评审三轮激烈紧张的评选,昂视凭借“PiqsVT智能视觉系统”在近300个参评项目中脱颖而出&…

Linux三个踩坑过程记录

今早花了一早上的时间解决了三个Linux的问题,分别是读写权限、克隆虚拟机开启问题和Xshell连接VM虚拟机问题。平时用虚拟机比较少,现在刚一开始用,就给我来了三个问题让我解决,真是含泪解决问题,但现在解决了&#xff…

预定2.0 Crack ZoomCharts JavaScript 最值得探索

世界上最可探索的 JavaScript 图表 将内容深入分析和支持多点触控的大数据可视化轻松集成到您的 Web 项目中--ZoomCharts JavaScript 快速、简单且令人印象深刻的 JavaScript 图表 以极快的速度将 javascript 图表与令人惊叹的向下钻取功能集成,一定会给您的团队、…

Word控件Spire.Doc 【文本】教程(22) ;在 Word 中应用强调标记(C#/VB.NET)

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下,轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具,专注于创建、编辑、转…

Live800:在线客服系统如何帮助企业创造持续的服务价值?

德鲁克管理箴言:企业的唯一目的就是“创造顾客”。 如何创造顾客?只能依靠产品和服务。产品和服务是连接企业与客户的天然纽带和必然桥梁。 企业依靠持续不断生产满足客户需求、符合客户价值主张的优质产品和服务来创造客户、留住客户并建立客户忠诚度…

视频怎么添加水印?快来收好这些方法

如今短视频行业发展得如火如荼,很多小伙伴都投入了短视频制作中。我最初发布视频只是因为热爱记录日常,顺便还能增进一下自己的视频剪辑水平。刚开始没想那么多,视频制作好就直接传到平台上去了,后来才发现自己的视频被别人搬运&a…

高通量筛选化合物库抑制缺氧诱导因子抑制剂

研究证明了土著细菌具有铁依赖性机制,可以抑制宿主铁的运输和储存。通过微生物代谢物的高通量筛选,研究人员发现,肠道菌群产生的代谢物能抑制肠道铁吸收主要转录因子低氧诱导因子 2α (HIF-2α),并增加铁存储蛋白铁蛋白 (Ferritin…

SpringBoot SpringBoot 开发实用篇 4 数据层解决方案 4.3 H2数据库

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇4 数据层解决方案4.3 H2数据库4.3.1 问题引入4.3.2 内置数据库4.3.3 …

微信小程序使用npm教程

首先打开工具-详情-勾选使用npm模块 使用npm的步骤: 1. 安装 npm 包 在小程序 package.json 所在的目录中执行命令安装 npm 包: npm install此处要求参与构建 npm 的 package.json 需要在 project.config.json 定义的 miniprogramRoot 之内。 tips&am…

【大数据存储技术】思考题及参考答案

文章目录第1章 绪论1. NoSQL和关系型数据库在设计目标上有何主要区别?2. 简要总结一下NoSQL数据库的技术特点。第2章 NoSQL数据库的基本原理1. 描述分布式数据管理的特点。2. 什么是CAP原理?CAP原理是否适用于单机环境?3. 简述BASE理论的具体…

【附源码】计算机毕业设计JAVA校园疫情防控管理软件

【附源码】计算机毕业设计JAVA校园疫情防控管理软件 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JAVA…

(SVN+SSH)搭建SVN并使用SSH进行免密拉取推送代码

【SVNSSH】搭建SVN并使用SSH进行免密拉取推送代码一、安装svn、openssh-server服务二、开启svn服务,创建测试仓库,并能通过账号密码拉取定义svn仓库文件位置创建仓库:acc_repo配置拉取仓库的账号密码通过账号密码拉取代码三、创建测试仓库,通…

云安全系列3:如何构建云安全策略

云计算拯救了很多企业,因为它可以迅速调整以支持更大规模的工作以及更多的在线用户。随着2023年的到来,宏观经济逆风聚集,它将更加具有吸引力,这归功于它更高的业务敏捷性和更优的成本效率比。Gartner 预测,到 2023 年…

聚观早报|腾讯员工平均月薪超8万;马斯克考虑卸任特斯拉CEO

今日要闻:腾讯员工平均月薪超8万;马斯克考虑卸任特斯拉CEO;iPhone双十一销量近350万部;暴雪将在大陆暂停多数服务;高德地图上线北斗卫星定位查询系统腾讯员工平均月薪超8万 据报道,腾讯控股11月16日发布202…

4-8岁儿童EEG微状态研究:年龄和性别的影响

大规模神经网络的超快时空动态可以通过静息状态脑电图(EEG)微观状态来检验,这代表了随时间动态演化的同步神经活动的短暂时期。在成人中,四种典型的微观状态已被证明可以解释静息状态脑电图的大部分地形差异。它们的时间结构依赖于…