Node 文件查找优先级及 Require 方法文件查找策略

news2024/11/28 16:46:11

Node 文件查找优先级及 Require 方法文件查找策略

一、模块规范

NodeJSCommonJS进行了支持和实现,让我们在开发node的过程中可以方便的进行模块化开发:

  • 在Node中每一个js文件都是一个单独的模块
  • 模块中包括CommonJS规范的核心变量:exports、module.exports、require
  • 通过上述变量进行模块化开发

而模块化的核心是导出与导入,在Node中通过exportsmodule.exports负责对模块中的内容进行导出,通过require函数导入其他模块(自定义模块、系统模块、第三方库模块)中的内容

二、查找策略

require方法接收一下几种参数的传递:

  • **原生模块:**http、fs、path等
  • 相对路径的文件模块:./mod或…/mod
  • 绝对路径的文件模块:/pathtomodule/mod
  • 目录作为模块:./dirname
  • **非原生模块的文件模块:**mod

相对路径/绝对路径模块的文件模块 和 目录作为模块 的查找顺序是 先尝试前者在尝试后者

require参数较为简单,但是内部的加载却是十分复杂的,其加载优先级也各自不同**,如下图:**
在这里插入图片描述

从上图可以看见,文件模块存在缓存区,寻找模块路径的时候都会优先从缓存中加载已经存在的模块

原生模块

而像原生模块这些,通过require方法在解析文件名之后,优先检查模块是否在原生模块列表中,如果在则从原生模块中加载

绝对路径、相对路径

如果require绝对路径的文件,则直接查找对应的路径,速度最快

相对路径的模块则相对于当前调用require的文件去查找

如果按确切的文件名没有找到模块,则 NodeJs 会尝试带上 .js.json.node拓展名再加载

目录作为模块

默认情况是根据根目录中package.json文件的main来指定目录模块,如:

{ ``"name"` `: ``"some-library"``,`` ``"main"` `: ``"main.js"` `}

如果这是在./some-library node_modules目录中,则 require('./some-library') 会试图加载 ./some-library/main.js

如果目录里没有 package.json文件,或者 main入口不存在或无法解析,则会试图加载目录下的 index.jsindex.node 文件

注意浏览器默认不是node环境, 在html 中 通过 中的 import 引入会报错

非原生模块

在每个文件中都存在module.paths,表示模块的搜索路径,require就是根据其来寻找文件

window输出如下:

[ ``'c:\nodejs\node_modules'``,``'c:\node_modules'` `]

可以看出module path的生成规则为:从当前文件目录开始查找node_modules目录;然后依次进入父目录,查找父目录下的node_modules目录,依次迭代,直到根目录下的node_modules目录

当都找不到的时候,则会从系统NODE_PATH环境变量查找

举个例子

如果在/home/ry/projects/foo.js文件里调用了 require('bar.js'),则 Node.js 会按以下顺序查找:

  • /home/ry/projects/node_modules/bar.js
  • /home/ry/node_modules/bar.js
  • /home/node_modules/bar.js
  • /node_modules/bar.js

这使得程序本地化它们的依赖,避免它们产生冲突

三、总结

通过上面模块的文件查找策略之后,总结下文件查找的优先级:

  • 缓存的模块优先级最高
  • 如果是内置模块,则直接返回,优先级仅次缓存的模块
  • 如果是绝对路径 / 开头,则从根目录找
  • 如果是相对路径 ./开头,则从当前require文件相对位置找
  • 如果文件没有携带后缀,先从js、json、node按顺序查找
  • 如果是目录,则根据 package.json的main属性值决定目录下入口文件,默认情况为 index.js
  • 如果文件为第三方模块,则会引入 node_modules 文件,如果不在当前仓库文件中,则自动从上级递归查找,直到根目录

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

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

相关文章

图数据库知识点2:图思维方式

在上一个知识点中,我们剖析了关系型数据库、数仓湖与图数据库的差异。在本文,我们会着重介绍一个重要的概念——图思维方式(Graph-thinking)。 关于思维方式 每个人应该如何思考,他/她是如何思考的,这是一…

朝代更替中的上下五千年

《近代中国社会的新陈代谢》 关于作者 陈旭麓是著名历史学家、华东师范大学的 建校元老之一。生前是中国史学会理事、 中国现代史学会副理事长、上海地方史志 研究会副会长。著有《初中本国史》《司马迁的历史观》《近代中国社会的新陈代谢》 《浮想录》等。 关于本书 这本…

Qt / Qml 中捕获(中文)输入法事件(按下 提交)

【写在前面】 最近工作中遇到一个奇怪的问题: 本来想在 TextEdit ( QTextEdit ) 中捕获一下键盘按键按下的事件。 然而,当输入法为英文时( 正常输入字符 ),可以捕获到按键事件,但当我切换到中文时,弹出输入法选框后&am…

web前端网页设计期末课程大作业:企业网页主题网站设计——舞蹈培训11页HTML+CSS+JavaScript

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

从零开始,教你写一个串口调试助手

