当前位置: 首页 > news >正文

模块化——如何导入模块?(内置模块与自定义模块)

在Node.js中,要导入另一个模块,我们可以使用require函数。这个函数接受一个文件路径参数,并返回导入的模块。

注意:require导入包场景:内置模块、自定义模块、npm包的导入...

下面介绍内置模块与自定义模块。npm包的导入在后续的包管理工具的博客中会具体介绍

一、require使用注意事项:

(1)自己创建的模块,导入时建议写相对路径,不能省略./和../

//我把文件全写入"37.导入模块"这个文件夹里。自定义变量名one
const one=require('../37.导入模块');

(2)js和json文件导入时可不写后缀名(.js .json 可省略)

注意(补充json模块):JSON语法是javaScript语法的子集,javaScript用[]中括号来表示数组,用{}大括号来表示对象,JSON亦是如此

目录:

//一、test.js测试代码:
// 1.导入js文件。后缀名可省略。(我随便导入一个js文件)
const jstest=require('../../../04.Buffer介绍')
console.log(jstest);
// 2.导入json文件。后缀名可省略
const jsontest=require('../02/test3');
console.log(jsontest); 
// 3.当js与json文件同名读取时,优先读取js
const jsjson=require('../02/test2');
console.log(jsjson); //我是js文件
//test2.js里面:
module.exports="我是js文件";
//test2.json文件里面:
{"age": 18,"str": "json","name":"我是json文件"
}
//test3.json文件里面:
[{ "firstName":"1" , "lastName":"2" },{ "firstName":"3" , "lastName":"4" },{ "firstName":"5" , "lastName": "6" }
]

test.js的终端显示:

(3)如果导入了其他类型的文件,会以js文件进行处理

目录:

// test.js测试代码
const test=require('../03/test2.abc1');
console.log(test); //我是其他类型的文件1
const test2=require('../03/abc1');
console.log(test2); //我是其他类型的文件2
//abc1代码:
module.exports="我是其他类型的文件2"
//test2.abc1代码
module.exports="我是其他类型的文件1"

 test.js的终端显示:

(4)当你尝试导入一个文件夹作为模块或包时,Node.js 或其他相关工具会按照特定的规则去寻找该文件夹中的入口文件。

1》若导入的路径是一个文件夹,则会先检测该文件夹下的package.json文件中main属性对应的文件(如果 package.json 中的 main 属性为 "main.js",那么该文件夹的入口文件就是 main.js)。

目录:

//test.js测试代码:
// 导入文件夹
const wjj=require('./main');
console.log(wjj);  //我是一个模块
// 若package.json里面的main属性不存在或main属性里面的路径不存在,则会报错
//main文件夹下的package.json代码:{"main": "./app.js" 
}
//main文件夹下的app.js代码:
module.exports='我是一个模块';

 test.js的终端显示:

2》如果main属性或package.json文件不存在,则会检测文件夹下的名为index.json与index.json作为入口,(这里的“或”意味着它会按照这个顺序尝试这些文件名,直到找到一个存在的文件为止),如果还未找到则报错

//test.js测试代码:
const wjj2=require('./main2');
console.log(wjj2);  //{ main: './a.js' }
//main2文件夹下的index.json代码:
{"main": "./a.js" 
}

test.js终端显示:

(5)导入node.js内置模块时,直接require模块的名字即可,无需加./和../

// eg:fs模块、http模块
const fs=require('fs');

二、导入自定义模块的基本流程

(1)将相对路径转为绝对路径,定位目标文件

(2)缓存检测

(3)读取目标文件代码

(4)包裹为一个函数并执行(自执行函数)

(5)缓存模块的值

(6)返回module.exports的值

代码示例:

目录:

