[node]Node.js 模块系统
[node]模块系统
- Node.js中的模块系统
- 模块的使用
- 模块的导入
- 模块的导出
- 导出多个值
- 导出默认值
- 导出可传参的函数
- 文件查找策略
- 从文件模块缓存中加载
- 从原生模块加载
- 从文件加载
Node.js中的模块系统
为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。
模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。
模块的使用
Node.js 提供了 exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象。
常用的关键字包括:
- exports
- module
- require
exports是module.exports的别名,一般要对外暴露属性或方法,就用 exports 就行,要暴露对象(类似class,包含了很多属性和方法),就用 module.exports
不建议同时使用 exports 和 module.exports。
如果先使用 exports 对外暴露属性或方法,再使用 module.exports 暴露对象,会使得 exports 上暴露的属性或者方法失效。
原因在于,exports 仅仅是 module.exports 的一个引用
模块的导入
Nodejs主要是通过require的方式导入;
模块的导出
导出多个值
module.js
//方式1
exports.a="this is a module param,";
exports.b="use exports to export param,";
exports.c="check the result";
module-use.js,使用模块:
const receive=require("./module");
console.log(receive.a,receive.b,receive.c);
终端打印:
输入:node module-use.js
输出:this is a module param, use exports to export param, check the result
导出默认值
module.js
//方式2
module.exports=["this use module.exports to export param","this is array"];
module-use.js
const receive=require("./module");
console.log(receive);
终端打印:
输入:node module-use.js
输出:[ 'this use module.exports to export param', 'this is array' ]
导出可传参的函数
module.js
//方式3
module.exports=title=>`this use module.exports to export param ,and you can pass param ${title} to this template"`;
module-use.js
const receive=require("./module");
//方式3
console.log(receive("TTTTTT"));
终端打印:
输入:node module-use.js
输出:this use module.exports to export param ,and you can pass param TTTTTT to this template
文件查找策略
Node.js 的 require 方法的文件查找策略:
Node.js 中存在 4 类模块(原生模块和3种文件模块),尽管 require 方法极其简单,但是内部的加载却是十分复杂的,其加载优先级也各自不同