摘要:相信很多小伙伴都没接触过QT,如果想用QT写一个调试助手,首先是要会一点C语法。只要能看得懂C的代码,就能很快的写一个串口调试助手。 下面先推荐两个视频教程,感兴趣的可以看一看! 1、B站Jomse工 B站…

项目建议书怎么写?

Why 为什么需要项目建议书? 行政、国企、事业单位间的买卖需要按国家规定的“政府采购法”进行(个体户,私企间的买卖不需要按“政府采购法”进行),不是个人的消费,有一整套流程,《项目建议书》这套流程中的产物之一。 即国家规定,纳税人的钱不能乱花,买之前要想好买…

南卡和Snowkids电容笔哪款更值得入手?口碑最佳的国产电容笔

随着苹果推出了Apple Pencil之后后,平替电容笔的产品也随之出现了不少,其中大部分都是没很高知名度的牌子,价格也是五花八门,有便宜的也有昂贵的,让消费者有了更多的选择,对于第一次购买电容笔的小白来说但…

【Python】【期末复习题】

文章目录一、单选题(20分)二、判断题(10分)三、填空题(10分)四、问答题(共30分,6题,每题5分)五、程序题(3题,每题10分,共3…

WIFI智能电子标牌的优势

一、与市面产品对比有什么优化升级? 使用环境标准wifi通信,避免单独安装基站,减少部署的麻烦。 二、刷新一次消耗多少电量,平均每秒消耗多少? 0.09879mAh,每秒平均电流105uA。 三、充满电需要多久,充一次电可以用…

【JS020】原生JS实现AJAX

日期:2022年12月14日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方&#x…

TFT显示模组是什么?tft显示模组有什么功能?

TFT显示模组的出现,让手机屏幕成为一种刚需。但随着技术的发展,越来越多的厂商开始推出折叠屏手机,这也意味着手机屏幕的形态正在发生变化。在此背景下,折叠屏手机市场迎来爆发期。根据中国信通院数据,2020年上半年&am…

Kubernetes包管理器Helm的本质

“本质”类的文章,通常很难带流量。而且写起来非常吃力。那我为什么还要写?写作是对自己的锻炼。写作是让自己的思想更有深度的一种有效方式。如果你觉得这篇文章对你有帮助,也你麻烦你转发这篇文章,这是对我的帮助。谢谢。Kubern…

socket.io 使用protobuf 协议发送消息

一、服务端 1、maven引入netty-socketio <dependency><groupId>com.corundumstudio.socketio</groupId><artifactId>netty-socketio</artifactId><version>1.7.22</version></dependency> 2、服务端java代码 Service public…

艾美捷内皮细胞生长添加剂不同研究工具推荐

艾美捷Relia Tech内皮细胞生长添加剂可用于培养没有饲养细胞的杂交瘤细胞&#xff08;Pintus&#xff0c;1983&#xff09;。这些脑提取物中的活性因子已被鉴定为aFGF的变体&#xff08;Burgesse&#xff0c;1985&#xff09;。该ECGF产品补充了生理浓度的人rec.VEGF-A&#xf…

初识 Markdown编辑器

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

真兰仪表通过深交所注册:拟募资17.4亿 上半年净利下降27%

雷递网 雷建平 12月13日上海真兰仪表科技股份有限公司&#xff08;简称&#xff1a;“真兰仪表”&#xff09;日前通过注册&#xff0c;准备在深交所创业板上市。真兰仪表计划募资17.4亿元。其中&#xff0c;7.76亿用于真兰仪表科技有限公司燃气表产能扩建项目&#xff0c;6.12…

NFA的确定化

一、实验目的 &#xff08;1&#xff09;通过本次实验&#xff0c;加深对正则表达式、NFA、DFA及其识别的语言的理解&#xff1b; &#xff08;2&#xff09;掌握从NFA到DFA的转换&#xff0c;以及用子集法把NFA转换成DFA理论&#xff0c;编程实现将NFA&#xff08;不确定有穷…

SAP 事务代码BD20不能处理状态为51的IDoc

SAP 事务代码BD20不能处理状态为51的IDoc 对于SAP IDoc相关的事务代码比如WE02,WE19,BD87等都比较熟悉&#xff0c;因为使用的比较多。但是对于事务代码BD20却很少使用。 笔者在近期的一个项目上&#xff0c;听到客户的global team有使用该事务代码&#xff0c;设置成了一个job…

Oracle RMAN备份相关信息查询

查询 RMAN 备份状态主要是通过视图V$RMAN_STATUS 来进行&#xff0c;这个视图可以查询到 RMAN 执行的操作。 我们主要查看两列&#xff1a;OPERATION 和 STATUS。 OPERATION 的值有&#xff1a;RMAN、BACKUP、DELETE、CROSSCHECK、DELETE OBSOLETE等。 STATUS的值有&#xff1a…

中国电信携手华为建成全球首个支持5G RedCap联合测试能力的5G开放实验室

近日&#xff0c;中国电信物联网开放实验室宣布与华为共同完成了5G RedCap实验室技术验证&#xff0c;并建成了全球首个具备5G R17标准RedCap联合测试能力的开放实验室。 此次技术验证&#xff0c;为RedCap的规模商用奠定了坚实基础&#xff0c;有助于打造RedCap行业终端生态认…