//show.js测试代码:(伪代码实现)function require(file) {
// (1)将相对路径转为绝对路径,定位目标文件let absolutePath=path.resolve(__dirname,file);
// (2)缓存检测
// 判断之前有没有导入过该文件,如果导入过该文件则将该文件的暴露值返回,不继续往下走了。没有就走第三步,读取目标文件往caches[absolutePath]里面去存入,存入后进入第二步,直接返回,不继续执行下面代码。
if(caches[absolutePath]){return caches[absolutePath];
}
// (3)读取目标文件代码
// 如果未导入过该文件,就读取该文件内容
const fs=require('fs');
let code=fs.readFileSync(absolutePath).toString(); //返回结果是一个buffer,用tostring()转为字符串
// (4)包裹为一个函数并执行(自执行函数)
// module、exports...这些变量在require内部模块都是有声明的:
let module={};
let exports=module.exports={}
// 执行该函数:()()
(function (exports, require, module, __filename, __dirname) {// 创建一个对象const test={name:'包裹',}// 暴露该对象// module.exports更改的是let exports=module.exports={}中的module.exports的值module.exports=test;// 输出这个函数console.log(arguments.callee.toString());})(exports, require, module, __filename, __dirname) //因为函数声明时是有形参的,所以在调用时将实参传入到第二个()里面
// (5)缓存模块的值
// 键名=键值(暴露的结果值)
// 注意:node.js内部它缓存的值不是module.exports值,而是缓存的一个模块对象。方便理解下面写成了module.exports值
caches[absolutePath]=module.exports;
// (6)返回module.exports的值
return module.exports;
}
//index.js (show.js的代码效果 ):
// 导入me.js
const me=require('./me.js'); 
//输出结果:{ name: '包裹' }  证明代码没问题,函数已执行// 再去导入me.js
const me2=require('./me.js'); 
// 输出结果还是只有上面那个{ name: '包裹' }。只输出了一次。
// 因为第一次输出结果被缓存了。第二次再去加载该模块,发现已缓存了,直接进行show.js文件的第二步,直接返回。不继续往下走了
//me.js (为了方便index.js的测试)
// 创建一个对象
const test={name:'包裹',
}
// 暴露该对象
module.exports=test;// 注意,me.js这个文件里面的代码在内部执行时是包裹在一个函数里面的
// 输出这个函数
console.log(arguments.callee.toString());
// 将返回的结果这个包裹的函数贴入show.js的第四步:(4)包裹为一个函数并执行(自执行函数)里面console.log(test); //为了方便index.js的测试,输出test

index.js终端显示:

相关文章:

模块化——如何导入模块?(内置模块与自定义模块)

在Node.js中,要导入另一个模块,我们可以使用require函数。这个函数接受一个文件路径参数,并返回导入的模块。 注意:require导入包场景:内置模块、自定义模块、npm包的导入... 下面介绍内置模块与自定义模块。npm包的…...

element-ui的按需引入报错解决:MoudleBuildFailed,完整引入和按需引入

官网: Element - The worlds most popular Vue UI framework 1.完整引入 (1)下载: npm i element-ui -S (2)引入: 在 main.js 中写入以下内容: import Vue from vue; impor…...

面向低碳经济运行目标的多微网能量互联优化调度matlab程序

微❤关注“电气仔推送”获得资料(专享优惠) 运用平台 matlabgurobi 程序简介 该程序为多微网协同优化调度模型,系统在保障综合效益的基础上,调度时优先协调微网与微网之间的能量流动,将与大电网的互联交互作为备用…...

FORM的引入与使用

FORM的引入与使用 【0】引入 ​ 表单(Form)是网页中用于收集用户输入数据的一种交互元素。通过表单,用户可以输入文本、选择选项、上传文件等操作。表单通常由一个或多个输入字段(Input Field)组成,每个字…...

酷开会员丨古偶悬疑剧《花间令》在酷开系统热播中!

酷开系统一直致力于为用户提供卓越的大屏娱乐体验。随着三月新剧《花间令》的上线,酷开系统再次展现了其在内容更新上的迅速响应能力和对高质量视听体验的不懈追求。 《花间令》的故事背景设定在一个充满神秘色彩的古代王朝,鞠婧祎饰演的女主角与刘学义饰…...

html骨架以及常见标签

推荐一个网站mdn。 html语法 双标签&#xff1a;<标签 属性"属性值">内容</标签> 属性&#xff1a;给标签提供附加信息。大多数属性以键值对的形式存在。如果属性名和属性值一样&#xff0c;可以致谢属性值。 单标签&#xff1a;<标签 属性"属…...

Vue3学习01 Vue3核心语法

Vue3学习 1. Vue3新的特性 2. 创建Vue3工程2.1 基于 vue-cli 创建项目文件说明 2.2 基于 vite 创建具体操作项目文件说明 2.3 简单案例(vite) 3. Vue3核心语法3.1 OptionsAPI 与 CompositionAPIOptions API 弊端Composition API 优势 ⭐3.2 setup小案例setup返回值setup 与 Opt…...

Spring Boot实现跨域的5种方式

Spring Boot实现跨域的5种方式 为什么会出现跨域问题什么是跨域非同源限制java后端实现CORS跨域请求的方式返回新的CorsFilter(全局跨域)重写WebMvcConfigurer(全局跨域)使用注解(局部跨域)手动设置响应头(局部跨域)使用自定义filter实现跨域 为什么会出现跨域问题 出于浏览器…...

Elasticsearch:从 ES|QL 到 PHP 对象

作者&#xff1a;来自 Elastic Enrico Zimuel 从 elasticsearch-php v8.13.0 开始&#xff0c;你可以执行 ES|QL 查询并将结果映射到 stdClass 或自定义类的 PHP 对象。 ES|QL ES|QL 是 Elasticsearch 8.11.0 中引入的一种新的 Elasticsearch 查询语言。 目前&#xff0c;它在…...

Stm32 HAL库 访问内部flash空间

Stm32 HAL库 访问内部flash空间 代码的部分串口配置申明文件main函数 在一些时候&#xff0c;需要存储一些数据&#xff0c;但是又不想接外部的flash&#xff0c;那我们可以知道&#xff0c;其实还有内部的flash可以使用&#xff0c; 需要注意的是内部flash&#xff0c;读写次数…...

线程池详解

线程池 什么是线程池&#xff1a;线程池就是管理一系列线程的资源池。 当有任务要处理时&#xff0c;直接从线程池中获取线程来处理&#xff0c;处理完之后线程并不会立即被销毁&#xff0c;而是等待下一个任务。 为什么要用线程池 / 线程池的好处&#xff1a; **降低资源消…...

mybatis(5)参数处理+语句查询

参数处理&#xff0b;语句查询 1、简单单个参数2、Map参数3、实体类参数4、多参数5、Param注解6、语句查询6.1 返回一个实体类对象6.2 返回多个实体类对象 List<>6.3 返回一个Map对象6.4 返回多个Map对象 List<Map>6.5 返回一个大Map6.6 结果映射6.6.1 使用resultM…...

数据应用OneID:ID-Mapping Spark GraphX实现

前言 说明 以用户实体为例&#xff0c;ID 类型包含 user_id 和 device_id。当然还有其他类型id。不同id可以获取到的阶段、生命周期均不相同。 device_id 生命周期通常指的是一个设备从首次被识别到不再活跃的整个时间段。 user_id是用户登录之后系统分配的唯一标识&#xff…...

第6章 6.2.3 : readlines和writelines函数 (MATLAB入门课程)

讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 在MATLAB的文本数据处理任务中&#xff0c;导入和导出文件是常…...

Matlab应用层生成简述

基础软件层 目前接触到的几款控制器&#xff0c;其厂商并没有提供simulink的基础软件库一般为底层文件被封装为lib&#xff0c;留有供调用API接口虽然能根据API接口开发基础软件库&#xff0c;但耗费时间过长得不偿失 应用层 所以可以将应用层封装为一个子系统&#xff0c;其…...

每日一题(leetcode1702):修改后的最大二进制字符串--思维

找到第一个0之后&#xff0c;对于后面的子串&#xff08;包括那个0&#xff09;&#xff0c;所有的0都能调上来&#xff0c;然后一一转化为10&#xff0c;因此从找到的第一个0的位置开始&#xff0c;接下来是&#xff08;后半部分子串0的个数-1&#xff09;个1&#xff0c;然后…...

PHP自助建站系统,小白也能自己搭建网站

无需懂代码&#xff0c;用 自助建站 做企业官网就像做PPT一样简单&#xff0c;您可以亲自操刀做想要的效果&#xff01; 自助建站是一款简单、快捷、高效的工具&#xff0c;可以帮助您制作响应式网站。我们的自助建站系统&#xff0c;将传统的编码工作转化为直观的拖拽操作和文…...

计算机视觉 | 基于 ORB 特征检测器和描述符的全景图像拼接算法

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本项目实现了基于 ORB 特征检测器和描述符的全景图像拼接算法&#xff0c;能够将两张部分重叠的图像拼接成一张无缝连接的全景图像。 文章目录 一、随机抽样一致算法二、功能实现三、代码解析四、效果展示五、完整代码 一、随机…...

Scala - 函数柯里化(Currying)

柯里化(Currying)指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数。 实例 首先我们定义一个函数: def add(x:Int,y:Int)xy 那么我们应用的时候&#xff0c;应该是这样用&#xff1a;add(1,2) 现在我们把这…...

Switch-case

Java switch case 语句 switch case 语句判断一个变量与一系列值中某个值是否相等&#xff0c;每个值称为一个分支。 语法 switch case 语句语法格式如下&#xff1a; switch(expression){case value ://语句break; //可选case value ://语句break; //可选//你可以有任意数量…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...