模块加载的优先级:
文件模块缓存>原生模块缓存>原生模块>文件模块
优先从缓存区加载。如果缓存区没有被加载过,则调用模块的加载方式进行加载和执行
从文件模块缓存中加载
尽管原生模块与文件模块的优先级不同,但是都会优先从文件模块的缓存中加载已经存在的模块。
从原生模块加载
原生模块的优先级仅次于文件模块缓存的优先级。require 方法解析文件名之后,优先检查模块是否在原生模块列表中。以http模块为例,尽管在目录下存在一个 http/http.js/http.node/http.json 文件,require(“http”) 都不会从这些文件中加载,而是从原生模块中加载。
原生模块也有一个缓存区,同样也是优先从缓存区加载。如果缓存区没有被加载过,则调用原生模块的加载方式进行加载和执行。
从文件加载
当文件模块缓存中不存在,而且不是原生模块的时候,Node.js 会根据 require 方法传入的参数,并从文件系统中加载实际的文件,这里将详细描述查找文件模块的过程。
require方法接受以下几种参数的传递:
- http、fs、path等,原生模块
- ./mod或…/mod,相对路径的文件模块
- /pathtomodule/mod,绝对路径的文件模块
- mod,非原生模块的文件模块
在路径 Y 下执行 require(X) 语句执行顺序:
1. 如果 X 是内置模块a. 返回内置模块b. 停止执行
2. 如果 X 以 '/' 开头a. 设置 Y 为文件根路径
3. 如果 X 以 './' 或 '/' or '../' 开头a. LOAD_AS_FILE(Y + X)b. LOAD_AS_DIRECTORY(Y + X)
4. LOAD_NODE_MODULES(X, dirname(Y))
5. 抛出异常 "not found"LOAD_AS_FILE(X)
1. 如果 X 是一个文件, 将 X 作为 JavaScript 文本载入并停止执行。
2. 如果 X.js 是一个文件, 将 X.js 作为 JavaScript 文本载入并停止执行。
3. 如果 X.json 是一个文件, 解析 X.json 为 JavaScript 对象并停止执行。
4. 如果 X.node 是一个文件, 将 X.node 作为二进制插件载入并停止执行。LOAD_INDEX(X)
1. 如果 X/index.js 是一个文件, 将 X/index.js 作为 JavaScript 文本载入并停止执行。
2. 如果 X/index.json 是一个文件, 解析 X/index.json 为 JavaScript 对象并停止执行。
3. 如果 X/index.node 是一个文件, 将 X/index.node 作为二进制插件载入并停止执行。LOAD_AS_DIRECTORY(X)
1. 如果 X/package.json 是一个文件,a. 解析 X/package.json, 并查找 "main" 字段。b. let M = X + (json main 字段)c. LOAD_AS_FILE(M)d. LOAD_INDEX(M)
2. LOAD_INDEX(X)LOAD_NODE_MODULES(X, START)
1. let DIRS=NODE_MODULES_PATHS(START)
2. for each DIR in DIRS:a. LOAD_AS_FILE(DIR/X)b. LOAD_AS_DIRECTORY(DIR/X)NODE_MODULES_PATHS(START)
1. let PARTS = path split(START)
2. let I = count of PARTS - 1
3. let DIRS = []
4. while I >= 0,a. if PARTS[I] = "node_modules" CONTINUEb. DIR = path join(PARTS[0 .. I] + "node_modules")c. DIRS = DIRS + DIRd. let I = I - 1
5. return DIRS
相关文章:
[node]Node.js 模块系统
[node]模块系统 Node.js中的模块系统模块的使用模块的导入模块的导出导出多个值导出默认值导出可传参的函数 文件查找策略从文件模块缓存中加载从原生模块加载从文件加载 Node.js中的模块系统 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。 …...
【数据结构】什么是二叉树?
🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 📌二叉树的定义 📌二叉树的特点 📌特殊二叉树 📌二叉树的性质 📌二叉树的存储结构 📌二叉树…...
C#教程(四):多态
1、介绍 1.1 什么是多态 在C#中,多态性(Polymorphism)是面向对象编程中的一个重要概念,它允许不同类的对象对同一消息做出响应,即同一个方法可以在不同的对象上产生不同的行为。C#中的多态性可以通过以下几种方式实现…...
电力系统风储联合一次调频MATLAB仿真模型
微❤关注“电气仔推送”获得资料(专享优惠) 简介: 同一电力系统在不同风电渗透率下遭受同一负荷扰动时,其频率变化规律所示: (1)随着电力系统中风电渗透率的不断提高,风电零惯性响…...
《PCI Express体系结构导读》随记 —— 内容与作者简介
本书内容介绍 本书讲述了PCI与PCI Express总线相关的最为基础的内容,并介绍了一些必要的、与PCI总线相关的处理器体系结构知识,这也是本书的重点所在。深入理解处理器体系结构是理解PCI与PCI Express总线的重要基础。 读者通过对本书的学习,…...
C#字典和列表转LuaTable
C#字典和列表转LuaTable 将C#Dictionary转成luaTable将C#List转成luaTable 将C#Dictionary转成luaTable function DicToLuaTable(Dic)--将C#的Dic转成Lua的Tablelocal dic {}if Dic thenlocal iter Dic:GetEnumerator()while iter:MoveNext() dolocal k iter.Current.Keylo…...
动态内存管理(1)
目录 1. 为什么存在动态内存分配 2. 动态内存函数的介绍 2.2 calloc 2.3 realloc 3. 常见的动态内存错误 3.1 对NULL指针的解引用操作 3.2 对动态开辟空间的越界访问 3.3 对非动态开辟内存使用free释放 3.4 使用free释放一块动态开辟内存的一部分 3.5 对同一块动…...
ThunderSearch(闪电搜索器)_网络空间搜索引擎工具_信息收集
文章目录 ThunderSearch简介1 项目地址2 使用方式2.1 配置文件config.json说明2.2 构建和运行 3 使用式例 ThunderSearch简介 ThunderSearch(闪电搜索器)是一款使用多个(【支持Fofa、Shodan、Hunter、Zoomeye、360Quake网络空间搜索引擎】网络空间搜索引…...
Topaz Video AI 视频修复工具(内附安装压缩包win+Mac)
目录 一、Topaz Video AI 简介 二、Topaz Video AI 安装下载 三、Topaz Video AI 使用 最近玩上了pika1.0和runway的图片转视频,发现生成出来的视频都是有点糊的,然后就找到这款AI修复视频工具 Topaz Video AI。 一、Topaz Video AI 简介 Topaz Video…...
android内存管理机制概览
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、相关概念3.1 垃圾回收3.2 应用内存的分配与回…...
下载MySQL Connector/C++
MySQL :: Download Connector/C...
ai gpt 鸡皮剔提问技巧
请将如下AB两组信息逐个匹配上的进行同类归类,用json格式输出: A:苹果 电脑 汽车 B: 猕猴桃 笔记本 根据你的要求,逐个匹配 A 组和 B 组的元素,并以 JSON 格式输出同类的归类信息: json { "匹配信息"…...
详谈 springboot整合shiro
背景: 本章将进一步的落地实践学习,在springboot中如何去整合shrio,整个过程步骤有个清晰的了解。 利用Shiro进行登录认证主要步骤: 1. 添加依赖:首先,在pom.xml文件中添加Spring Boot和Shiro的相关依赖…...
备忘录模式(Memento)
备忘录模式(Memento Pattern)是一种行为型设计模式,允许在不破坏封装的前提下捕获并保存一个对象的内部状态,以便在以后可以将该对象恢复到原先保存的状态。 备忘录模式通常涉及以下几个角色: 发起人(Originator):创建一个含有其当前状态的备忘录对象,并可以使用备忘录…...
【RocketMQ每日一问】consumeGroup心跳内容是什么样的?
消费者组:消费者所在的消费者组名称。这个信息用于确保同一个消费者组内的消费者不会重复地消费相同的消息。MessageModel:消息模型,可能的值为集群消费或广播消费。ConsumeType:消费类型,可能的值有"主动消费&qu…...
yolov5知识蒸馏
参考代码:https://github.com/Adlik/yolov5 https://cloud.tencent.com/developer/article/2160509 yolov5间的模型蒸馏,相同结构的。 配置参数 parser.add_argument(--t_weights, typestr, default./weights/yolov5s.pt,helpinitial teacher model wei…...
HUAWEI华为笔记本电脑MateBook D 14 2022款 i5 集显 非触屏(NbDE-WFH9)原装出厂Windows11系统21H2
链接:https://pan.baidu.com/s/1-tCCFwZ0RggXtbWYBVyhFg?pwdmcgv 提取码:mcgv 华为MageBookD14原厂WIN11系统自带所有驱动、出厂状态主题壁纸、Office办公软件、华为电脑管家、华为应用市场等预装软件程序 文件格式:esd/wim/swm 安装方式…...
微服务-springcloud(eureka实践, nacos实践)
Spring 体系图 版本关系 eureka 实践 1 父工程依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.14</version> </parent> <dependencyManage…...
Hadoop入门学习笔记——五、在虚拟机中部署Hive
视频课程地址:https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接:https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd5ay8 Hadoop入门学习笔记(汇总) 目录 五、在虚拟机中部署Hive5.1. 在node1虚拟机安装MySQL5.2.…...
用Nest 实现大文件分片上传,加速工作效率神器
文件上传是常见需求,只要指定 content-type 为 multipart/form-data,内容就会以这种格式被传递到服务端: 服务端再按照 multipart/form-data 的格式提取数据,就能拿到其中的文件。 但当文件很大的时候,事情就变得不一样…...
航拍小目标检测入门必看:YOLOv8 VisDrone实战第一阶段,基线mAP从32%提升至58%
本文是YOLOv8 VisDrone航拍目标检测全系列实战的第一阶段,基于我3年智慧城市、无人机安防项目的一线落地经验,针对VisDrone航拍场景最核心的「小目标密集、尺度变化大、类别分布不均、遮挡严重」四大痛点,完整拆解从0到1搭建基线模型的全流程。 本文全程配套VisDrone数据集…...
FluentEmail 模板系统完全指南:从文件、嵌入资源到多文化模板
FluentEmail 模板系统完全指南:从文件、嵌入资源到多文化模板 【免费下载链接】FluentEmail All in one email sender for .NET. Supports popular senders (SendGrid, MailGun, etc) and Razor templates. 项目地址: https://gitcode.com/gh_mirrors/fl/FluentEm…...
GitLab vs Gitea 深度解析:如何选择适合你的代码托管方案?
1. 核心定位与适用场景对比 第一次接触代码托管平台时,我和很多开发者一样在GitLab和Gitea之间纠结。经过三年在不同规模团队的实际使用,我发现这两个工具就像瑞士军刀和美工刀的关系——没有绝对的好坏,关键看你要切什么。 GitLab更像是个&q…...
掌握8个wxappUnpacker实战技巧:小程序解包与代码还原完全指南
掌握8个wxappUnpacker实战技巧:小程序解包与代码还原完全指南 【免费下载链接】wxappUnpacker 项目地址: https://gitcode.com/gh_mirrors/wxappu/wxappUnpacker 为什么90%的小程序开发者都需要解包工具? 在小程序开发过程中,开发者…...
VideoAgentTrek-ScreenFilter在CAD教学中的应用:自动筛选设计演示视频重点
VideoAgentTrek-ScreenFilter在CAD教学中的应用:自动筛选设计演示视频重点 每次上完CAD软件课,你是不是都有这样的感觉?老师演示了两个小时,鼠标点得飞快,步骤一个接一个。你录了屏,打算课后复习ÿ…...
Intel Broadwell处理器选型指南:IBRS、noTSX这些后缀到底该怎么选?
Intel Broadwell处理器选型实战:从安全特性到性能优化的深度解析 在2014年问世的Intel Broadwell架构,作为第五代酷睿处理器的重要里程碑,至今仍在特定应用场景中保持着独特的价值。不同于简单的参数对比,本文将带您深入理解不同…...
(ubuntu黑屏)Z890M + U7 265KF + RTX 5070 Ti 安装 Ubuntu 22.04.5 实战记录(网卡 + 显卡驱动全解)
本文记录了在技嘉 Z890M Intel Core Ultra 7 265KF RTX 5070 Ti 新平台上,成功安装 Ubuntu 22.04.5 并解决网卡、显卡驱动问题的完整过程,适合同类配置参考。一、硬件环境组件型号主板技嘉 Z890M 小雕(带 WiFi)CPUIntel Core Ul…...
GPU vs TPU vs FPGA:三大AI芯片实战对比,哪个更适合你的项目?
GPU vs TPU vs FPGA:三大AI芯片实战对比,哪个更适合你的项目? 当你在深夜调试模型时,是否曾被"OOM"错误折磨得抓狂?或是看着电费账单上那个惊人的数字陷入沉思?选择正确的AI加速芯片,…...
完整指南:为什么选择WeChatMsg开源工具解决你的微信聊天记录备份与分析难题
完整指南:为什么选择WeChatMsg开源工具解决你的微信聊天记录备份与分析难题 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitH…...
基于边缘形状的快速模板匹配:旋转操作与金属工件测试
基于边缘形状的快速模板匹配,有现成代码支持旋转操作 基于C和opencv编写的。 并且可以提供部分金属工件数据进行测试。在计算机视觉领域,模板匹配是一项常用的技术,用于在一幅图像中寻找与给定模板最匹配的区域。今天咱聊聊基于边缘形状的快速…...
