Node中模块查找机制

news2024/11/15 9:50:29

在Node.js中,目前支持es6模块和commonjs模块,在这个万物皆可为模块的世界里,模块的查找机制是一个相对复杂但有序的过程。这通常被称为“模块解析”或“模块查找”。

模块分类

nodejs中的模块主要分为两大类,一类是nodejs提供的模块,称为核心模块,另一类是用户编写的模块,称为文件模块。

文件模块

文件模块根据引用的方式不同,又分为自定义模块和以路径形式引入的模块,自定义模块通常是以包的形式存在,例如我们从npm上下载下来的包,就是自定义模块。以路径形式引入的模块,通常是用户自己编写封装的模块,引入时,用户需要制定模块的真实路径,二者的区别是引入方式不同

模块查找机制的主要步骤和规则

  • 路径解析
    • 当使用require()函数加载模块时,Node.js首先会解析模块标识符(即传递给require()的参数)。
    • 如果模块标识符以./(相对路径)或/(绝对路径)开头,Node.js将直接在该路径下查找模块。
    • 如果模块标识符没有路径信息(即没有以.//node_modules/开头),Node.js将按照一系列规则在node_modules目录中查找。
  • 自定义模块查找
    • 对于自定义模块(即非内置模块),如果模块标识符包含路径信息(如./module/path/to/module),Node.js将直接在该路径下查找。
    • 如果省略了文件扩展名(如require('./module')),Node.js将按照以下顺序尝试加载文件:
      • 尝试加载与模块标识符同名的文件,依次尝试.js.json.node扩展名。
      • 如果找到的是文件夹,Node.js将尝试加载该文件夹下的index.jsindex.jsonindex.node文件。
  • node_modules目录查找
    • 如果模块标识符没有路径信息,Node.js将在当前文件的node_modules目录中查找。
    • 如果在当前目录的node_modules中未找到,Node.js将向上级目录的node_modules中查找,以此类推,直到根目录。
    • (老版本)在每个node_modules目录中,Node.js将首先查找与模块标识符同名的文件夹,然后查找该文件夹下的package.json文件中的main属性指定的文件。如果未找到package.json文件或者它的main属性没指定文件,Node.js将尝试加载该文件夹下的index.js文件。
    • (新版本)默认 先查找同名文件。如果没找到,则尝试查找 .js和.json文件 。如果还是没有,会查找 同名文件夹(当成了一个包),找到后,会先找 package.json文件。如果没有,则会继续查找 index.js文件。如果依旧不存在,则会报错。
  • 内置模块查找
    • 如果Node.js在node_modules目录中未找到对应的模块,它将检查该模块是否为Node.js的内置模块(如fshttp等)。
    • 内置模块是Node.js官方提供的,直接由Node.js的源代码实现,因此不需要通过node_modules目录查找。
  • 缓存机制
    • Node.js在第一次加载模块后,会将模块缓存起来。这意味着如果再次加载同一个模块,Node.js将直接从缓存中加载,而不是重新查找和加载文件。
    • 缓存机制提高了模块的加载速度,并确保了模块的一致性。

总结一下文件模块的 查找规范

// 新版node查找流程
│
└───┤ 同名文件
 │	
 │──┤ 同名.js / 同名.json
 │
 │──┤ 同名文件夹
    │
    │───┤ pageage.json
    │
    └───┤ index.js
   

注意

安装的模块里又引用了其他的模块,这个模块会按照规则先在自己的node_modules里查找它自己引用的模块,找不到再向上查找所以你即使在最外层的模块里加载了最新的这个包,那么它也不会生效。

当多个同级模块都引入了同一个模块,但它们的版本不一样。模块之间是互相独立的,他们都会在它自身的node_module里先找,如果都找到了,那他们所用的模块确实是不同版本的。如果没找到就会向上查找。

安装模块后为什么可以直接执行命令

例如安装ESLint后,能够直接执行`eslint --fix`命令的原因可以归纳为以下几点:

全局安装
   当使用`npm install eslint -g`命令全局安装ESLint时,npm会将ESLint包及其所有依赖下载并放置在全局的`node_modules`目录中。这个位置根据操作系统和npm的配置有所不同。

bin属性的处理
   npm在全局安装过程中会查看ESLint包的`package.json`文件。如果该文件包含`bin`属性,npm会根据`bin`属性指定的文件路径,在全局的`bin`目录中创建指向这些文件的链接(或在Windows上是可执行的包装器)。这些链接或包装器允许用户直接在命令行中运行ESLint。

PATH环境变量
   PATH环境变量是操作系统用来定位可执行程序的关键变量。当在命令行终端输入一个命令(如`eslint`)时,系统会检查PATH环境变量中列出的目录,以查找名为`eslint`的可执行文件。由于全局安装ESLint时,其可执行文件的路径已被添加到PATH中,因此用户可以在任何位置直接运行`eslint`命令。

npm scripts 使用指南 - 阮一峰的网络日志 (ruanyifeng.com)

前端概念关系图

参考文章

node.js - nodeJS模块查找策略 - 个人文章 - SegmentFault 思否

从package-lock看npm版本锁定相关知识_版本锁定标识-CSDN博客

npm link与bin的一些使用 - 掘金 (juejin.cn) 

npm scripts 使用指南 - 阮一峰的网络日志 (ruanyifeng.com)

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

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

相关文章

Mocha Pro 2024 v11.0.1 Mac版摄像机反求跟踪插件更新:优化AE/PR/OFX/达芬奇工作流程

更新Mac苹果版,原生支持Intel和Apple M芯片,安装很简单。Mocha Pro 是一款世界知名的软件和插件,用于平面运动跟踪、3D 跟踪、动态观察、对象移除、图像稳定和PowerMesh有机扭曲跟踪。得益于集成SynthEyes核心3D跟踪算法的强大功能&#xff0…

构建汛期智慧水利新生态:EasyCVR视频汇聚监控综合管理方案解析

一、项目背景与目标 随着我国水利事业的不断发展,水利设施的管理与维护工作愈发重要。随着夏季汛期的到来,水利管理工作面临着巨大的挑战。为确保水利设施的安全运行,及时应对可能出现的汛情,建设一套高效、智能的视频监控可视化…

(Javascript)AI数字人mp4转canvas播放并去除背景绿幕

1、需求介绍 H5页面嵌入AI数字人播报&#xff0c;但生成的数字人是mp4格式且有绿幕背景&#xff0c;需要转成canvas并去除背景&#xff1b; 2、效果&#xff1a; 去除前&#xff1a; 去除后&#xff1a; 3、代码 <!DOCTYPE html> <html lang"en"><…

物联网网关和飞鸟物联平台如何助力其实现智能化升级,提升生产效率-天拓四方

随着工业4.0时代的到来&#xff0c;物联网技术逐渐成为推动工业转型升级的关键力量。物联网网关作为连接工业设备与网络的核心枢纽&#xff0c;在工业自动化、数据收集与分析等方面发挥着越来越重要的作用。本案例将围绕一家知名制造企业&#xff0c;展示物联网网关和飞鸟物联平…

vue-loader

Vue Loader 是一个 webpack 的 loader&#xff0c;它允许你以一种名为单文件组件 (SFCs)的格式撰写 Vue 组件 起步 安装 npm install vue --save npm install webpack webpack-cli style-loader css-loader html-webpack-plugin vue-loader vue-template-compiler webpack…

SpringCloud学习笔记 - 1、Boot和Cloud版本选型

文章目录 前言需要&#xff08;学习/用到&#xff09;的技术SpringBoot版本的选择我们为什么要使用 Java 17&#xff0c;以及SpringBoot 3.2 呢&#xff1f; SpringCloud 版本的选择SpringCloud 命名规则Springcloud Alibaba 版本的选择如何确定Boot&#xff0c;Cloud&#xff…

我国的AI大模型前景如何?

目前&#xff0c;我国的AI大模型市场前景很好。这个产业的发展源于多领域的广泛需求&#xff0c;包括办公、制造、金融、医疗、政务等场景中的降本增效、生产自动化、降低风险、提高诊断准确率、提高政务服务效率等诉求。这些领域的创新和发展共同推动了我国AI大模型产业的蓬勃…

C++中的结构体——结构体案例1_2

案例描述 学校正在做毕设项目&#xff0c;每位老师指导5名学生&#xff0c;总共有3名老师&#xff0c;需求如下 设计学生和老师的结构体&#xff0c;其中在老师的结构体中&#xff0c;有老师的姓名和一个存放5名学生的数组作为成员 学生的成员有姓名、考试分数&#xff0c;创…

又一个小伙伴在深圳上车安家~

又有同学在深圳买房上车了&#xff0c;招呼在深圳的大学同学聚餐&#xff0c;现在这个时间点买房还是挺强的。 他主要是小孩马上到了上学的年纪&#xff0c;考虑到孩子上学&#xff0c;所以今年四月份开始在深圳看房&#xff0c;很快就在罗湖锁定了一套二手房&#xff0c;没怎…

计算机组成原理 期末复习笔记整理(上)(个人复习笔记/侵删/有不足之处欢迎斧正)

零、计算机的发展 冯.诺依曼计算机的特点: 1.计算机由五大部件组成 2.指令和数据以同等地位存于存储器&#xff0c;可按地址寻访 3.指令和数据用二进制表示 4.指令由操作码和地址码组成 5.存储程序&#xff08;首次提出存储结构&#xff09; 6.以运算器为中心&#xff08;现代…

定时器0电机控制PWM输出

/*立式不锈钢波纹管机控制板2021 2 26 pcb PAST******/ #include <REG52.H> #include <intrins.H> #define uint unsigned int #define uchar unsigned char #define …

农产品商城系统农资电商商城系统java项目jsp web项目

农产品商城系统农资电商商城系统java项目jsp web项目 会员用户可以实现&#xff1a;注册登录、商品信息浏览、加入购物车、加入收藏、下单支付、查看公告、查看以及留言、个人信息管理 后台管理的实现&#xff1a;类别管理模块、商品管理模块、会员管理模块、订单管理、退货管…

11.1 Go 标准库的组成

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

redis未授权getshell整合利用

一、redis环境搭建 Redis下载地址&#xff1a;http://download.redis.io/releases/redis-4.0.2.tar.gz 1.靶机安装redis-centos7 第一步&#xff1a;下载wget yum -y install wget 第二步&#xff1a;下载redis wget http://download.redis.io/redis-stable.tar.gz 第三步&a…

英格索兰IngsollRang控制器过热维修讲解

【英格索兰IngsollRang控制器维修请关注】 【英格索兰IngsollRang控制器维修】 【英格索兰控制器维修】 一、IngsollRang扭矩枪控制器故障诊断 1. 检查环境温度&#xff1a;首先&#xff0c;确认工作场所的温度是否过高。如果环境温度超过设备规定的工作温度&#xff0c;可能…

数据结构入门:探索数据结构第一步

0.引言 在我们的日常生活中&#xff0c;经常需要管理大量的数据&#xff0c;就譬如学校中有好几千个学生&#xff0c;中国有十三亿人口&#xff0c;对于那么多的数据进行查找、插入、排序等操作就会比较慢。人们为了解决这些问题&#xff0c;提高对数据的管理效率&#xff0c;…

支持微信支付宝账单,极空间Docker部署一个开箱即用的私人账本『cashbook』

支持微信支付宝账单&#xff0c;Docker部署一个开箱即用的私人账本『cashbook』 哈喽小伙伴好&#xff0c;我是Stark-C~ 不知道屏幕前的各位富哥富姐们有没有请一个专业的私人财务助理管理自己的巨额资产&#xff0c;我不是给大家炫耀&#xff0c;我在月薪300的时候就已经有了…

WPF学习(2)--类与类的继承2-在窗口的实现

一、代码分析 1.Animal.cs 1.1 代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace AnimalNamespace {public class Animal{public string Name { get; set; }public int Age { get; set…

四、STP(生成树协议)

目录 一、经典生成树&#xff08;STP&#xff09; 1.1、作用 1.2、重要参数 1.3、BPDU 1.4、STP计算过程 1.5、STP接口状态 二、快速生成树&#xff08;RTSP&#xff09; 2.1、端口角色的增补 2.2、端口状态简化 2.3、配置BPDU报文修改 2.4、配置BPDU的处理 2.5、快…

从零开始手把手Vue3+TypeScript+ElementPlus管理后台项目实战十一(整体布局04之Header及用户注销)

新增Hearder 新增 src/layout/components/PageHeader.vue <template><div class"header-cont"><div><h1><router-link to"/">RealWorld</router-link></h1></div><div><template v-if"is…